2014-01-25 3 views
2

Мне нужно работать с чей-то базой данных для игры, у которой, к сожалению, есть таблица с именем «Пользователь» или [dbo] [Пользователь], и это нельзя переименовать. Теперь мне нужно открыть с помощью PDO в PHP и когда я использую этот запрос:Невозможно процитировать имя таблицы в PDO с помощью MSSQL

$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 в качестве имени таблицы?

Update: Это, как я подключаю:

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

Я думаю, что это отвечает на http://stackoverflow.com/questions/15091734/how-to-escape-strings-in-pdo и http://stackoverflow.com/ вопросы/3716373/реальный спусковое стри ng-and-pdo – MarkD

+0

Я попытался подготовить PDO, но эти темы, похоже, для параметров. В моем случае имя таблицы само по себе является зарезервированным ключевым словом ... –

+0

@MrVimes Пробовал обратные сигналы ... не имеет эффекта. Я повторил запрос и показывал обратные шаги, но не выполнял его. –

ответ

1

Далее к дискуссии в комментариях я обеспечиваю это так, что вопрос есть ответ. Я думал, что квадратные скобки будут работать нормально в php-строке, используемой для определения запроса, поэтому я проверил его на своем собственном коде, который подключается к MS-SQL с использованием PDO.

Так должно работать ...

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

Примечание стороны - Если YahooID когда-либо приходит из источника, который может манипулировать пользователем (например, $ _GET) вы должны исследовать Prepared Statements с PDO ...

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

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

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

Спасибо MrVimes. Однако для моего случая я каким-то образом должен использовать [dbName]. [Dbo]. [Пользователь] ... Это просто не работает для этого только без [dbName]. Если вы можете угадать причину, сообщите мне. Другие запросы работают нормально. В любом случае, после нескольких замечательных часов отладки, борьба закончилась ... :) Это yahooId происходит из сеанса, поэтому, я думаю, нет дыр в безопасности. Я использую подготовленные инструкции для некоторых других функций, где параметры являются сложными, но, честно говоря, это не работает, даже когда я давал имя таблицы как bindParam ... –

Смежные вопросы