PHP PDO-Fehler bei der Verwendung von Platzhaltern in der LIMIT-Klausel einer MySQL-Abfrage [duplizieren]

8
%Vor%

Hier bekomme ich einen Fehler:

  

Abfrage fehlgeschlagen: SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, nach der richtigen Syntax für die Verwendung in der Nähe von "5" in Zeile 1.

Das LIMIT :startRow, :numRows hat ein Problem in :numRows .

Ich habe versucht sowohl $st->bindParam und $st->bindValue , beide haben nicht funktioniert.

    
Sujin Shrestha 22.05.2015, 06:25
quelle

3 Antworten

-2

Ich habe es gelöst. Geben Sie den Platzhalter :numRows ein.

$numRows=(int)$numRows; $sql = 'SELECT sql_calc_found_rows * FROM ' . TBL_MEMBERS .'ORDER BY'. $order .'LIMIT :startRow,:numRows'; try { $st = $conn->prepare($sql); $st->bindValue(":startRow", $startRow, PDO::PARAM_INT); $st->bindValue(":numRows", $numRows, PDO::PARAM_INT); $st->execute();

Und es hat funktioniert. Ich habe auch bemerkt, dass ' anstelle von " verwendet werden sollte.

    
Sujin Shrestha 22.05.2015, 11:47
quelle
0

Ich denke, das Problem ist mit TBL_MEMBERS Ich nehme an, das ist eine Ansicht (subselect). Wenn Sie beispielsweise eine Produkttabelle haben und folgende Anweisung ausführen möchten:

%Vor%

Sie erhalten folgenden Fehler:

  

SQL Error (1064): Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, um die richtige Syntax in der Nähe von 'Select ID, Code, Name, Slug, Info von Produkten, sortiert nach Code' in Zeile 1

zu verwenden

Aber wenn Sie die Abfrage zu:

ändern %Vor%

das wird funktionieren.

Zusammenfassend, TBL_MEMBERS ist eine Ansicht, die in Klammern gesetzt und mit einem Alias ​​versehen werden soll (mein Beispielalias ist 'v')

    
gandra404 22.05.2015 12:20
quelle
0

Ich empfehle, den SQL-Abfragetext anzusehen, was PDO tatsächlich produziert. Sie können dies mit Hilfe des allgemeinen Abfrageprotokolls von MySQL tun.

Wahrscheinlich sind die formalen Typen von $startRow und / oder $numRows Zeichenketten, keine Ganzzahlen und die resultierende Abfrage ist daher etwas wie LIMIT '0', '5' (Syntaxfehler) anstelle von LIMIT 0, 5 (korrekt).

Die Sache ist, sogar mit PDO::PARAM_INT , wenn der formale Typ des Parameters nicht ganzzahlig ist ( is_int gibt false ) zurück, PDO wird in Anführungszeichen eingeschlossen. Also müssen Sie Parameter in Ganzzahlen umwandeln, bevor Sie sie binden (zB mit intval ):

%Vor%     
dened 23.05.2015 04:01
quelle

Tags und Links