web-dev-qa-db-ja.com

php mysqliプリペアドステートメントLIKE

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();

このコードは機能していないようです。よく検索しました。また、複数の行を返す場合があります。それで、複数の行を返す場合でも、すべての結果を取得するにはどうすればよいですか?

38
user2493164

結果を適切に取得する方法は次のとおりです

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

マニュアル here および here から直接答えが得られたことに気付いていただければ幸いです。最初に行っておくべき場所です。

60
roninblade

更新しました

コメントから、LIKEワイルドカード文字(_および%)はデフォルトでParamaterisedクエリでエスケープされないため、予期しない結果を引き起こす可能性があります。

したがって、「LIKE」ステートメントを使用する場合は、この 'negative lookahead' Regexを使用して、これらの文字がエスケープされるようにします。

$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値を編集する必要はありませんが、少し長いクエリを作成します。

30
Martin