この記事では主に、php での mysql ステートメントのプリコンパイルについて説明します。前処理ステートメントは、複数の同一の SQL ステートメントをより高い実行効率で実行するために使用されます。 前処理されたステートメントは次のように機能します:
前処理: SQL ステートメントのテンプレートを作成し、データベースに送信します。予約された値にはパラメータ「?」が付けられます。例:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
SQL ステートメント テンプレートでのデータベースの解析、コンパイル、クエリの最適化、および出力せずに結果を保存します。
実行: 最後に、アプリケーションバインド値がパラメータ (「?」マーク) に渡され、データベースがステートメントを実行します。パラメータ値が異なる場合、アプリケーションはステートメントを複数回実行できます。
SQL ステートメントを直接実行する場合と比較して、プリペアド ステートメントには 2 つの主な利点があります:
プリプロセスされたステートメントは分析時間を大幅に短縮し、(ステートメントは複数回実行されますが) クエリを 1 つだけ作成します。
パラメータをバインドするとサーバーの帯域幅が削減され、ステートメント全体ではなくクエリのパラメータのみを送信する必要があります。
前処理されたステートメントは、パラメーター値が送信された後に異なるプロトコルが使用され、データの正当性が保証されるため、SQL インジェクションに非常に役立ちます。
DML (挿入、削除、更新) および DQL (選択) ステートメントの前処理コードを以下に示します
DML 前処理:
//预处理1--操作数据库 $mysqli = new mysqli('localhost','root','mayi1991','mysqldemo'); $mysqli->query('set names utf8'); //创建预编译对象 $mysqli_stmt = $mysqli->prepare("insert account (balance,name) values (?,?)"); //绑定参数 $balance = 122; $name = '小白'; $mysqli_stmt->bind_param("ds",$balance,$name); //$mysqli_stmt->bind_param("ds",122,'小白'); //这样是错误的,我也不知道为啥子 //执行 返回boolean值 $mysqli_stmt->execute();
DQL 前処理:
//预处理2--查询数据库 //创建预处理对象 $mysqli_stmt = $mysqli->prepare('select name,balance from account where id < ?'); //绑定参数 $id = 5; $mysqli_stmt->bind_param('i',$id); //执行 $mysqli_stmt->execute(); //绑定结果集 $mysqli_stmt->bind_result($name,$balance); //这里的变量指向的是内存地址 //输出结果集 while($mysqli_stmt->fetch()){ echo "$name--$balance"; }
関連する推奨事項:
mysql ステートメントを使用してデータ テーブルを作成するための詳細なチュートリアル
以上がphp での mysql ステートメントのプリコンパイルと理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。