Wie verwende ich die vorbereitete Anweisung von pdo für Order by- und Limit-Klauseln?

Lesezeit: 4 Minuten

Wie verwende ich die vorbereitete Anweisung von pdo fur Order
Benutzer198729

Ich möchte eine vorbereitete Anweisung verwenden, in der die übergebenen Parameter für die sind ORDER BY und LIMIT Klauseln, etwa so:

$sql="SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->execute(array(
     'sort'  => $_GET['sort'], 
     'dir'  => $_GET['dir'], 
     'start'  => $_GET['start'],
     'results' => $_GET['results'],
     )
    );

Aber $stmt->fetchAll(PDO::FETCH_ASSOC); gibt nichts zurück.

Kann jemand darauf hinweisen, was ich falsch mache? Kann es getan werden? Wenn nicht, worauf sollte ich verweisen, um eine vollständige Liste der Klauseln zu erhalten, in denen Parameter verwendet werden können?

  • Nein, ich habe die Werte woanders eingetragen, aber es funktioniert immer noch nicht.

    – Benutzer198729

    21. April 2010 um 14:12 Uhr

  • Soweit ich weiß, sollten Sie nur Werte binden, keine Spalten und dergleichen.

    – Ofir Baruch

    1. Oktober 2013 um 17:22 Uhr

1645703646 333 Wie verwende ich die vorbereitete Anweisung von pdo fur Order
Arch

Nach der Verwendung:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Ich habe die Nachricht erhalten :

Nicht abgefangene Ausnahme „PDOException“ mit Meldung „SQLSTATE[42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, um die richtige Syntax für die Verwendung in der Nähe von „0“, „10“ in Zeile 1 zu finden

Wenn Sie also ein Array zum Ausführen verwenden, betrachtet es Ihre Eingaben als Zeichenfolge, was für LIMIT keine gute Idee ist

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':start', $_GET['start'], PDO::PARAM_INT);
$stmt->bindParam(':results', $_GET['results'], PDO::PARAM_INT);
$stmt->bindParam(':sort', $_GET['sort']);
$stmt->bindParam(':dir', $_GET['dir']);
$stmt->execute();

$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($data);

  • Ich sehe nie eine solche Deklaration, in der Parameter nicht verwendet werden können limit und order Klauseln, können Sie einige Links als Referenz bereitstellen? Gibt es eine vollständige Liste, in der Parameter verwendet werden können?

    – Benutzer198729

    21. April 2010 um 15:06 Uhr


  • Scheint, als ob ich falsch liege, nur Tabellen-/Spaltennamen können nicht parametrisiert werden. Ihr Problem kommt von Ihren Array-Schlüsseln, in denen Sie die : (‘:sort’ => $_GET[‘sort’]).

    – Arch

    21. April 2010 um 15:19 Uhr

  • Nö,: ist optional (es gibt nach dem Hinzufügen immer noch nichts zurück :).Sie können dies hier sehen, wenn Sie genug nach unten ziehen: php.net/manual/en/pdostatement.execute.php

    – Benutzer198729

    21. April 2010 um 15:22 Uhr


  • Aber pdo sagte: Schließen Sie die Benutzereingabe nicht direkt in die Abfrage einwie soll ich das denn machen? php.net/manual/en/pdo.prepare.php

    – Benutzer198729

    21. April 2010 um 15:43 Uhr

  • Lesen Sie die bearbeitete Version, sie verwendet die Benutzereingabe nicht direkt, sondern bindet sie mit bindValue.

    – Arch

    21. April 2010 um 16:09 Uhr

1645703647 635 Wie verwende ich die vorbereitete Anweisung von pdo fur Order
beldaz

Vorbereitete Anweisungen ermöglichen es dem DBMS, einen Abfrageplan für Ihre Abfrage zu generieren, bevor die Abfrage für Ihre bereitgestellten Parameter tatsächlich ausgeführt wird. Ändern der Felder für ORDER BY erfordert einen anderen Abfrageplan, da die Anordnung Ihrer Daten auf unterschiedliche Weise drastisch beeinflussen kann, wie das DBMS die Daten abrufen könnte: Beispielsweise können bestimmte Indizes in einem Fall hilfreich sein, in einem anderen jedoch nicht. Aus diesem Grund die ORDER BY Felder sollten Teil der SQL-Zeichenfolge sein, die an übergeben wird prepare() Methode, anstatt an die vorherige Abfrage gebunden zu sein execute().

Wie für die LIMIT -Klausel, ist nicht klar, ob sich ihre Parameter auf den Abfrageplan auswirken würden, sodass diese möglicherweise später gebunden werden, möglicherweise abhängig von Ihrem DBMS. Laut dieser SO-Antwort sollte es erlaubt sein.

Sie können einen Parameter nicht binden, um ein Sprachschlüsselwort oder einen Feldnamen anzugeben – er muss ein Literal ersetzen. Daher finde ich Ihre Grenzwerte in Ordnung, aber Ihre Bestellung nach nicht. Am besten ersetzen Sie sort und dir in der Zeichenfolge manuell. Maskieren Sie sie, aber verwenden Sie dafür nicht die DB-Tools, da es sich nicht um Zeichenfolgenliterale handelt. Achten Sie grundsätzlich darauf, dass keine Sonderzeichen vorhanden sind.

  • ich ersetzte :sort :dir mit :sss :xxx funktioniert aber immer noch nicht.

    – Benutzer198729

    21. April 2010 um 14:25 Uhr


  • Das ist nicht das, was ich meinte. Es hängt von Ihrem DBMS ab, wie es scheint. Bei MySQL können Sie beispielsweise keine Bindungsparameter für Schlüsselwörter oder Namen verwenden. Ein Benutzer bei php.net hat auch Folgendes entdeckt: php.net/manual/en/pdo.prepare.php#71127. Wenn Sie jedoch ein anderes DBMS verwenden, ignorieren Sie meine Antwort.

    – Bob Gettys

    21. April 2010 um 21:02 Uhr


Obwohl diese Frage ziemlich alt ist, denke ich, dass sie immer noch von Interesse sein könnte. Bei mir hat es funktioniert nachdem ich

  1. verwendet bindParam in Kombination mit PDO::PARAM_INT wie schon mal vorgeschlagen
  2. wandelt den Variableninhalt durch Aufruf in einen Integer-Wert um intval()

Der relevante Teil des Codes sieht dann so aus:

    $stmt->bindParam(':start', intval($_GET['start']), PDO::PARAM_INT);
    $stmt->bindParam(':number', intval($_GET['number']), PDO::PARAM_INT);

Ohne zu benutzen intval() Ich habe auch den Fehler erhalten Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax, um sie in der Nähe von ”0′, 10′ in Zeile 1 zu verwenden

842850cookie-checkWie verwende ich die vorbereitete Anweisung von pdo für Order by- und Limit-Klauseln?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy