PDO insert update select操作应该选择哪个方式

<?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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值