<?php
//pdo执行exec语句并使用addslashes函数去除sql注入问题 执行insert命令更好一些
//pdo执行大长型str语句时建议使用exec + addslashes函数用于防止sql注入攻击 如:insert table_name (field_1,field_2,field_3) values (field_value_1,field_value_2,field_value_3),(field_value_1,field_value_2,field_value_3),(field_value_1,field_value_2,field_value_3); 和 update table_name set field_1=field_value_1,field_2=field_value_2 where 多个条件
//为什么大长型str语句使用exec + addslashes函数
//因为 1、如果这条语句执行失败,则可以直接回滚到从未插入状态,保证了数据的完整性。2、因为是一条语句,更加节省带宽
//其他情况请使用prepare方法
//因为 1、效率影响不大 2、对sql注入保证性更强一点
//在prepare情况下 建议使用execute(array(':绑定名' => ':绑定值'))
//pdo执行
// addslashes('');
set_time_limit(0);
$dsn = "mysql:host=localhost;dbname=test";
$arr = array();
for($i = 97;$i < 121;$i++){
$letter = chr($i);
$str = '';
for($j = 0;$j < 25;$j++){
$str .= $letter.'\'"';
$arr[] = array($str,strrev($str));
}
}
function test($str){
$str = addslashes($str);
return $str;
}
$suc_times = 0;
$sum_time = 0;
$start_time = microtime(true);
foreach($arr as $v){
$db = new PDO($dsn, 'root', '');
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
$sql = 'select * from test where `text`="'.test($v[0]).'"';
$stmt = $db->query($sql);
$r = $stmt->fetchAll();
if($r){
$suc_times++;
}
unset($db);
}
$sum_time = microtime(true) - $start_time;
var_dump($suc_times,$sum_time);
exit;
$db->exec('update `test` set `str` = null');
$suc_times = 0;
$sum_time = 0;
$start_time = microtime(true);
foreach($arr as $v){
$db = new PDO($dsn, 'root', '');
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
$stmt = $db->prepare('select * from test where `text`=:text');
$r = $stmt->execute(array(':text'=>$v[0]));
$r = $stmt->fetchAll();
$stmt = null;
if($r){
$suc_times++;
}
unset($db);
}
$sum_time = microtime(true) - $start_time;
var_dump($suc_times,$sum_time);
// $db->exec('update `test` set `str` = null'); 3.5732040405273
PDO insert update select操作应该选择哪个方式
最新推荐文章于 2021-05-02 22:40:06 发布