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();
このコードは機能していないようです。よく検索しました。また、複数の行を返す場合があります。それで、複数の行を返す場合でも、すべての結果を取得するにはどうすればよいですか?
結果を適切に取得する方法は次のとおりです
$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 から直接答えが得られたことに気付いていただければ幸いです。最初に行っておくべき場所です。
コメントから、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
値を編集する必要はありませんが、少し長いクエリを作成します。