所以我试图用我自己的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
我的查询功能:
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 回答
这是一个有趣的问题 - 原因是参数在
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); }