无法使用 MSSQL 在 PDO 中引用表名

Posted

技术标签:

【中文标题】无法使用 MSSQL 在 PDO 中引用表名【英文标题】:Unable to quote table name in PDO with MSSQL 【发布时间】:2014-02-16 08:44:34 【问题描述】:

我必须使用某人的数据库来开发一款游戏,遗憾的是它有一个名为“User”或 [dbo][User] 的表,并且无法重命名。 现在,我需要在 php 中使用 PDO 访问它,当我使用这个查询时:

$query = "SELECT UserId AS INTUSERID FROM dbo.User WHERE YahooId = 'abcdef'";

它失败了,因为“用户”是那里的保留关键字,所以没有获取任何内容。从 MS SQL Server 我可以这样做:

SELECT UserId AS INTUSERID FROM [GameName].[dbo].[User] WHERE YahooId = 'abcdef'

它有效。 我应该如何在 PHP 中准备我的查询以使其执行?我试图在表名周围加上单引号,但这没有效果。 正确的使用方法是什么

[GameName].[dbo].[User] 

来自 PHP PDO 作为表名?

更新: 这就是我的连接方式:

try
    $conn = new PDO("xxx.rds.amazonaws.com,1150;Database=xyz","admin","password");
     catch(PDOException $e)
        echo "Connection failed: " . $e->getMessage();
    

【问题讨论】:

我认为 ***.com/questions/15091734/… 和 ***.com/questions/3716373/real-escape-string-and-pdo 已经回答了这个问题 我已经尝试过 PDO 准备,但这些线程似乎是用于参数的。在我的例子中,表名本身就是一个保留关键字... @MrVimes 尝试了反引号...没有效果。我回应了查询并用反引号显示,但没有执行。 我删除了我的评论,因为我没有意识到您使用的是 mssql 而不是 mysql。方括号不起作用吗? 即$query = "从 dbo 中选择 UserId 作为 INTUSERID。[User] WHERE YahooId = 'abcdef'";我会测试自己,但我在 ipad 上 :) 【参考方案1】:

为了进一步在 cmets 中进行讨论,我将提供此内容,以便问题得到答案。我认为方括号在用于定义查询的 php 字符串中可以正常工作,因此我在自己的代码上对其进行了测试,该代码使用 PDO 连接到 MS-SQL。

所以以下应该可以工作......

$query = "SELECT UserId AS INTUSERID FROM dbo.[User] WHERE YahooId = 'abcdef'";

旁注 - 如果您的 YahooId 来自可被用户操纵的来源(例如 $_GET),您应该使用 PDO 研究 Prepared Statements...

$query = "SELECT UserId AS INTUSERID FROM dbo.[User] WHERE YahooId = ?;";

$statement= $db->prepare($query);

$statement->execute(array($userinput));

【讨论】:

感谢 MrVimes。但是,对于我的情况,我必须以某种方式使用 [dbName].[dbo].[User] ...它仅在没有 [dbName] 的情况下才适用。如果你能猜出原因,请告诉我。其他查询工作正常。无论如何,经过几个小时的调试,战斗结束了...... :) yahooId 来自会话,所以我猜,没有安全漏洞。我正在为其他一些参数复杂的函数使用准备好的语句,但老实说,即使我将表名作为 bindParam 提供,这个语句也不起作用......

以上是关于无法使用 MSSQL 在 PDO 中引用表名的主要内容,如果未能解决你的问题,请参考以下文章

pdo 在字符串连接中准备

如何在 Windows 开发环境中在 PHP 中使用 PDO 和 MSSQL?

PHP + MSSQL 使用 PDO,命名参数不是“?”

数据无法保存在MSSQL中

Zend Framework和SQL Server

在没有 mssql 支持的情况下连接到 mssql