Неверное значение даты и времени: "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);
Другие вопросы по тегам