PHP执行PostgreSQL时区转换SQL报错:Undefined index: somedate
解决PHP执行PostgreSQL时区转换SQL时的"Undefined index: somedate"错误
我来帮你搞定这个问题!既然SQL在pgAdmin里能正常运行,说明语法和数据库本身是没问题的,报错大概率出在PHP处理查询结果的环节上,下面分几种情况分析解决方案:
最常见的原因:未给计算字段添加别名
你的SQL语句里,查询的是一个计算表达式((somedate at time zone 'utc') at time zone 'cet'),PostgreSQL不会自动给这个结果赋予somedate作为字段名,而是会用整个表达式作为默认的字段标识。当你在PHP里用$row['somedate']去取结果时,自然会找不到对应的索引。
解决方法:给计算字段添加别名
修改你的SQL语句,给时区转换后的结果指定一个清晰的别名,比如还是用somedate:
SELECT ((somedate at time zone 'utc') at time zone 'cet') AS somedate FROM sometable;
这样PHP通过关联数组获取结果时,$row['somedate']就能正确匹配到对应的字段值了。
检查PHP结果获取的方式
如果已经加了别名还是报错,那就要检查你获取查询结果的函数是否正确:
- 如果你用的是
pg_fetch_assoc(),要确保数组键名和SQL里的别名完全一致(PostgreSQL默认会把未加双引号的标识符转为小写,所以别用大写的键名去取)。 - 如果你用的是
pg_fetch_row(),那应该用数字索引(比如$row[0])来获取第一个字段的结果,而不是关联键名。 - 可以临时用
var_dump($row)打印出完整的结果数组,看看实际返回的索引是什么,这样就能快速定位问题所在。
验证字段名的大小写问题
如果你的表中somedate字段是带大写字母定义的(比如创建表时用了"SomeDate"),那在SQL里也要用双引号包裹字段名,否则PostgreSQL会自动转为小写,导致查询结果的字段名和你预期的不一致。不过这种情况在pgAdmin里也会出现问题,所以可能性较低,但可以排查一下。
内容的提问来源于stack exchange,提问作者Klabautermann
相关产品推荐
相关产品推荐

