Проблема с LIKE MySQL запросом - PullRequest
1 голос
/ 08 июля 2011

У меня есть следующий запрос MySQL, который я выполняю со страницы .php

SELECT * FROM servers WHERE name LIKE '%$value%'

, который при выполнении выбирает 0 строк (однако запрос выполняется успешно, поэтому я не могу использовать mysql_error () для отладки). Когда я запускаю запрос в PHPMyAdmin, он выбирает соответствующие строки. Другие запросы, такие как

SELECT * FROM servers

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

Ответы [ 3 ]

0 голосов
/ 08 июля 2011

Редактировать: Вот кое-что, что предлагает улучшение, основанное на ответе Марека ниже.Пожалуйста, ознакомьтесь с комментариями относительно практики помещения переменных непосредственно в запросы и рассмотрите возможность использования подготовленных операторов.Как бы то ни было, здесь все идет.

  1. PHP подставляет переменные внутри строк с двойными кавычками, но не внутри строк с одинарными кавычками.
  2. Один символ кавычки рассматривается как обычный символстрока, разделенная другим.

Соединив это, вы можете написать:

$q = "SELECT * FROM servers WHERE name LIKE '%$value%'"; //Fine

Вы не можете написать:

$p = 'SELECT * FROM servers WHERE name LIKE "%$value%"'; //Broken!

$q работает, потому чтоэто строка в двойных кавычках, а апострофы - просто обычные символы.$p не работает, потому что это строка в одинарных кавычках.

Как указывает GoodFather ниже, вы также можете сказать ${value}, чтобы избежать двусмысленности с окружающей строкой, например $r = "ABC${value}DEF";.

0 голосов
/ 08 июля 2011

Ожидаете ли вы регистрозависимый или нечувствительный к регистру запрос? Бьюсь об заклад, без учета регистра, так как вы ожидаете результатов, но не видите их. Взгляните на параметры сортировки по умолчанию в вашей базе данных или на конкретные параметры сортировки таблицы и убедитесь, что они заканчиваются на _ci, каким бы он ни был.

0 голосов
/ 08 июля 2011

Вам действительно нужно взглянуть на выполнение этого запроса более безопасно.Это также поможет с вашей проблемой.В существующем состоянии вы уязвимы для внедрения SQL-кода.Посмотрите примеры из руководства по PHP, чтобы узнать, как это сделать правильно:

http://php.net/manual/en/function.mysql-query.php

РЕДАКТИРОВАТЬ : Из ваших комментариев вы упомянули, что уже позаботились острока правильно, что здорово.Приведенный ниже код должен исправить вашу проблему.

Например, вы можете переписать оператор запроса (в PHP) следующим образом:

$query = sprintf("SELECT * FROM servers WHERE name LIKE '%". mysql_real_escape_string($value) . "%'");

Это очистит ваш код и также обработаетпроблема с вашим оператором LIKE не работает должным образом.

Вот еще одна хорошая статья на эту тему:

http://joshhighland.com/blog/2008/07/06/php-sprintf-sql-like/

...