预处理好处:编译一次多次执行,用来解决一条SQL语句多次执行的问题,提高了执行效率。
预处理语句:
prepare 预处理名字 from 'sql语句'
执行预处理
execute 预处理名字 [using 变量]
mysql中
---首先修改执行符
mysql> delimiter //
mysql> prepare stmt from 'select * from stuinfo where stuage>? and stusex=?' //
mysql> set @age=20;
-> set @sex='男';
-> execute stmt using @age,@sex //
1、位置占位符
<?php
/*
pdo预处理 位置占位符
*/
$dsn='mysql:host=localhost;port=3306;dbname=datanews;charset=utf8';
$pdo=new PDO($dsn,'root','123456');
$sql="insert into bank values(?,?)";
$stmt=$pdo->prepare($sql);
$cards=[
['1003',500],
['1004',400]
];
foreach($cards as $card){
//绑定参数,并执行预处理
//方法一:只能放变量
/*
$stmt->bindParam(1,$card[0]);//占位符的位置从1开始
$stmt->bindParam(2,$card[1]);
$stmt->execute();
*/
//方法二可以放值
/*
$stmt->bindValue(1,$card[0]);
$stmt->bindValue(2,$card[1]);
$stmt->execute();
*/
//方法三 如果占位符的顺序和数组的顺序一致,可以直接传递数组
$stmt->execute($card);
}
2、参数占位符
<?php
/*
pdo预处理 参数占位符
*/
$dsn='mysql:host=localhost;port=3306;dbname=datanews;charset=utf8';
$pdo=new PDO($dsn,'root','123456');
$sql="insert into bank values(:p1,:p2)";//:p1:p2是参数占位符
$stmt=$pdo->prepare($sql);
$cards=[
['p1'=>'1005','p2'=>500],
['p1'=>'1006','p2'=>400]
];
foreach($cards as $card){
//绑定参数,并执行预处理
//方法一:只能放变量
/*
$stmt->bindParam('p1',$card['p1']);//占位符的位置从1开始
$stmt->bindParam('p2',$card['p2']);
$stmt->execute();
*/
//方法二可以放值
/*
$stmt->bindValue('p1',$card['p1']);
$stmt->bindValue('p2',$card['p2']);
$stmt->execute();
*/
//方法三 但数组的下标和参数名一致的时候就可以直接传递关联数组
$stmt->execute($card);
}