Php 日期时间值不正确:';2018年&x27年;以字符串形式传递有效日期时的列
今天我遇到了一个非常奇怪的问题。传递的日期显然与bind_param传递给我的查询的日期不同 数据库结构: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`
| 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);