подготовленная инструкция php mysqli с использованием подстановочных знаков

#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() и экранировал строку пользователя. Карлос, спасибо за помощь в исправлении моего запроса.