Поскольку вы используете подготовленные операторы, вам не нужны одинарные кавычки вокруг выражения.Измените ваш код, удалив эти кавычки, на
$query="SELECT * FROM posts WHERE title LIKE ?";
$keywordArray[0]="%".$keywordArray[0]."%";
for($i=1;$i<$n;$i++){
$keywordArray[$i]="%".$keywordArray[$i]."%";
$query.=" OR title LIKE ?";
}
Он рассматривал кавычки как часть значения внутри параметра.Таким образом, вы бы получили SQL что-то вроде
SELECT * FROM posts WHERE title LIKE '\'%Something%\''
, и очевидно, что это не будет совпадать, потому что значения в базе данных не будут иметь одинарные кавычки в начале и конце в большинстве случаев.
С изменениями он должен переводиться в SQL следующим образом:
SELECT * FROM posts WHERE title LIKE '%Something%'
Это связано с тем, что процесс параметризации автоматически выполняет для вас задание цитирования и экранирования - это один из способов защиты от внедрения SQL.атаки (а также, между прочим, против синтаксических ошибок, вызванных ошибочными / неэкранированными кавычками).
PS Если запрос когда-либо был отправлен на этот код, где вообще не было предоставлено никакого ключевого слова, то код будетсбой, поскольку предполагается, что в $keywordArray[0]
всегда есть значение.Подумайте о том, чтобы изменить это, чтобы проверить, было ли предоставлено ключевое слово, или просто зациклить весь массив, и, если ключевые слова не переданы, просто не добавляйте в запрос предложение WHERE вообще.