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.
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.
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')
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
):