Мне нужен дополнительный набор глаз на этом. Любая помощь будет оценена. Это очень простой поисковый запрос, но по какой-то причине я не могу найти ошибку. Ну, я знаю, где ошибка. Я просто не могу пройти мимо него. Так или иначе…..
Я беру значение поиска из переменной 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();
Я все равно получаю нулевые возвращенные строки. Это говорит мне, что даже если поле $ echoes как «% a%», все еще отключено. На самом деле я нахожусь в недоумении. Аналогично, когда я жестко прокладываю поисковый запрос и свяжу столбца ….
$suquery=$dbCon->prepare("select * from Table where ? LIKE '%a%'"); $suquery->bind_param('s', $field); $suquery->execute();
Я получаю слишком много возвращенных строк. Он фактически вытягивает строки из таблицы, где значение в любом столбце содержит букву «a». Таким образом, ни столбцы, ни термин не являются обязательными. Первое мая!
$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();
EDIT: исходный ответ был основан на ложном предположении (предполагаемый PDO вместо mysqli). Соответственно, был изменен ответ.
Похоже, вам не разрешено использовать подстановку параметров для имен столбцов. Из документации 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 строк. Короче говоря, для тех, кто сталкивается с этим …. если вы отправляете запрос непосредственно без необходимости одинарных кавычек, так как вы можете поместить их непосредственно в оператор select. Если вы используете связанные параметры, вы должны иметь одинарные кавычки как часть переменной, чтобы запрос работал правильно.