Сбой формата даты в php-запросе с использованием informix (на основе SQL) - PullRequest
0 голосов
/ 15 января 2019

Я использую сервис, который (должен) возвращает json с ответом на запрос sql для заполнения таблицы. В целях отладки я добавил полученную строку запроса в ответ, чтобы попробовать ее непосредственно в базе данных, и запрос работает в моей базе данных. На самом деле я получаю следующие ошибки, когда я запускаю его из своего сервиса, и мне нужно решить эту проблему:

Неверный год в дате. Когда я иду на "и table.datefield> = ' "$ Дата."'

Недопустимый месяц в дате. При использовании "и table.datefield> = {D ' "$ дата."'}

Оба с кодом ошибки HY000. (Описание ниже)

SQLSTATE [HY000]: общая ошибка: -1204 [Informix] [Informix ODBC Драйвер] [Informix] Неверный год в дате (SQLPrepare [-1204] в /usr/PRODUCTO/apache_jano/PDO_INFORMIX-1.3.3/informix_driver.c:131) ISAM: 264

SQLSTATE [HY000]: общая ошибка: -1205 [Informix] [Informix ODBC Драйвер] [Informix] Недопустимый месяц в дате (SQLPrepare [-1205] в /usr/PRODUCTO/apache_jano/PDO_INFORMIX-1.3.3/informix_driver.c:131) ISAM: 264

В какой-то момент 2-й вариант сверху сработал (он определяет год, так что я думаю, что это самый близкий подход), но он больше не работает. Я также не могу найти место, где я нашел документацию {d}, поэтому (которая решала ее в прошлом) любая ссылка также была бы оценена. Еще одна вещь, которую я не могу использовать для этого bind_params (мне было явно сказано делать это без этого).

Это часть, которая не работает (удаление этого условия в моем запросе работает отлично)

Условие кода SQL, которое работает в dbeaver и берется из строки ответа:

 AND (

(table.fecha_inicial <= { d '2018-07-15' }AND (table.fecha_final >= { d '2019-07-15' }OR table.fecha_final IS NULL))

OR 

(table.fecha_inicial >= { d '2018-07-15' }AND (table.fecha_final <= { d '2019-07-15' } OR table.fecha_final IS NULL)))

PHP кодирование

    if ($fechaInicio){ $fechaInicio = date('Y-m-d',     strtotime($fechaInicio));}
    if ($fechaFin){ $fechaFin = date('Y-m-d', strtotime($fechaFin));}
    $cond_fechas = " AND ( (table.fecha_inicial     <= '".$fechaInicio."' AND (table.fecha_final >= {d'".$fechaFin."'}     OR table.fecha_final IS NULL)) "
                    . " OR (table.fecha_inicial     >= '".$fechaInicio."' AND (table.fecha_final <= {d'".$fechaFin."'}     OR table.fecha_final IS NULL)))";


 $result['query'] = $query;
 $conn = DB::getConnection('bbdd');
 $result['das']= $conn->preparedQuery($query);

if (isset($result['das'])) {
   return JwtCheckHeader::json($result['das']);
} else {
   return JwtCheckHeader::json($result);
}

1 Ответ

0 голосов
/ 16 января 2019

Хорошо, я нашел проблему здесь. Он должен вернуть некоторую ошибку «нет результатов, соответствующих вашим условиям» вместо «format_error», который вводит меня в заблуждение полностью.

Эта ошибка произошла при сравнении некоторых пустых строк дат в базе данных с указанными датами.

Сбой при отсутствии данных и успех, когда указанные даты соответствуют требованиям, поэтому он работает! Надеюсь, что это поможет кому-то еще в будущем.

...