Php 日期时间值不正确:';2018年&x27年;以字符串形式传递有效日期时的列

Php 日期时间值不正确:';2018年&x27年;以字符串形式传递有效日期时的列,php,mysql,datetime,bindparam,mysql-error-1292,Php,Mysql,Datetime,Bindparam,Mysql Error 1292,今天我遇到了一个非常奇怪的问题。传递的日期显然与bind_param传递给我的查询的日期不同 数据库结构: | id varchar(16)自动递增|日期|创建日期时间|日期|更新日期时间| 当前该表包含有效数据: |1 | 2018-01-25 16:53:40 | 2018-01-25 16:53:40 | 现在我尝试执行一个准备好的UPDATE语句: UPDATE `table1` SET `date_created` = ?, `date_updated` = ? WHERE `id`

今天我遇到了一个非常奇怪的问题。传递的日期显然与bind_param传递给我的查询的日期不同

数据库结构:

| id varchar(16)自动递增|日期|创建日期时间|日期|更新日期时间|

当前该表包含有效数据:

|1 | 2018-01-25 16:53:40 | 2018-01-25 16:53:40 |

现在我尝试执行一个准备好的
UPDATE
语句:

UPDATE `table1` SET `date_created` = ?, `date_updated` = ? WHERE `id` = ?
我将绑定以下数据:

["date_created"]=> string(19) "2018-01-25 16:53:40"
["date_updated"]=> string(19) "2018-01-25 17:02:57"
["id"]=> int(1) 1
但不管什么原因,我都会出错

1292:字符串(67)“第1行“date_created”列的日期时间值:“2018”不正确”

我不明白为什么
bind_params
execute
应该将有效日期缩短为仅限年份

编辑:根据请求编辑PHP代码。它是一个自动生成查询并执行查询的函数。我添加了一个
var\u dump
s“应该执行”查询的部分

公共函数executeUpdateQuery(){
//更新现有记录
$where['id']=1;
$array['date_created']=self::getTimeStamp();
$array['date_updated']=self::getTimeStamp();
如果(!$this->updateRecord($where,$array)){
打印(
错误:
); 变量转储($this->db->error); } } 公共静态函数getTimeStamp(){ 返回日期(“Y-m-d H:i:s”); } /** *@param数组$array *@返回字符串 */ 公共静态函数getTypes(数组$array=[]):字符串{ $types=“”; foreach($array作为$value){ 如果(是整($value)) $types.=“i”; elseif(is_字符串($value)) $types.=“s”; elseif(is_bool($value)) $types.=“i”; 其他的 $types.=“s”; } 返回$type; } 公共函数更新记录(数组$array=[],数组$fields=[]){ if(empty($array)| | empty($fields))返回FALSE; /**@var\mysqli\u stmt$stmt*/ $query=“UPDATE`.”$this->tablename。“`SET`.”。内爆(`=?,`',数组键($fields))。“`=?其中`.”内爆(`=?和`',数组键($array))。“`=?;”; $stmt=$this->db->prepare($query); $types=self::getTypes($fields); $types.=self::getTypes($array); 如果(!$stmt->bind_-param($types,…array_-values($fields),…array_-values($array))){ 返回FALSE; } $result=$stmt->execute(); $resultquery=$query; foreach($fields作为$field){ $resultquery=$this->str_replace_first(“?”,(is_int($field)$field:““““$field.”)”,$resultquery); } foreach($array作为$field){ $resultquery=$this->str_replace_first(“?”,(is_int($field)$field:““““$field.”)”,$resultquery); } 变量转储($resultquery); 打印(“
字段:
”; 变量转储($fields); 打印(
受影响的行:
); 变量转储(mysqli受影响的行($this->db)); 打印(
错误:
); var_dump(mysqli_errno($this->db)); var_dump(mysqli_错误($this->db)); var_dump(mysqli_error_list($this->db)); 返回$result; } 公共函数str_replace_first($from,$to,$subject){ $from='/'.preg_quote($from'/')。'/'; 返回preg_替换($from,$to,$subject,1); }
显然,问题在于
datetime
字段被绑定为整数而不是字符串,因为我混淆了这两个数组:

$types = self::getTypes($fields);
$types .= self::getTypes($array);
因此,字符串
“2018-01-25 16:53:40”
被转换为整数
2018

实际执行的
bind_参数
如下所示:

bind_param(iss, a string, a string, an integer);

显示的PHP代码也不仅仅是dedata@RaymondNijland我会添加它,但会有很大的混乱-因为我会自动生成我的查询
bind_param(iss, a string, a string, an integer);