日志

发现了个PDO的BUG

发布者:星野天河  发布时间:08-06-28  查看次数:5 评论数:0
标签:BUG(4)   FCK(2)   PDO(2)   代码高亮(1)  

一直以来,我在用FCK的代码高亮插件贴长长的一串代码时,常常会出现(20%机率)错误,排除了转义过滤的问题仍然没有解决,然后烦了我就把问题推到高亮插件上。
不过问题拖着不是办法,终于仔细查了一遍,发现只要是单引号跟着问题号('?)总是会出错,放到navicat(我很少用phpmyadmin)中执行却没错,最后终于怀疑到db类了(pdo封闭类)

PHP代码
  1. /** 
  2.      * 扩展PDO::exec(),增加占位符功能 
  3.      * @param string    $sql 
  4.      * @param int|bool  失败返回false.update和delete成功返回影响的行数,insert返回插入的id 
  5.      * BUG: 如果用绑定参数的方法,只要字段值中包含单引号紧接着问号“'?”必定出错,难道是PDO的BUG? 
  6.      */  
  7.     public function exec($sql)  
  8.     {  
  9.         $rs = $this->prepare($sql);  
  10.         $params = func_get_args();  
  11.         $paramsCnt = count($params);  
  12.         for ($i=1; $i<$paramsCnt$i++) {  
  13.             $rs->bindParam($i$params[$i]);  
  14.         }  
  15.         $retval = $rs->execute();  
  16.         if ($retval === false) return false;  
  17.         if(strpos(strtolower($sql), 'insert') !==false) {  
  18.             return $this->lastInsertId();  
  19.         }  
  20.         if(DEBUG) self::debug($sql);  
  21.         return $retval;  
  22.     }  

上面是原来的exec方法,可以对使用(动态参数)占位符模式增强安全性,也可以不用,但是任何sql语句只要有单引号加问号就出错,问题不明,只好改成暂时不使用占位符模式

PHP代码
  1. public function exec($sql)  
  2. {  
  3.     $retval = parent::exec($sql);  
  4.     if ($retval === false) return false;  
  5.     if(strpos(strtolower($sql), 'insert') !==false) {  
  6.         return $this->lastInsertId();  
  7.     }  
  8.     if(DEBUG) self::debug($sql);  
  9.     return $retval;  
  10. }  

不知道各位使用pdo的大侠是否也遇到类似问题?

评论列表

评论表单

妮称