MySQL的預(yù)編譯是指在創(chuàng)建數(shù)據(jù)庫對象時就將指定的SQL語句編譯完成复濒,這時SQL語句已經(jīng)被MySQL解析、審查尊搬,所以相對傳統(tǒng)的執(zhí)行方式(每處理一個SQL語句就要解析SQL語句等恐、檢查語法和語義),預(yù)編譯方式在執(zhí)行數(shù)據(jù)插入捌归、更新或者刪除操作的時候,執(zhí)行效率更高岭粤。
預(yù)編譯語句優(yōu)點:
- 提高運行效率
- 防止SQL注入:因為預(yù)編譯時預(yù)先已經(jīng)將SQL的結(jié)構(gòu)確定,在執(zhí)行SQL語句時特笋,結(jié)構(gòu)不會發(fā)生改變剃浇。
PHP中MySQL的預(yù)編譯具體操作方式
- 編譯統(tǒng)一的結(jié)構(gòu)
/*假定已經(jīng)完成數(shù)據(jù)庫初始化操作巾兆,數(shù)據(jù)庫對象名:$pdo*/
$sql = "insert into team values (null, :team_name)";
$PDOStatement = $pdo->prepare($sql);
- 綁定數(shù)據(jù)到中間編譯結(jié)果
$PDOStatement->bindValue(':team_name','國安');
- 執(zhí)行
$result = $PDOStatement->execute();
完整操作代碼
$username = 'root';
$password = '1234abcd';
$driver_options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
);
$pdo = new PDO($dsn, $username, $password, $driver_options);
//1.編譯統(tǒng)一的結(jié)構(gòu)
$sql = "insert into team values (null, :team_name)";
$stmt = $pdo->prepare($sql);
$data_list = array(
array('name'=>'國安'),
array('name'=>'綠地'),
array('name'=>'恒大'),
array('name'=>'建業(yè)'),
array('name'=>'魯能'),
array('name'=>'申花'),
);
foreach($data_list as $row) {
//2.綁定數(shù)據(jù)到中間編譯結(jié)果
$stmt->bindValue(':team_name', $row['name']);
//3.執(zhí)行
$result = $stmt->execute();
var_dump($result);
}