#php #mysql #prepared-statement
#php #mysql #подготовленная инструкция
Вопрос:
Я пытаюсь создать этот подготовленный оператор:
$sql = "SELECT * FROM entries WHERE";
$sql .= " title LIKE ? OR title LIKE ? OR title LIKE ? OR title LIKE ?";
$sql .= " OR content LIKE ? OR content LIKE ? OR content LIKE ? OR content LIKE ?";
$q = $this->db->prepare($sql);
$one = $this->term;
$two = "%" . $this->term;
$three = $this->term . "%";
$four = "%" . $this->term . "%";
$q->bind_param("ssssssss", $one, $two, $three, $four, $one, $two, $three, $four);
$q->execute();
$this-> db — это мой объект подключения mysqli
$this-> term — это строка, предоставленная пользователем.
Я не получаю никаких сообщений об ошибках, как из базы данных. Я знаю, что инструкция sql работает, я запустил ее с помощью $this-> db-> query(), и все получилось нормально. Когда я запускаю ее с подготовленной инструкцией, она возвращается без результатов. Есть предложения?
Комментарии:
1. Почему все тесты ищут ‘sth’, ‘%sth’, ‘sth%’ или ‘%sth%’? Это дало бы те же результаты, что и при поиске только ‘%sth%’, поэтому вы можете оставить свой запрос просто как
SELECT * FROM entries WHERE title LIKE '%sth%' OR content LIKE '%sth%'
2. Карлос: Спасибо, что указали на это. Я просмотрел еще кое-какую документацию по поиску по подстановочным знакам, и она действительно соответствует чему угодно (включая нулевые совпадения). Спасибо.
Ответ №1:
Чтобы использовать подстановочный знак в подготовленном операторе, вам нужно использовать CONCAT в вашем sql-операторе. База данных позаботится о том, чтобы объединить знаки процента с вашим поисковым запросом.
Предполагая, что вам нужен подстановочный знак в начале или конце вашего поискового запроса, ваш sql должен выглядеть следующим образом:
$sql = "SELECT * FROM entries WHERE title LIKE CONCAT('%', ?, '%') OR content LIKE CONCAT('%', ?, '%')";
Комментарии:
1. Вы можете , но вам не обязательно. Можно добавить подстановочные знаки на стороне PHP, как это было сделано в OP
Ответ №2:
Я не смог заставить его работать с подготовленным оператором. Я перешел к mysqli-> query() и экранировал строку пользователя. Карлос, спасибо за помощь в исправлении моего запроса.