2015-03-14 3 views
0

Итак, во-первых, я знаю, что при подготовке заявления LIKE с PDO есть определенные правила. Я уже просмотрел их, и я стараюсь следовать им, но запрос неизменно возвращает результаты, хотя я знаю, что сам запрос является законным (клиент командной строки MySQL корректно работает с запросом).У вас возникли проблемы с подготовленным заявлением PDO и «LIKE»

Это для школьного проекта; Мне нужно сделать сайт с бэкэндом MySQL/php для вымышленного книжного магазина.

У меня есть класс в php-скрипте под названием DBConnection. Он находится в отдельном пространстве имен (отсюда обратные косые черты для объектов и функций PDO). Это часть его:

<?php 
    class DBConnection { 
     // ... 

     public function prepAndExecute($sql, $args) { 
      try { 
       $stmt = $this->conn->prepare($sql); 

       for($i = 1; $i <= count($args); $i++) { 
        $stmt->bindValue($i, $args[$i-1], \PDO::PARAM_STR); 
       } 

       $stmt->execute(); 

       return $stmt; 
      } catch(\PDOException $e) { 
       return false; 
      } 
     } 
    } 
?> 

Фактический запрос MySQL Я пытаюсь запустить:

SELECT ISBN, Title, Author, Price FROM Book WHERE Title LIKE "%rich%"; 

Моя попытка с помощью PDO подготовленное заявление, чтобы запустить это на сайте:

<?php 
    // based on the search form from the previous page 
    // (all values are set correctly by the form, already tested) 
    $criteria = $_POST["searchCriteria"]; // "Title" (from a <select> element) 
    $term = $_POST["searchTerm"]; // "rich" (from the text box) 

    $conn = new DBConnection(); // uses namespace correctly, just didn't 
           // include here for simplicity 
    $sql = "SELECT ISBN, Title, Author, Price FROM Book WHERE ? LIKE ?"; 

    $stmt = $conn->prepAndExecute($sql, array($criteria, "%" . $term . "%")); 
    // I have also tried $term = "%" . $term . "%", still no luck 

    echo $stmt->rowCount(); // 0 
?> 

Я выполнил указанный выше запрос в командной строке MySQL и получил 1 результат, как ожидалось. Я знаю, что класс/функции работают, потому что я использую эту же функцию для запуска всех других запросов SELECT и INSERT, и у меня не было проблем, пока я не попытаюсь запустить этот оператор LIKE.

Я что-то не так? Потому что я дважды и тройной проверил все и мог поклясться, что делаю это правильно. ?

+0

Я считаю, что вы не можете использовать '$ Criteria' /' ' 's имена столбцов – Class

+0

благодарю вас @class - я просто воткнул переменную для имени столбца и работает , –

ответ

0

http://php.net/manual/en/pdostatement.bindparam.php

$sth = $dbh->prepare('SELECT * FROM `users` WHERE `firstname` LIKE :keyword'); 
// Put the percentage sing on the keyword 
$keyword = "%".$keyword."%"; 
// Bind the parameter 
$sth->bindParam(':keyword', $keyword, PDO::PARAM_STR); 
+0

Спасибо за ответ, проблема в том, что я использовал? для имени столбца, которое ему не нравится. –

Смежные вопросы