MySQL проблема с «Like» Query - PullRequest
       12

MySQL проблема с «Like» Query

0 голосов
/ 13 сентября 2011

У меня проблема с моим запросом, который включает в себя оператор "like".

Вот мой код:

function get_number_of_locations_by_zip_tag($zip, $tag) 
{
        global $db;
        $query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (tags LIKE :tag OR name LIKE :tag) LIMIT :start, :number";

        $statement = $db->prepare($query);
        $statement->bindValue(':zip', $zip);
        $statement->bindValue(':tag',  '%'.$tag.'%', PDO::PARAM_STR);
        $statement->execute();
        $locations = $statement->fetchAll(); //fetch();
        $statement->closeCursor();
        return $locations;
}

Я ожидаю, что запрос вернет строки, в которых тег соответствует полю 'name' или 'tags', но вместо этого он вернет только те строки, в которых совпадают теги.

Если я переключу запрос на:

$query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (name LIKE :tag OR tags LIKE :tag) LIMIT :start, :number";

Тогда результат будет противоположным: он будет возвращать только те строки, в которых совпадает поле имени, и игнорирует поле тегов.

Кто-нибудь видит что-то не так с этим запросом? Когда я начал разработку, он работает так, как я ожидал, на моем сервере XAMPP в Windows, но когда я переключил все на свой сервер LAMP, этот запрос перестал работать правильно.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Возможно, вы захотите изменить:

tags LIKE :tag OR name LIKE :tag

до

tags LIKE ':tag' OR name LIKE ':tag'

Или измените свой код:

  $statement->bindValue(':tag',  '\'%'.$tag.'%\'', PDO::PARAM_STR);

Как и выражение должно быть в кавычках .eg name LIKE '% john%'

0 голосов
/ 16 декабря 2011

Что ж, я решил эту проблему через несколько недель после того, как спросил, и подумал, что уже опубликовал свое решение, но, наверное, нет ..

Согласно всей документации, которую я прочитал, кажется, что ответ ДхрувПатака должен был сработать, но по какой-то причине он не сработал для меня. Вместо этого я вроде как обманул и сделал это:

$query = "SELECT * FROM location WHERE zip = :zip AND disabled = 0 AND (name LIKE :tag OR tags LIKE :tag2) LIMIT :start, :number";

Вместо того, чтобы пытаться использовать одно значение связывания дважды, я разделил его на две переменные, а затем связал их обе с одним и тем же значением:

$statement->bindValue(':tag',  '%'.$tag.'%', PDO::PARAM_STR);
$statement->bindValue(':tag2',  '%'.$tag.'%', PDO::PARAM_STR);

Если кто-то действительно столкнулся с этой проблемой, надеюсь, это решит и ее для вас.

...