Mysql
 sql >> Datenbank >  >> RDS >> Mysql

LIMIT-Schlüsselwort auf MySQL mit vorbereiteter Anweisung

Hier ist das Problem:

$comments = $db->prepare($query); 
/* where $db is the PDO object */ 
$comments->execute(array($post, $min, $max));

Die Handbuchseite für PDOStatement::execute() sagt (Hervorhebung von mir):

Parameter

input_parameters Ein Array von Werten mit so vielen Elementen wie gebundene Parameter in der ausgeführten SQL-Anweisung vorhanden sind. Alle Werte werden als PDO::PARAM_STR behandelt .

Daher werden Ihre Parameter als Zeichenfolgen eingefügt, sodass der endgültige SQL-Code folgendermaßen aussieht:

LIMIT '0', '10'

Dies ist ein besonderer Fall, in dem MySQL nicht in eine Zahl umwandelt, sondern einen Parsing-Fehler auslöst:

mysql> SELECT 1 LIMIT 0, 10;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

mysql> SELECT 1 LIMIT '0', '10';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1

Welche Dokumente muss sagen:

Das LIMIT -Klausel kann verwendet werden, um die Anzahl der Zeilen einzuschränken, die von SELECT zurückgegeben werden Erklärung. LIMIT nimmt ein oder zwei numerische Argumente entgegen, die beide nichtnegative ganzzahlige Konstanten sein müssen, mit folgenden Ausnahmen:

  • Innerhalb vorbereiteter Anweisungen LIMIT Parameter können mit ? Platzhaltermarkierungen.

  • Innerhalb gespeicherter Programme LIMIT Parameter können mit ganzzahligen Routineparametern oder lokalen Variablen angegeben werden.

Sie haben folgende Auswahlmöglichkeiten:

  • Binden Sie die Parameter einzeln, damit Sie einen Typ festlegen können:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Übergeben Sie diese Werte nicht als Parameter:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Deaktivieren Sie emulierte Vorbereitungen (der MySQL-Treiber hat einen Fehler/eine Funktion, die ihn dazu bringt, numerische Argumente zu zitieren):

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);