登录

php - 使用pdo执行sql的insert操作出现灵异现象

在php的swoole websocket服务端的onMessage回调函数中执行这条命令,结果数据库里面的内容完全和sql指定的不符合。

下面是这张表的DDL

CREATE TABLE `gobang_rooms` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `black_uid` int(10) unsigned DEFAULT NULL,
  `black_seconds` mediumint(5) unsigned DEFAULT NULL COMMENT '黑方读秒',
  `white_uid` int(10) unsigned DEFAULT NULL,
  `white_seconds` mediumint(5) unsigned DEFAULT NULL,
  `last_player` tinyint(3) unsigned DEFAULT NULL,
  `create_time` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

下面是update函数的实现

function update($sql, $params) {
    // var_dump($params);
    $pdo = new PDO(dsn, user, pass);
    $stmt = $pdo->prepare($sql);
    foreach ($params as $key => $value) {
        $stmt->bindParam($key + 1, $value);
    }
    return $stmt->execute();
}

这个update函数我在别的地方执行一切正常,就在这里执行出问题了,结果和语句传入的值不符合,请问这是怎么回事?

# PHP
天蓬老师天蓬老师2146 天前370 次浏览

全部回复(3) 我要回复

  • 怪我咯

    怪我咯2017-04-11 09:48:01

    在循环里要慎用bindParam,你看下手册函数原型,

    可以看到,第二个参数是引用,也就是你传递的这那参数,之前的值都会变成最近一次传参的那个值。

    你上图里绑定的,自然都会变成123456, last_player会溢出,所以是255了。

    鸟哥的一篇博文里有提到过这个问题: http://www.laruence.com/2012/...

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 09:48:01

    foreach ($params as $key => $value) {
        $stmt->bindParam($key + 1, $value);
    }
    return $stmt->execute();
    
    //其实可以改写成下面1句,简洁又没有&引用的困扰
    return $stmt->execute($params);
    //http://php.net/manual/zh/pdostatement.execute.php
    //$params是一个元素个数和将被执行的 SQL 语句中绑定的参数一样多的数组.
    //$params所有的值作为 PDO::PARAM_STR 对待.

    回复
    0
  • 高洛峰

    高洛峰2017-04-11 09:48:01

    foreach里的$value改为&$value

    回复
    0
  • 取消回复发送