Проблема привязки параметра Mysqli - PullRequest
4 голосов
/ 01 октября 2009

Мне нужен дополнительный набор глаз на этот. Любая помощь будет оценена. Это очень простой поисковый запрос, но по какой-то причине я не могу найти ошибку. Ну, я знаю, где ошибка. Я просто не могу пройти мимо. В любом случае .....

Я беру поисковое значение из переменной POST, задаю эту переменную, а затем устанавливаю переменную столбца следующим образом ...

$term = "'%".$_POST['searchTerm']."%'";
$field = "columnName";

Когда я повторяю это, они подходят идеально. Поэтому, если я введу «a» в форме, я буду отображать «% a%» и columnName.

Затем я готовлю запрос и связываю параметры следующим образом ...

$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");
$suquery->bind_param('ss', $field, $term);
$suquery->execute();

Результат всегда возвращает 0 строк. Когда я играю с этим, я обнаружил, что ни один связанный параметр не работает правильно, несмотря на то, что он отражается, как и должно быть. Например, когда я изменяю запрос так, чтобы столбец был жестко запрограммирован и связывал только поисковый термин ...

$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();

Я все еще получаю ноль возвращаемых строк. Это говорит мне о том, что хотя $ field отображает эхо как «% a%», что-то по-прежнему отключено. Я действительно в замешательстве. Точно так же, когда я жестко связываю поисковый термин и связываю столбец ....

$suquery=$dbCon->prepare("select * from Table where ? LIKE '%a%'");
$suquery->bind_param('s', $field);
$suquery->execute();

Я получил слишком много возвращенных строк. Это на самом деле извлекает строки из таблицы, где значение в любом столбце содержит букву «а». Таким образом, ни столбец, ни термин не являются обязательными. Mayday!

Ответы [ 3 ]

6 голосов
/ 02 октября 2009
$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");

Не будет работать, как ожидалось. Будет переведено как:

SELECT * from table WHERE 'columnName' LIKE '%a%'

, который возвращает все строки, потому что 'columnName' содержит 'a'. 'columnName' - это строка, а не фактическое имя столбца.

Ваша вторая попытка верна, за исключением того, что у вас есть дополнительные кавычки в сроке. При использовании параметров вам не нужны кавычки. Решение:

$term = "%".$_POST['searchTerm']."%";
$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();
2 голосов
/ 01 октября 2009

РЕДАКТИРОВАТЬ: Исходный ответ был основан на ложном предположении (предполагается, PDO вместо MySQL). Соответственно изменил ответ.

Похоже, вам не разрешено использовать подстановку параметров для имен столбцов. Из mysqli :: prepare документации:

Примечание: маркеры разрешены только в определенные места в операторах SQL. За Например, они разрешены в VALUES () список оператора INSERT (указать значения столбца для строки), или в сравнении с колонкой в Предложение WHERE для сравнения значение. Тем не менее, они не допускаются для идентификаторов (таких как таблица или имена столбцов), в списке выбора, который имена столбцов, которые будут возвращены Оператор SELECT или ...

Возможно, вы захотите проверить это, жестко закодировав имя столбца / поля в запросе и просто заменив значение сравнения через параметр ...

0 голосов
/ 15 октября 2009

Просто чтобы прояснить для любого, кто наткнулся на это. Проблема была довольно простой, но это было достаточно странно, что выследить ее было медведем. Хенрик был частично прав. При разборе переменной $ term для использования в моем операторе LIKE я делал следующее:

$term = "'%".$_POST['searchterm']."%'";

Хенрик указал, что мне не нужны одинарные кавычки в скобках для моей переменной. Это верно, если кто-то просто готовит и выполняет запрос как:

$query=$connection->prepare("select * from DATABASE where $field like '$term'");
$query->execute();

Это прекрасно работает. Однако я на самом деле использовал $ term в качестве связанного параметра, что означало, что мне действительно требовались одинарные кавычки, поскольку сам оператор требует, чтобы поисковый термин выглядел так: «% term%». Требуются одинарные кавычки. Вы получите синтаксическую ошибку, если попытаетесь поместить одинарные кавычки вокруг заполнителя вопросительного знака для связанного параметра, и если вы не поместите одинарные кавычки в переменную, которую вы используете в качестве связанного параметра, результат всегда будет 0 строк найдено. Короче говоря, для всех, кто сталкивался с этим .... если вы отправляете запрос напрямую, вам не нужны одинарные кавычки, поскольку вы можете поместить их непосредственно в оператор выбора. Если вы используете связанные параметры, у вас должны быть одинарные кавычки как часть переменной, чтобы запрос работал правильно.

...