Неправильное значение даты и времени: «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_dumps запрос «должен быть выполнен»

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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]