sql >> Databáze >  >> RDS >> Mysql

Klíčové slovo LIMIT na MySQL s připraveným příkazem

Zde je problém:

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

Manuální stránka pro PDOStatement::execute() říká (důraz můj):

Parametry

input_parameters Pole hodnot s tolika prvky, kolik je svázaných parametrů v právě prováděném SQL příkazu. Všechny hodnoty jsou považovány za PDO::PARAM_STR .

Vaše parametry se tedy vkládají jako řetězce, takže konečný kód SQL vypadá takto:

LIMIT '0', '10'

Toto je konkrétní případ, kdy MySQL nepřetypuje na číslo, ale spustí chybu analýzy:

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

Jaké dokumenty musím říct:

LIMIT klauzuli lze použít k omezení počtu řádků vrácených pomocí SELECT prohlášení. LIMIT přebírá jeden nebo dva číselné argumenty, které musí být oba nezáporné celočíselné konstanty, s těmito výjimkami:

  • V rámci připravených příkazů LIMIT parametry lze zadat pomocí ? zástupné značky.

  • V rámci uložených programů LIMIT parametry lze zadat pomocí celočíselných parametrů rutiny nebo lokálních proměnných.

Mezi vaše možnosti patří:

  • Svažte parametry jeden po druhém, abyste mohli nastavit typ:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Tyto hodnoty nepředávejte jako parametry:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Zakázat emulované přípravy (ovladač MySQL obsahuje chybu/funkci, která způsobí, že bude citovat číselné argumenty):

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


  1. Jak odstraním rozšířené znaky ASCII z řetězce v T-SQL?

  2. Přechod z MySQL na PostgreSQL - tipy, triky a problémy?

  3. Jak pomocí PL/SQL dostanu obsah souboru do blobu?

  4. PostgreSQL UNIX doménové sokety vs TCP sokety