pdo::quote方法js转义字符后不能写入数据库问题

ThinkPHP的PDO对PostgreSQL的字符串转义有问题 - ThinkPHP框架
PostgreSQL在插入 “I'm prayingpanda”时,使用两个单引号对单引号进行转义,即“I''m prayingpanda”,而非“I\'m prayingpanda”
然后在Pdo.class.php中,第439行:
对PGSQL进行的转义是addslashes(),这样就导致含有单引号的数据无法被插入数据库。
应该对PGSQL使用和ORACLE相同的处理,使用str_ireplace(&'&, &''&, $str);
解决方案://&ThinkPHP\Library\Think\Db\Driver\Pdo.class.php
&public&function&escapeString($str)&{
&&&&&&&&&switch($this-&dbType)&{
&&&&&&&&&&&&//case&'PGSQL':
&&&&&&&&&&&&case&'MSSQL':
&&&&&&&&&&&&case&'SQLSRV':
&&&&&&&&&&&&case&'MYSQL':
&&&&&&&&&&&&&&&&return&addslashes($str);
&&&&&&&&&&&&case&'PGSQL':
&&&&&&&&&&&&case&'IBASE':&&&&&&&&&&&&&&&&
&&&&&&&&&&&&case&'SQLITE':
&&&&&&&&&&&&case&'ORACLE':
&&&&&&&&&&&&case&'OCI':
&&&&&&&&&&&&&&&&return&str_ireplace(&'&,&&''&,&$str);
&&&&}我的PGSQL版本为
PostgreSQL 9.3.2 on i686-pc-linux-gnu, compiled by gcc (GCC) 4.4.7
(Red Hat 4.4.7-3), 32-bit
祈福的熊猫
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。PHP中的pdo,如果已使用预处理prepare,是否就不需要转义?_百度知道
PHP中的pdo,如果已使用预处理prepare,是否就不需要转义?
自从开始使用pdo,就一直使用 预处理prepare如果在防止sql注入的层面,我是否已足够?还需要使用PDO::quote吗?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
使用 PDO, 用参数型式,而不是拼接 SQL 是不需要转意的。比如$pdo&=&new&PDO(...);$pdo-&setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,&PDO::FETCH_ASSOC);$stmt&=&$pdo-&prepare('select&*&from&user&where&username&=&:username');if&($stmt-&execute(array(&&&&':username'&=&&'xidada'))){&&&&$data&=&$stmt-&fetchAll();&&&&print_r($data);}else{&&&&echo&'没有查询到数据';}
采纳率:80%
为您推荐:
其他类似问题
pdo的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。13添加评论分享收藏感谢收起&?php
//id IN ($ids) 占位符生成
function app_place_holders(array $params) {
//http://php.net/manual/zh/pdostatement.execute.php
return implode(',', array_fill(0, count($params), '?'));
// var_export(app_in_pdo(array(1, 3, 5)));
function app_in_pdo(array $ids) {
global $app;
$db = app_db();
$table = $app['db_prefix'].'post';
$place_holders = app_place_holders($ids);
$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
$stmt = $db-&prepare($sql);
$stmt-&execute($ids); //所有id都当做字符串处理,值传递.
return $stmt-&fetchAll(PDO::FETCH_ASSOC);
// var_export(app_in_mysqli(array(1, 3, 5))); 要求使用PHP内置的mysqlnd驱动
function app_in_mysqli(array $ids) {
global $app;
$db = app_mysql();
$table = $app['db_prefix'].'post';
$place_holders = app_place_holders($ids);
$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
$stmt = $db-&prepare($sql);
//MySQLi自动化"引用绑定"参数(因为mysqli的execute不像pdo的execute支持参数数组传递,所以显得麻烦些)
$params = array_merge(array(str_repeat('s', count($ids))), $ids); //array('sss', 1, 3, 5)
foreach($params as $k =& $v) { $params[$k] = &$params[$k]; } //因为bind_param要求传递引用.
call_user_func_array(array($stmt, 'bind_param'), $params); //相当于$stmt-&bind_param('sss', $ids[0], $ids[1], $ids[2]);
$stmt-&execute();
return $stmt-&get_result()-&fetch_all(MYSQLI_ASSOC);
用tail -f /path/to/mysqld/general_log查看MySQL的SQL日志可见:Prepare SELECT * FROM `app_post` WHERE `id` IN (?,?,?)
Execute SELECT * FROM `app_post` WHERE `id` IN ('1','3','5')
Close stmt
赞同 3添加评论分享收藏感谢收起1添加评论分享收藏感谢收起

我要回帖

更多关于 空格的转义字符 的文章

 

随机推荐