日志
发现了个PDO的BUG
发布者:星野天河 发布时间:08-06-28
查看次数:5 评论数:0
标签:BUG(4) FCK(2) PDO(2) 代码高亮(1)
一直以来,我在用FCK的代码高亮插件贴长长的一串代码时,常常会出现(20%机率)错误,排除了转义过滤的问题仍然没有解决,然后烦了我就把问题推到高亮插件上。
不过问题拖着不是办法,终于仔细查了一遍,发现只要是单引号跟着问题号('?)总是会出错,放到navicat(我很少用phpmyadmin)中执行却没错,最后终于怀疑到db类了(pdo封闭类)
PHP代码
- /**
- * 扩展PDO::exec(),增加占位符功能
- * @param string $sql
- * @param int|bool 失败返回false.update和delete成功返回影响的行数,insert返回插入的id
- * BUG: 如果用绑定参数的方法,只要字段值中包含单引号紧接着问号“'?”必定出错,难道是PDO的BUG?
- */
- public function exec($sql)
- {
- $rs = $this->prepare($sql);
- $params = func_get_args();
- $paramsCnt = count($params);
- for ($i=1; $i<$paramsCnt; $i++) {
- $rs->bindParam($i, $params[$i]);
- }
- $retval = $rs->execute();
- if ($retval === false) return false;
- if(strpos(strtolower($sql), 'insert') !==false) {
- return $this->lastInsertId();
- }
- if(DEBUG) self::debug($sql);
- return $retval;
- }
上面是原来的exec方法,可以对使用(动态参数)占位符模式增强安全性,也可以不用,但是任何sql语句只要有单引号加问号就出错,问题不明,只好改成暂时不使用占位符模式
PHP代码
- public function exec($sql)
- {
- $retval = parent::exec($sql);
- if ($retval === false) return false;
- if(strpos(strtolower($sql), 'insert') !==false) {
- return $this->lastInsertId();
- }
- if(DEBUG) self::debug($sql);
- return $retval;
- }
不知道各位使用pdo的大侠是否也遇到类似问题?
评论列表
评论表单
妮称

