所以我试图用我自己的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']
]);
所以我测试了每个变量,看看它们是否是正确的类型:
答案 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);
}