Mysql
 sql >> база данни >  >> RDS >> Mysql

LIMIT ключова дума в MySQL с подготвено изявление

Ето проблема:

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

Страницата с ръководството за PDOStatement::execute() казва (подчертавам моето):

Параметри

input_parameters Масив от стойности с толкова елементи, колкото има свързани параметри в SQL оператора, който се изпълнява. Всички стойности се третират като PDO::PARAM_STR .

По този начин вашите параметри се вмъкват като низове, така че крайният SQL код изглежда така:

LIMIT '0', '10'

Това е конкретен случай, в който MySQL няма да прехвърля към число, но ще задейства грешка при синтактичен анализ:

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

Какви документи трябва да кажа:

LIMIT клаузата може да се използва за ограничаване на броя на редовете, върнати от SELECT изявление. LIMIT приема един или два числови аргумента, като и двете трябва да са неотрицателни целочислени константи, с тези изключения:

  • В рамките на подготвени оператори, LIMIT параметрите могат да се задават с помощта на ? маркери за място.

  • В рамките на съхранените програми LIMIT параметрите могат да бъдат посочени с помощта на рутинни параметри с целочислени стойности или локални променливи.

Вашият избор включва:

  • Свържете параметрите един по един, за да можете да зададете тип:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Не предавайте тези стойности като параметри:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Деактивирайте емулираната подготовка (драйверът на MySQL има грешка/функция, която ще го накара да цитира числови аргументи):

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Емулирайте MySQL LIMIT клауза в Microsoft SQL Server 2000

  2. MySQL - ПОРЪЧАЙТЕ ПО стойности в рамките на IN()

  3. Моите MySQL сървърни връзки криптирани и безопасни ли са?

  4. имплодиране на списък за използване в клауза IN на python MySQLDB

  5. Как да използвам неподписани int/long типове с Entity Framework?