PHPでは、 MySQLI拡張機能は、データベースと対話するための複数の方法を提供します。その中で、 mysqli :: stmt_init関数は、準備されたステートメントを初期化するために使用できる非常に便利なツールです。この関数を使用すると、ストアドプロシージャをより安全かつ効率的に実行し、返された結果を処理できます。この記事では、mysqli :: stmt_initを使用してストアドプロシージャを実行し、結果を処理する方法について詳しく説明します。
まず、データベースがストアドプロシージャを作成していることを確認してください。ユーザーのIDに基づいてユーザーの名前と電子メールを返すget_user_infoと呼ばれるストアドプロシージャがあるとします。ストアドプロシージャのSQLコードは次のとおりです。
DELIMITER $$
CREATE PROCEDURE get_user_info(IN user_id INT)
BEGIN
SELECT name, email FROM users WHERE id = user_id;
END$$
DELIMITER ;
PHPでは、 mysqli :: stmt_initを使用してステートメントオブジェクトを初期化し、そのオブジェクトを介してストアドプロシージャを実行します。
まず、 MySQLI拡張機能を使用してデータベースに接続する必要があります。
<?php
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'test_db';
$mysqli = new mysqli($host, $username, $password, $database);
if ($mysqli->connect_error) {
die('接続に失敗しました: ' . $mysqli->connect_error);
}
?>
mysqli :: stmt_init関数は、 mysqli_stmtオブジェクトの初期化に使用されます。この例では、ステートメントオブジェクトを初期化して、 get_user_infoストアドプロシージャを実行します。
<?php
// ステートメントオブジェクトを初期化します
$stmt = $mysqli->stmt_init();
// 初期化が成功したかどうかを確認してください
if (!$stmt) {
die('ステートメントを初期化できません: ' . $mysqli->error);
}
?>
ステートメントオブジェクトが初期化されたら、準備方法を使用して、ストアドプロシージャのSQLステートメントを準備できます。ストアドプロシージャを実行する場合、パラメーターを渡します(この例では、ユーザーID):
<?php
// ストアドプロシージャを準備します
$query = "CALL get_user_info(?)";
if (!$stmt->prepare($query)) {
die('ストアドプロシージャの準備に失敗しました: ' . $stmt->error);
}
// バインドパラメーター
$user_id = 1; // ユーザーを照会したいとします ID のために 1 情報
$stmt->bind_param("i", $user_id); // "i" 急行 integer タイプ
// ストアドプロシージャを実行します
if (!$stmt->execute()) {
die('ストアドプロシージャの実行に失敗しました: ' . $stmt->error);
}
?>
ストアドプロシージャが実行された後、結果セットは通常返されます。ここでは、 get_resultメソッドを使用して実行結果を取得し、処理する必要があります。
<?php
// クエリの結果を取得します
$result = $stmt->get_result();
if ($result->num_rows > 0) {
// データの各行を出力します
while ($row = $result->fetch_assoc()) {
echo "名前: " . $row['name'] . "<br>";
echo "電子メール: " . $row['email'] . "<br>";
}
} else {
echo "関連する記録は見つかりませんでした";
}
?>
最後に、ステートメントオブジェクトとデータベース接続を閉じることを忘れないでください。
<?php
$stmt->close();
$mysqli->close();
?>
生産環境では、適切なエラー処理を確保することが重要です。 prepere 、 execute 、およびget_resultメソッドの返品値をチェックすることで、エラーをキャッチできます。さらに、トライキャッチステートメントを使用して例外をキャッチして、エラーが発生したときにプログラムが優雅に終了できることを確認することもできます。
mysqli :: stmt_init関数を介して、ストアドプロシージャを安全かつ効果的に実行し、パラメーターバインディングと結果セットを介して関数を取得して、返されたデータを柔軟に処理できます。準備されたステートメントを使用すると、SQLインジェクションを防ぐだけでなく、実行効率も向上します。うまくいけば、この記事がMySQLI拡張機能をよりよく理解して使用して、ストアドプロシージャを操作するのに役立つことを願っています。