2 Stimmen

Umgehung reservierter SQL Server-Schlüsselwörter durch PHP

Eine Abfrage, die ich in PHP für eine SQL Server-Datenbank geschrieben habe, hat ein Problem, bei dem ein Wort nicht als Tabellenname erkannt wird. Ich verwende SQL Server für PHP 2.0 (VC6). Die folgende Abfrage funktioniert und gibt alle Bestellungen aus der Tabelle zurück Order wenn sie in SQL Server Management Studio ausgeführt wird.

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

In PHP erhalte ich den folgenden Fehler:

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

Diese Abfrage funktioniert innerhalb des PHP-Codes für alle anderen Tabellen in der Datenbank, db_name es funktioniert einfach nicht bei Tisch Order und das ist der richtige Tabellenname. Ich habe es mit doppelten Anführungszeichen, rechteckigen Klammern, ohne Anführungszeichen/Klammern usw. versucht, aber ohne Erfolg. Hat jemand eine Idee, wie man das Problem beheben kann?

* * UPDATE:

Ich habe eine Lösung für dieses Problem gefunden. Bitte sehen Sie sich eine der Antworten an, um das Problem zu beheben oder zu umgehen.

5voto

Cade Roux Punkte 85601

Irgendetwas muss in PHP oder Ihrem Treiber vor sich gehen. Sie sollten in der Lage sein, den SQL Server Profiler zu verwenden, um die tatsächliche Abfrage zu sehen, die übermittelt wird.

Auf jeden Fall, wenn Sie nicht herausfinden können, was es tut. Sie könnten dies als Abhilfe in Betracht ziehen:

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

Und machen Sie weiter - das Leben ist zu kurz.

1voto

laketuna Punkte 3481

Nun, ich habe eine Lösung für mein Problem gefunden. Hier sind meine Spezifikationen:

  • Windows 7 64-Bit
  • PHP 5.3 VC9-kompiliert (ich habe es von der VC^-Version aktualisiert, als ich versuchte, dieses Problem zu lösen)
  • Fahrer: SQL für PHP 2.0 (VC9)
  • Tabellenname, aus dem ich versucht habe, Daten abzurufen: [Order]
  • Abfrage, die ich verwendet habe: SELECT * FROM [db_name].[dbo].[Order] WHERE ...

Die obige Abfrage funktionierte nicht für die Order Tabelle überhaupt nicht in PHP, während sie in SSMS problemlos funktionierte. Alle anderen Tabellen in db_name auch gut abgefragt. Ich habe versucht, eine Ansicht zu erstellen oder einen Alias zu verwenden, und nichts davon funktionierte für Order .

Es hätte mir von Anfang an einfallen müssen, aber ich habe schließlich versucht, nur eine Spalte abzufragen, wie [OrderID] und was wissen Sie schon? Es funktioniert, solange Sie die Spaltennamen in der Abfrage nacheinander auflisten. Ich glaube, eine der Spalten in MSSQL wird in MySQL nicht unterstützt. So,

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

funktioniert einwandfrei! Ich hoffe, dass dies jemandem in Zukunft einige Qualen erspart.

1voto

Peter Brand Punkte 515

Dieser Fehler tritt auf, wenn die Abfrage einen Spaltentyp zurückgibt, mit dem PDO nicht umgehen kann. Sie erhalten diesen Fehler zum Beispiel, wenn Sie versuchen

SELECT default_value FROM sys.parameters

da diese Spalte vom Typ sql_variant ist. Wenn es sinnvoll ist, CAST diese Spalte lieber auf varchar oder was auch immer, oder eliminieren Sie sie aus der Abfrage.

Wahrscheinlich gab es in Ihrem Fall eine Spalte in der Tabelle, die von einem seltsamen Typ war und die eliminiert wurde, als Sie die gewünschten Spalten explizit benannten.

0voto

Denys Séguret Punkte 355205

Eine Tabelle kann nicht "Bestellung" heißen: das ist eine reserviertes Wort in SQL

Es gibt viele Situationen, in denen Sie diesen Namen zwischen Anführungszeichen (oder hinteren Anführungszeichen) verwenden können, aber Sie werden immer in einer Situation enden, in der Sie ihn nicht handhaben können. Benennen Sie diese Tabelle um.

Wenn Sie das nicht können, versuchen Sie es mit Aliasing:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X