$stmt->execute(array($searchtype, '\'%'.$searchterm.'%\''));
Это не так, как работают параметризованные запросы.Вставленные параметры уже действуют как буквальные строки, вам не нужно добавлять разделители кавычек вокруг них или экранировать их (в этом вся суть), и если вы попытаетесь, вы буквально сравниваете со строкой single-quote-searchterm-single-quote.
Следовательно, если вы (как я подозреваю) намереваетесь сравнить определенный столбец с литеральной строкой, вы не параметризуете имя столбца.В данный момент вы сравниваете литеральную строку с другой литеральной строкой, поэтому она всегда будет истинной или всегда ложной независимо от данных в строке!
Так что я думаю, что вы, вероятно, имеете в виду:
$query= "SELECT * FROM books WHERE $searchtype LIKE ?";
$like= "%$searchterm%";
$stmt->execute(array($like));
Естественно, вы должны быть очень осторожны, так как $searchtype
хорошо известно, чтобы избежать SQL-инъекций.Обычно вы сравниваете его со списком допустимых имен столбцов перед его использованием.
(Кроме того: - это способ помещения произвольных строк в имя схемы, которые вы можете использовать для столбца, но это раздражает, варьируется в зависимости от базы данных, и для него нет стандартной функции перехода. В MySQL вы используете обратную косую черту, символ обратной кавычки, кавычки и обратную косую черту и окружаете имя обратными кавычками. В ANSI SQL вы используете двойные кавычки сdoubled-double-quotes изнутри. В SQL Server вы используете квадратные скобки. Однако в действительности вам редко приходится делать что-либо из этого, потому что на самом деле вы всегда хотите разрешить только несколько предопределенных имен столбцов.)
(Другойв сторону: если вы хотите разрешить $searchterm
значения с буквальным процентом, подчеркиванием или обратным слешем в - так, чтобы пользователи могли искать «100%», не сопоставляя любую строку с 100
в - у вас естьиспользовать явный escape-символ, что немного утомительно:)
$query= "SELECT * FROM books WHERE $searchtype LIKE ? ESCAPE '+'";
$like= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $searchterm);
$stmt->execute(array("%$like%"));