通过PHP转义保留的SQL Server关键字

时间:2012-06-15 18:55:51

标签: php sql sql-server

我在PHP中为SQL Server数据库编写的查询存在一个问题,即单词未被识别为表名。我正在使用SQL Server for PHP 2.0(VC6)。以下查询可以在SQL Server Management Studio中执行时返回表Order中的所有订单。

SELECT * FROM "db_name"."dbo"."Order" (also tried using brakets [] around table name)

在PHP中,我收到以下错误:

[0] => Array
    (
        [0] => IMSSP
        [SQLSTATE] => IMSSP
        [1] => -35
        [code] => -35
        [2] => Invalid type
        [message] => Invalid type
    )

此查询在PHP代码中适用于数据库中的所有其他表db_name ..它只适用于表Order,这是正确的表名。我试过双引号,矩形括号,没有引号/括号等等无济于事。有没有人知道如何解决这个问题?

* * 更新:

我找到了解决方法。请查看修复或解决方法的其中一个答案。

4 个答案:

答案 0 :(得分:5)

必须在PHP或驱动程序中进行某些操作。您应该能够使用SQL Server Profiler查看正在提交的实际查询。

无论如何,如果你不知道它在做什么。您可以将此视为一种解决方法:

CREATE VIEW dbo.MyOrder
AS
SELECT * FROM [Order]

继续前进 - 生命太短暂。

答案 1 :(得分:1)

好吧,我找到了解决问题的方法。这是我的规格:

  • Windows 7 64位
  • PHP 5.3 VC9编译(在尝试解决此问题时从VC ^版本更新)
  • 驱动程序:SQL for PHP 2.0(VC9)
  • 我尝试提取数据的表名称:[Order]
  • 我正在使用的查询:SELECT * FROM [db_name].[dbo].[Order] WHERE ...

上述查询根本不适用于PHP的Order表,而它在SSMS中运行良好。 db_name中的所有其他表也都查询得很好。我尝试创建视图或使用别名,但没有一个适用于Order

从一开始就应该发生这种情况,但我终于尝试查询一列,例如[OrderID],你知道什么?只要您逐个列出查询中的列名称,它就可以正常工作。我相信MySQL中不支持MSSQL中的一个列。所以,

SELECT [OrderID],[OrderNumber],... FROM [db_name].[dbo].[Order] WHERE ...

完美无缺!我希望将来会为某人带来一些痛苦。

答案 2 :(得分:1)

当查询返回PDO无法处理的列类型时,会发生此错误。例如,当你尝试

时,你会得到这个
SELECT default_value FROM sys.parameters

因为该列是sql_variant类型。如果它有意义,而是将该列CAST到varchar或其他任何内容,或者从查询中删除它。

在您的案例中可能发生的事情是,该表上有一个列是一种奇怪的类型,当您明确命名所需的列时,该列已被删除。

答案 3 :(得分:0)

表格不能命名为“order”:那是reserved word in SQL

在很多情况下,您可以在引号(或引号)之间使用此名称,但您总是会遇到无法处理它的情况。重命名此表。

如果你不能尝试别名:

SELECT * FROM "db_name"."dbo"."Order" as ord