ホームページ  >  記事  >  バックエンド開発  >  php での mysql ステートメントのプリコンパイルと理解

php での mysql ステートメントのプリコンパイルと理解

小云云
小云云オリジナル
2018-03-10 11:49:172850ブラウズ


この記事では主に、php での mysql ステートメントのプリコンパイルについて説明します。前処理ステートメントは、複数の同一の SQL ステートメントをより高い実行効率で実行するために使用されます。 前処理されたステートメントは次のように機能します:

  1. 前処理: SQL ステートメントのテンプレートを作成し、データベースに送信します。予約された値にはパラメータ「?」が付けられます。例:

  2. INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  3. SQL ステートメント テンプレートでのデータベースの解析、コンパイル、クエリの最適化、および出力せずに結果を保存します。

  4. 実行: 最後に、アプリケーションバインド値がパラメータ (「?」マーク) に渡され、データベースがステートメントを実行します。パラメータ値が異なる場合、アプリケーションはステートメントを複数回実行できます。

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(&#39;select name,balance from account where id < ?&#39;);
//绑定参数
$id = 5;
$mysqli_stmt->bind_param(&#39;i&#39;,$id);
//执行
$mysqli_stmt->execute();
//绑定结果集
$mysqli_stmt->bind_result($name,$balance);  //这里的变量指向的是内存地址
//输出结果集
while($mysqli_stmt->fetch()){
    echo "$name--$balance";
}

関連する推奨事項:

mysql ステートメントの詳細な紹介

MySQL ステートメントのロックを実装する方法

mysql ステートメントを使用してデータ テーブルを作成するための詳細なチュートリアル

以上がphp での mysql ステートメントのプリコンパイルと理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。