预处理语句有以下两个特点:
1.效率高
2.安全性好
为什么说预处理语句效率高呢?
预处理语句就好比一个模板,比如下面的一串插入语句:
insert into admin(id,username,password) values(?,?,?);
问号表示不固定的值,我们只需要输入值然后批量执行模板即可。
为什么说其安全性好呢?
因为其已经生成一个模板了,已经编译好了(PS:还没有执行)所以纵使黑客执行sql攻击命令也是无效的。因为已经编译了,输入再多的恶意sql语句也是徒劳。
开始一个真实案例:
<?php try{ $pdo = new pdo("mysql:host=localhost;port=3306;dbname=test","root",""); }catch(PDOException $e){ echo $e->getmessage(); } $pdo->setattribute(PDO::ATTR_AUTOCOMMIT,0); echo "PDO对象创建成功.<br />"; try{ $sql = $pdo ->prepare("insert into users(gold,user,password) values(?,?,?)");//准备一条sql语句。prepare英译为预备。但未执行。 //我们需要将三个问号分别绑定参数。 $sql ->bindparam(1,$gold);//bind英译为绑定,param译参数。 $sql ->bindparam(2,$user); $sql ->bindparam(3,$password); $gold = 9; $user = 'user'; $password = 'awdohaw'; $sql -> execute();//需要再插入那么直接再复制18行到20行代码即可。 $gold = 10; $user = 'hacker-def'; $password = 'while'; $sql -> execute();//execute即执行该条sql命令。 }catch(PDOException $e){ echo $e->getmessage(); exit; } echo "成功执行sql语句.<br />"; $pdo->setattribute(PDO::ATTR_AUTOCOMMIT,1); ?>
下图为执行后的效果:
如果我们要插入更多的自然都是没有问题的。所以效率上面会好的很多。sqli也有预处理功能但是麻烦的多。