首页 文章

MySQL查询返回奇怪的错误

提问于
浏览
1

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

(!)致命错误:未捕获PDOException:SQLSTATE [22007]:无效的日期时间格式:1366不正确的整数值:C:\ wamp64 \ www \ LVWeb \ Core \ Database \中第1行的'user_id'列的'Google Chrome'第44行的数据库.mysql-pdo.php(!)PDOException:SQLSTATE [22007]:无效的日期时间格式:1366不正确的整数值:C:\ wamp64 \ www \ LVWeb第1行第'user_id'列的'Google Chrome'第44行的\ 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']
]);

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

  • $ session = string

  • $ response ['ID'] =整数

  • GetIp()= string

  • GetOs()= string

  • GetBrowser()['name'] =字符串

1 回答

  • 0

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

    即在 foreach 循环中,你说如下:"let :ses_id be bound to whatever is in $val now",然后在下一次迭代 - "let :user_id be bound to whatever is in $val now"等 . 在循环结束时,所有参数都有效地绑定到同一个东西 - 变量 $val . 这个 Value 包含什么? 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); }

相关问题