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 строки?

2 33

2 ответа:

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

$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";
}

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


Обновлено

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

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

$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, но это делает запросы немного длиннее.