Проблема привязки параметра Mysqli

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

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

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

Когда я повторяю это, они подходят идеально. Поэтому, если я введу "а" в форме, я буду отображать "% 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();

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

3 ответа

$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();

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам