データベースクエリは、PHPアプリケーションを開発する際の最も一般的な操作の1つです。特に大量のデータ量を扱う場合、クエリ効率を改善する方法が焦点です。 PHPでは、 MySQLI拡張機能を使用してデータベースクエリを実行することが非常に一般的であり、 MySQLI :: STMT_INITは、前処理ステートメントを実行し、クエリの効率とセキュリティを改善するのに役立つ優れたツールです。
この記事では、 MySQLI :: STMT_INITを使用して効率的なキーワードファジー検索を実現する方法を紹介します。
PHPでは、 MySQLIはMySQLI :: STMT_INITメソッドを提供して、前処理ステートメントを初期化します。これは、SQLクエリがプリコンパイルされ、バインディングパラメーターによって実行されることを意味し、SQL注入のリスクを回避します。前処理ステートメントは、セキュリティを提供するだけでなく、同じクエリを実行するときにパフォーマンスを向上させます。
$stmt = $mysqli->stmt_init();
同じように、キーワードはSQLでファジークエリを実装するためによく使用されます。通常、特定のパターンに一致する文字列を見つけるために使用されます。ファジークエリでは、 %は任意の文字(ゼロ文字を含む)を表し、 _は単一の文字を表します。
例えば:
SELECT * FROM users WHERE username LIKE '%admin%';
このクエリは、管理者を含むユーザー名のすべてのレコードを返します。
次に、 MySQLI :: STMT_INITを使用して、効率的なキーワードファジー検索を実装する方法を示します。データベースからユーザーを検索する必要があると仮定します。検索条件には、ユーザー名が特定のキーワードが含まれていることです。
まず、データベースに接続する必要があります。
$mysqli = new mysqli("localhost", "username", "password", "database");
// 接続を確認してください
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
mysqli :: stmt_initを使用して、前処理ステートメントオブジェクトを初期化します。
$stmt = $mysqli->stmt_init();
次に、ファジークエリのように使用します。私たちは使用しますか? SQL注入の問題を回避するためのパラメーターの代わりに:
$sql = "SELECT * FROM users WHERE username LIKE ?";
ユーザーが入力した検索キーワードにバインドする必要がありますか? SQLステートメントで、同様のクエリに%を追加して、ファジーマッチを示します。
$searchKeyword = "%$keyword%"; // ユーザーが入力したキーワード,前後にパーセンテージサインを追加します
$stmt->prepare($sql);
$stmt->bind_param("s", $searchKeyword); // "s" 文字列のバインディングを表すパラメーター
クエリを実行して結果を取得します。
$stmt->execute();
$result = $stmt->get_result();
クエリの結果を取得し、 get_result()を介して処理します。たとえば、結果をブラウザに出力します。
while ($row = $result->fetch_assoc()) {
echo "User ID: " . $row['id'] . " - Username: " . $row['username'] . "<br>";
}
クエリが完了したら、データベース接続を閉じることを忘れないでください。
$stmt->close();
$mysqli->close();
MySQLI :: STMT_INITおよび前処理ステートメントを使用することにより、SQL注入を効果的に防止し、クエリパフォーマンスを改善できます。特にFuzzyクエリにLikeを使用する場合、事前処理ステートメントは、ユーザーが入力したデータからクエリを分離し、セキュリティと効率を向上させることができます。
さらに、一部のシナリオではクエリのようにクエリが非常に役立つが、ファジークエリは大量のデータを処理する際にパフォーマンスの問題を引き起こす可能性があることに注意する価値があります。データベースのインデックス作成またはその他の最適化測定を通じて、クエリ効率をさらに改善することを検討することができます。