繁体   English   中英

MySQL查询返回奇怪的错误

[英]MySQL query returning weird error

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

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

(!)PDOException:SQLSTATE [22007]:无效的日期时间格式:1366不正确的整数值:C:\\ wamp64 \\ www \\ LVWeb \\ Core \\ Database \\ database.mysql-pdo第1行第'user_id'列的'Google Chrome'第44行的.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'] =字符串

这是一个有趣的问题 - 原因是参数在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); } 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); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM