Неверное значение даты и времени: "2018" для столбца при передаче допустимой даты в виде строки
Сегодня я испытываю очень странную проблему. По всей видимости, прошедшая дата не совпадает с той, что bind_param передает моему запросу.
Структура базы данных:
|id varchar(16) autoincrement|date_created datetime|date_updated datetime|
В настоящее время таблица содержит действительные данные:
|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) "Неверное значение даты и времени:" 2018 "для столбца" дата_создана "в строке 1"
я не понимаю почему bind_params
или же execute
следует сократить действительную дату до года
РЕДАКТИРОВАТЬ: код PHP, как требуется. Это функция, которая автоматически генерирует запрос и выполняет его. Я добавил часть, которая var_dump
s запрос "должен быть выполнен"
public function executeUpdateQuery(){
// update existing record
$where['id'] = 1;
$array['date_created'] = self::getTimeStamp();
$array['date_updated'] = self::getTimeStamp();
if(!$this->updateRecord($where, $array)){
print("<br>Error:<br>");
var_dump($this->db->error);
}
}
public static function getTimeStamp(){
return date('Y-m-d H:i:s');
}
/**
* @param array $array
* @return string
*/
public static function getTypes(array $array = []) : string {
$types = "";
foreach ($array as $value){
if(is_int($value))
$types .= "i";
elseif(is_string($value))
$types .= "s";
elseif(is_bool($value))
$types .= "i";
else
$types .= "s";
}
return $types;
}
public function updateRecord(array $array = [], array $fields = []){
if(empty($array) || empty($fields)) return FALSE;
/** @var \mysqli_stmt $stmt */
$query = "UPDATE `" . $this->tablename . "` SET `" . implode("` = ?, `", array_keys($fields)) . "` = ? WHERE `" . implode("` = ? AND `", array_keys($array)) . "` = ?;";
$stmt = $this->db->prepare($query);
$types = self::getTypes($fields);
$types .= self::getTypes($array);
if(!$stmt->bind_param($types, ...array_values($fields), ...array_values($array))) {
return FALSE;
}
$result = $stmt->execute();
$resultquery = $query;
foreach ($fields as $field){
$resultquery = $this->str_replace_first('?', (is_int($field)?$field:"'".$field."'"), $resultquery);
}
foreach ($array as $field){
$resultquery = $this->str_replace_first('?', (is_int($field)?$field:"'".$field."'"), $resultquery);
}
var_dump($resultquery);
print("<br>Fields:<br>");
var_dump($fields);
print("<br>Affected Rows:<br>");
var_dump(mysqli_affected_rows($this->db));
print("<br>Errors:<br>");
var_dump(mysqli_errno($this->db));
var_dump(mysqli_error($this->db));
var_dump(mysqli_error_list($this->db));
return $result;
}
public function str_replace_first($from, $to, $subject){
$from = '/'.preg_quote($from, '/').'/';
return preg_replace($from, $to, $subject, 1);
}
1 ответ
Видимо проблема была в том, что datetime
Поле было связано как целое число вместо строки, потому что я перепутал эти 2 массива:
$types = self::getTypes($fields);
$types .= self::getTypes($array);
Благодаря этому, строка "2018-01-25 16:53:40"
был приведен к целому числу 2018
Фактически выполненный bind_param
это было выполнено, выглядело так:
bind_param(iss, a string, a string, an integer);