Heim >Backend-Entwicklung >PHP-Tutorial >Wie verwende ich LIMIT korrekt mit vorbereiteten Anweisungen in MySQL?

Wie verwende ich LIMIT korrekt mit vorbereiteten Anweisungen in MySQL?

Linda Hamilton
Linda HamiltonOriginal
2024-11-28 14:05:14651Durchsuche

How to Correctly Use LIMIT with Prepared Statements 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:

  1. Parameter einzeln binden:

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);
  1. Parameter nicht übergeben:

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);
  1. Emuliert deaktivieren Bereitet vor:

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn