【问题标题】:PHP mssql_query double quotes cannot be usedPHP mssql_query 双引号不能用
【发布时间】:2010-04-06 22:12:47
【问题描述】:

在 java-jdbc 中,我可以轻松运行以下 SQL(注意列和表名周围的双引号)

Select 
       cus."customer_id" ,
       cus."organisation_or_person" ,
       cus."organisation_name" ,
       cus."first_name" ,
       cus."last_name" ,
       cus."date_became_customer" ,
       cus."other_customer_details"
From 
      "Contact_Management"."dbo"."Customers"    cus

但在 PHP 中的相同查询错误提示语法无效

“警告:mssql_query() [function.mssql-query]:消息:'customer_id' 附近的语法不正确。(严重性 15)”

但如果删除所有双引号,查询工作正常,没有错误。

查询是从 Java 应用程序移植的,所以我想保持双引号和 SQL 原样。任何替代解决方案?

谢谢 尼禄

Volkerk -- 解决方案(SET QUOTED_IDENTIFIER ON)

我做了以下

    $sql = <<<EOD
Select 
       cus."customer_id" ,
       cus."organisation_or_person" ,
       cus."organisation_name" ,
       cus."first_name" ,
       cus."last_name" ,
       cus."date_became_customer" ,
       cus."other_customer_details"
From 
      "Contact_Management"."dbo"."Customers"    cus
EOD;

$db->Execute('SET QUOTED_IDENTIFIER ON');
    $rs = $db->Execute($sql); 

而且效果很好

非常感谢..

【问题讨论】:

    标签: php sql-server-2005 double-quotes


    【解决方案1】:

    QUOTED_IDENTIFIER 可能设置为关闭。

    http://msdn.microsoft.com/en-us/library/ms174393.aspx 说:

    SET QUOTED_IDENTIFIER (Transact-SQL)
    [...]
    当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以用双引号分隔,文字必须用单引号分隔。 当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不能被引用并且必须遵循标识符的所有 Transact-SQL 规则。有关详细信息,请参阅Identifiers
    [...]
    SQL Server Native Client ODBC 驱动程序和用于 SQL Server 的 SQL Server Native Client OLE DB Provider 在连接时自动将 QUOTED_IDENTIFIER 设置为 ON。这可以在 ODBC 数据源、ODBC 连接属性或 OLE DB 连接属性中进行配置。 对于来自 DB-Library 应用程序的连接,SET QUOTED_IDENTIFIER 的默认值为 OFF。

    将其设置为On,您就可以开始了。

    【讨论】:

    • 相同的查询对来自 Java 的同一个实例运行良好,所以我认为 SQL 服务器没有问题。我认为这更多的是 php 库问题。
    • 这不是服务器范围的设置。因此,您的 java 应用程序可能会使用其他设置。
    • 嗨,Volkerk,你是对的,它解决了我的问题。我很抱歉没有测试就回复了。我做了以下 $sql = Execute('SET QUOTED_IDENTIFIER ON'); $rs = $db->执行($sql);它工作完美谢谢你非常感谢你
    【解决方案2】:

    这并不完全是原样,但您可以将双引号 " 替换为反引号:

    Select 
           cus.`customer_id` ,
           cus.`organisation_or_person` ,
           cus.`organisation_name` ,
           cus.`first_name` ,
           cus.`last_name` ,
           cus.`date_became_customer` ,
           cus.`other_customer_details`
    From 
          `Contact_Management`.`dbo`.`Customers`    cus
    

    【讨论】:

    • Dav,反引号也不起作用。它给出以下错误警告:mssql_query() [function.mssql-query]: message: Incorrect syntax near '`'.
    【解决方案3】:

    这个怎么样?

    $query ='Select 
       cus."customer_id" ,
       cus."organisation_or_person" ,
       cus."organisation_name" ,
       cus."first_name" ,
       cus."last_name" ,
       cus."date_became_customer" ,
       cus."other_customer_details"
    From 
      "Contact_Management"."dbo"."Customers"    cus';
    
    $query = str_replace('"', '', $query);
    

    【讨论】:

    • 我可以使用这个,但是如果有一个列名在单词之间有一个空格,这将被破坏例如选择 cus."Customer ID" ...客户和 ID 之间的空间
    猜你喜欢
    • 2011-07-24
    • 2018-05-12
    • 2011-06-02
    • 2013-02-07
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多