sql >> Database >  >> RDS >> Mysql

LIMIT trefwoord op MySQL met voorbereide verklaring

Dit is het probleem:

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

De handleiding voor PDOStatement::execute() zegt (nadruk van mij):

Parameters

input_parameters Een array van waarden met zoveel elementen als er gebonden parameters zijn in de SQL-instructie die wordt uitgevoerd. Alle waarden worden behandeld als PDO::PARAM_STR .

Dus uw parameters worden ingevoegd als strings, dus de uiteindelijke SQL-code ziet er als volgt uit:

LIMIT '0', '10'

Dit is een specifiek geval waarin MySQL niet naar nummer cast maar een parseerfout veroorzaakt:

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

Wat docs moet zeggen:

De LIMIT clausule kan worden gebruikt om het aantal rijen te beperken dat wordt geretourneerd door de SELECT uitspraak. LIMIT neemt een of twee numerieke argumenten, die beide niet-negatieve integer-constanten moeten zijn, met de volgende uitzonderingen:

  • Binnen voorbereide verklaringen, LIMIT parameters kunnen worden opgegeven met ? tijdelijke aanduidingen.

  • Binnen opgeslagen programma's, LIMIT parameters kunnen worden gespecificeerd met behulp van routineparameters met een gehele waarde of lokale variabelen.

Uw keuzes omvatten:

  • Bind parameters één voor één zodat u een type kunt instellen:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Geef deze waarden niet door als parameters:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Schakel geëmuleerde voorbereidingen uit (het MySQL-stuurprogramma heeft een bug/functie waardoor het numerieke argumenten aanhaalt):

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


  1. SQLite Database geeft waarschuwing automatische index op <table_name>(kolom) Na het upgraden van Android L

  2. Hoe SHOW COLLATION werkt in MariaDB

  3. Controleer op mislukte e-mail in SQL Server (T-SQL)

  4. MariaDB JSON_ARRAY_APPEND() uitgelegd