Verwenden des LIMIT-Schlüsselworts mit vorbereiteten Anweisungen in MySQL
Die LIMIT-Klausel in MySQL wird verwendet, um die Anzahl der von einer SELECT-Abfrage zurückgegebenen Zeilen einzuschränken . Bei der Verwendung von LIMIT mit vorbereiteten Anweisungen (PDO) können jedoch Probleme auftreten, wenn Benutzer Werte für die Parameter als Zeichenfolgen angeben.
Problemidentifizierung:
Der Fehler tritt auf weil die Methodeexecute() von PDO automatisch alle Parameter als Strings behandelt, unabhängig von ihrem tatsächlichen Datentyp. Dies kann zu Analysefehlern führen, wenn in der LIMIT-Klausel numerische Werte erwartet werden.
Zum Beispiel schlägt die folgende Abfrage mit einem Analysefehler fehl:
SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT ?, ?
Wenn die Parameter ($min und $max) als Zeichenfolgen übergeben werden, lautet die resultierende SQL-Anweisung:
LIMIT '0', '10'
Dies ist eine ungültige Syntax in MySQL, da die Werte für LIMIT lauten sollten numerisch.
Lösungen:
Es gibt mehrere Möglichkeiten, dieses Problem zu beheben:
Binden Sie die Parameter explizit an die Anweisung und geben Sie ihre jeweiligen Daten an Typen:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
Anstatt die Werte für LIMIT als Parameter zu übergeben, hängen Sie sie manuell an die Abfrage an string:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
Der MySQL-Treiber verfügt über eine Funktion, die numerische Argumente in vorbereiteten Anweisungen zitiert. Dies kann deaktiviert werden, indem das Attribut ATTR_EMULATE_PREPARES auf FALSE:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
Das obige ist der detaillierte Inhalt vonWie verwende ich LIMIT korrekt mit vorbereiteten Anweisungen in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!