【发布时间】:2015-10-01 02:49:24
【问题描述】:
我正在尝试通过与 SQL Server 数据库的 ODBC 连接来查找使用 PDO 的问题,在该数据库中,我得到了一个已知良好查询的空结果集。我将不胜感激来自社区的任何指导。这是我已经工作了大约五年的大型系统的一部分;它采用报告的 XML 表示,从中生成 SQL,运行查询,根据请求格式化结果集,并生成用于演示的网页。比您可能需要知道的要多,但我试图传达的是,我非常了解它应该如何工作,并且在大多数情况下它可以可靠地工作。但是我有一个客户想要一些新的东西,它破坏了我的系统。
我将此称为已知良好查询,因为我可以将查询从我的日志文件复制并粘贴到 SSMS(SQL Server 控制台)并运行它。它产生 62 行结果。但是当我通过 PDO 运行相同的查询时,我得到一个 PDOStatement,没有errorInfo(),没有抛出异常,等等。但是fetchAll() 返回一个空数组。我最初使用query(),但如果查询中缺少某些内容,使用prepare() 和execute() 似乎更安全。没什么区别。
我意识到可能存在类型转换问题,但在下面的示例中,检索到的两个字段分别为 nvarchar(128) 和 nvarchar(32) 类型,它们与其他查询一起成功返回。
我应该提到,查询在应用程序中只执行一次,所以据我所知,这不是先前执行干扰下一个执行的问题。另外,PDO 对象有 setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
这是execute()返回的PDOStatement:
Result Set PDOStatement Object
(
[queryString] => SELECT [dbo].[Supplier].[SupplierName] AS suppliername,[dbo].[Item].[ItemLookupCode] AS itemlookupcode FROM [dbo].[Order] LEFT JOIN [dbo].[OrderEntry] ON [dbo].[Order].ID=[dbo].[OrderEntry].OrderID LEFT JOIN [dbo].[Item] ON [dbo].[Item].ID=[dbo].[OrderEntry].ItemID,[dbo].[Supplier] WHERE ([dbo].[Order].Time >= '2015-01-01 00:00:00') AND ([dbo].[Order].Time <= '2015-03-31 23:59:59') AND ([dbo].[Item].SupplierID=[dbo].[Supplier].ID) ORDER BY [dbo].[Supplier].[SupplierName]
)
这并不复杂,其他 SQL 查询对该数据库也能正常工作。这只是通过 PDO 失败,但在 SSMS 中工作。
有什么想法吗?有没有人见过这种行为?有没有其他方法可以查看这里发生了什么?我已经查看了关于这个主题的几个问题,但它们似乎都有一些我没有做的错误。
顺便说一句,PHP 5.4.22。
【问题讨论】:
标签: php sql-server pdo