我看书上说如果采用prepare 和execute 方法,还可以防止SQL 注入等攻击。因为所有的变量都会
被自动转义。
然后我在表单中输入df'dfdf",结果不能输入数据。
SQL语句:INSERT INTO cms_manage( admin_user, admin_pass, level, last_time ) VALUES( 'df'dfdf"', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', '6', NOW() )
错误信息:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dfdf"', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', ' at line 9
当我把数据df'dfdf"用mysql_real_escape_string函数转义后,就成功了,到底prepare 和execute能不能自动转义了,是不是还要手动转义。
被自动转义。
然后我在表单中输入df'dfdf",结果不能输入数据。
SQL语句:INSERT INTO cms_manage( admin_user, admin_pass, level, last_time ) VALUES( 'df'dfdf"', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', '6', NOW() )
错误信息:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dfdf"', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', ' at line 9
当我把数据df'dfdf"用mysql_real_escape_string函数转义后,就成功了,到底prepare 和execute能不能自动转义了,是不是还要手动转义。
不过你只贴出了 sql 指令,并没用有 prepare 和 execute 方法
protected function _aud($_sql){
$_stmt=$this->execute($_sql);
return $_stmt->rowCount();
}
//执行SQL
private function execute($_sql){
try{
$_stmt=$this->_pdo->prepare($_sql);
$_stmt->execute();
} catch (PDOException $e){
exit('SQL语句:'.$_sql.'<br/>错误信息:'.$e->getMessage());
}
return $_stmt;
}
以上就是我的prepare和execute方法,没有错啊,数据查询和增删修都可以,就是不能自动转义。
$_stmt=$this->_pdo->prepare($_sql);
$_stmt->execute(); //这句似乎是多余的?PDO的设计者为什么要这么设计
// PDO会对 execute()和bindParam() 的参数转义,而不是对prepare的参数智能的转义
// 正确使用的例子
$_sql = "SELECT * FROM `hello` WHERE `world` = ?"; // ? 周围不用加引号,PDO会帮你加上
$_stmt=$this->_pdo->prepare($_sql);
$_stmt->execute( array("你好'世界") );
http://php.net/manual/en/pdostatement.execute.php