php mysqli подготовил заявление как

Как я могу с помощью mysqli сделать запрос с LIKE и получить все результаты?

Это мой код, но он не работает:

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);
$stmt->fetch();

Этот код, кажется, не работает. Я много искал. Также может возвращаться более 1 строки. Итак, как я могу получить все результаты, даже если он возвращает более 1 строки?

3 ответа

Решение

Вот как правильно получить результат

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);

while ($stmt->fetch()) {
  echo "Id: {$id}, Username: {$username}";
}

или вы также можете сделать:

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM)) {
  foreach ($row as $r) {
    print "$r ";
  }
  print "\n";
}

Надеюсь, вы понимаете, что я получил ответ прямо из руководства здесь и здесь, куда вы должны были пойти в первую очередь.


обновленный

Из комментариев выясняется, что LIKE подстановочные знаки (_ а также %) не экранируются по умолчанию при запросах Paramaterised и поэтому могут привести к неожиданным результатам.

Поэтому при использовании операторов "LIKE" используйте это регулярное выражение "отрицательный взгляд", чтобы убедиться, что эти символы экранированы:

$param = preg_replace('/(?<!\\\)([%_])/', '\\\$1',$param);

В качестве альтернативы приведенному выше ответу вы также можете использовать функцию MySQL CONCAT:

$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();

Это означает, что вам не нужно редактировать свой $param значение, но делает для чуть более длинных запросов.

Ответ явно устарел, вам даже не нужно использовать bind_param.

      $querySql    = "SELECT * FROM table WHERE columnName LIKE :likeKeyWord";
$likeKeyWord = "%". $keyWord ."%";
$pdoStm      = $this -> db -> prepare($querySql);
$pdoStm -> execute([':likeKeyWord' => $likeKeyWord]);
return $pdoStm -> fetchAll();
Другие вопросы по тегам