PHPでは、 MySQLI拡張機能は、MySQLデータベースと対話する強力な機能を提供します。 STMT_INITとBIND_PARAMは、準備されたステートメントとパラメーターバインディングに一般的に使用される2つの関数です。ただし、多くの開発者は、特にバインディングパラメータータイプの場合、これら2つの機能を使用する場合、一般的なエラーを発生しやすいです。この記事では、これらの関数を正しく使用する方法、特に潜在的なエラーを回避するためにタイプ文字列を正しい使用方法を確保する方法に飛び込みます。
mysqli :: stmt_initメソッドは、クエリとバインディングパラメーターを実行できるmysqli_stmtオブジェクトを返す前処理ステートメントを初期化するために使用されます。 BIND_PARAMメソッドは、前処理ステートメント(通常? )のプレースホルダーに変数をバインドするために使用されます。バインディングの場合、各パラメーターのデータ型を指定する必要があります。
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("INSERT INTO users (name, age) VALUES (?, ?)")) {
$name = "John Doe";
$age = 25;
// バインドパラメーター
$stmt->bind_param("si", $name, $age); // 's' 文字列を表します,'i' 整数を示します
// 実行ステートメント
$stmt->execute();
echo "Record inserted successfully!";
} else {
echo "Error: " . $stmt->error;
}
$stmt->close();
$mysqli->close();
?>
この例では、 bind_paramを使用して、 $ nameと$ ageの変数をSQLクエリのプレースホルダーにバインドします。型文字列「si」は、 $ nameが文字列であり、 $ ageは整数( i )であることを意味します。
bind_paramの最初のパラメーターは、各バインドされたパラメーターのタイプを指定する文字列です。一般的なタイプは次のとおりです。
I :整数
D :ダブル精度フローティングポイント番号(ダブル)
S :文字列(文字列)
B :バイナリデータ(BLOB)
間違ったタイプのバインディングにより、クエリの障害またはデータがデータベースに誤って挿入される可能性があるため、各パラメーターの正しいタイプを指定することを確認することが重要です。
$stmt->bind_param("si", $age, $name); // 間違い,順序が間違っています
この例では、 $ ageはタイプ「i」で使用する必要がある整数であり、 $ nameは型で使用する文字列であるため、バインディング順序が間違っています。
タイプの不一致: mySQLは、文字列タイプの変数を整数型プレースホルダーにバインドしようとする場合、または整数を文字列型プレースホルダーにバインドしようとする場合、エラーを返します。各パラメーターのデータ型を理解し、 bind_paramの正しい型文字列を使用してください。
bind_paramを使用する前に変数を初期化: bind_paramを使用して変数をバインドする前に、すべての変数を初期化したことを確認してください。初期化された変数により、PHPがエラーを報告します。
SQL注入の防止:前処理されたステートメントとパラメーターバインディングを使用すると、SQL注入を防ぐだけでなく、データ型の正しさも保証します。このようにして、MySQLは、ユーザーが入力したデータが予想されるタイプを満たしていない場合でも、正しく処理できます。
実際の開発では、パラメーターとしてURLやその他のデータをSQLクエリに渡すことがよくあります。データの一貫性を確保するために、すべてのドメイン名をM66.NETに置き換えるURLを処理する例を以下に示します。