【问题标题】:Date format is failing in php query using informix (SQL-based)使用informix(基于SQL)的php查询中的日期格式失败
【发布时间】:2026-01-13 19:20:02
【问题描述】:

我正在运行一项服务,该服务(应该)返回一个带有来自 sql 查询的响应的 json 以填充表。出于调试目的,我已将生成的查询字符串添加到响应中以直接在数据库上尝试,并且查询在我的数据库中工作。 实际上,当我从我的服务运行它时,我遇到了以下错误,我需要解决这个问题:

日期中的年份无效。当我选择“和 table.datefield >= '".$date."'

日期中的月份无效。当使用“和 table.datefield >= {d'".$date."'}

两者都带有 HY000 错误代码。 (以下说明)

SQLSTATE[HY000]:一般错误:-1204 [Informix][Informix ODBC 驱动程序][Informix]日期中的无效年份 (SQLPrepare[-1204] at /usr/PRODUCTO/apache_jano/PDO_INFORMIX-1.3.3/informix_driver.c:131) ISAM:264

SQLSTATE[HY000]:一般错误:-1205 [Informix][Informix ODBC 驱动程序][Informix]日期中的月份无效 (SQLPrepare[-1205] at /usr/PRODUCTO/apache_jano/PDO_INFORMIX-1.3.3/informix_driver.c:131) ISAM:264

在某些时候,上面的第二个选项起作用了(它检测到年份,所以我认为它是最接近的方法),但它不再起作用了。我也找不到找到 {d} 文档的地方(过去解决了它),任何链接也将不胜感激。 还有一件事我不能为此使用 bind_params(我被明确告知不要这样做)。

这是失败的部分(在我的查询中删除这个条件很完美)

在 dbeaver 中工作并取自响应字符串的 SQL 代码条件:

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

【问题讨论】:

  • { d } 符号来自 Escape Sequences in ODBC,这似乎也适用于 jdbc(这就是它们在 dbeaver 中工作的原因)。您需要了解您的服务环境使用的日期格式是什么。
  • 格式应该是 YYYY-mm-dd (2019-01-16) 或者我在 php 中用日期格式化它 ('Y-m-d' )。我在数据库上以这种方式直观地看到它。会不会和我看到的不一样?它似乎丢失了格式或无法正确使用,但不知道为什么。随意将您的评论作为答案,因为它为我提供了一个提示,让我可以跟进 {d} 评论的研究。我真的很感激。

标签: php sql date informix


【解决方案1】:

好的,我在这里找到了问题。 它应该返回一些“没有符合您的条件的结果”的错误,而不是完全误导我的“format_error”。

将数据库中的某些 db 空日期字符串与提供的日期进行比较时发生此错误。

当没有数据满足时失败,当提供的日期满足要求时成功,所以它有效! 希望以后能对其他人有所帮助。

【讨论】:

  • 禁止参数化查询的人应该被解雇。这就像说“做这个特技,但不要使用安全带”
  • 另一个团队将以某种“公司方式”设置过滤。但与此同时,他们告诉我在没有它的情况下让它工作。
  • 我在这个行业已经 15 年了。这一直是个坏主意。它通过破坏查询计划缓存来破坏性能(不仅仅是您的查询,它也会破坏其他查询的性能)。它使代码更脆弱、更难测试、更不安全(sql 注入攻击)等等。没有什么是值得所有这些缺点的。
  • 我从以前的所有工作中学到了即使他错了也不要反对 BOSS。但我给了他和你一样的建议:D