Heim >Backend-Entwicklung >PHP-Tutorial >Wie verwende ich LIMIT korrekt mit vorbereiteten Anweisungen in MySQL?
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);gesetzt wird
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!