MySQL查询返回奇怪的错误

时间:2016-08-09 21:39:27

标签: php mysql pdo

所以我试图用我自己的mysql类(建在pdo之上)将一些数据插入到数据库中,但我发现了一些奇怪的错误

  

(!)致命错误:未捕获PDOException:SQLSTATE [22007]:无效   datetime格式:1366不正确的整数值:' Google Chrome'对于   栏' user_id'在第1排   第44行的C:\ wamp64 \ www \ LVWeb \ Core \ Database \ database.mysql-pdo.php

     

(!)PDOException:SQLSTATE [22007]:无效的日期时间格式:1366   整数值不正确:' Google Chrome'对于列' user_id'在第1行   第44行的C:\ wamp64 \ www \ LVWeb \ Core \ Database \ database.mysql-pdo.php

表格结构:http://prntscr.com/c3pgzi

我的查询功能:

public function Query($query, $vars = []){
        $Statement = $this -> con -> prepare($query);

        if(is_array($vars))
            foreach($vars AS $key => $val){
                if(is_string($val))
                    $Statement->bindParam($key, $val, PDO::PARAM_STR);
                else if(is_integer($val))
                    $Statement->bindParam($key, $val, PDO::PARAM_INT);
            }

        return $Statement->execute();
    }

我尝试插入数据的部分:

$a = "INSERT INTO sessions (ses_id, user_id, ip, os, browser) VALUES
    (:ses_id, :user_id, :ip, :os, :browser)";

$this->DB->Query($a, [
    ':ses_id'   =>  $session,
    ':user_id'  =>  $response['ID'],
    ':ip'       =>  GetIp(),
    ':os'       =>  GetOS(),
    ':browser'  =>  GetBrowser()['name']
]);

所以我测试了每个变量,看看它们是否是正确的类型:

  1. $ session = string
  2. $ response [' ID'] =整数
  3. GetIp()= string
  4. GetOs()= string
  5. GetBrowser()[' name'] = string

1 个答案:

答案 0 :(得分:0)

这是一个有趣的问题 - 原因是参数在PDOStatement->bindParam()中被绑定为引用。

即。在foreach循环中,你说如下:" let:ses_id绑定到现在$ val中的任何内容",然后在下一次迭代中 - " let:user_id绑定到任何现在是$ val"等等。在循环结束时,所有参数都有效地绑定到同一个东西 - 变量$val。这个价值包含什么? PHP分配给它的最后一件事 - $vars[':browser']

因此$Statement->execute()尝试插入一条记录,其中所有字段都等于浏览器的名称。

您需要将foreach的代码更改为以下内容: foreach($vars AS $key => $val){ if (is_string($val)) $Statement->bindParam($key, $vars[$key], PDO::PARAM_STR); else if(is_integer($val)) $Statement->bindParam($key, $vars[$key], PDO::PARAM_INT); }