sql >> Databasteknik >  >> RDS >> Mysql

LIMIT nyckelord på MySQL med förberett uttalande

Här är problemet:

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

Manualsidan för PDOStatement::execute() säger (min betoning):

Parametrar

input_parameters En matris med värden med lika många element som det finns bundna parametrar i SQL-satsen som körs. Alla värden behandlas som PDO::PARAM_STR .

Dina parametrar infogas därför som strängar, så den slutliga SQL-koden ser ut så här:

LIMIT '0', '10'

Detta är ett speciellt fall där MySQL inte kommer att casta till nummer utan utlöser ett parsefel:

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

Vilka dokument måste säga:

LIMIT sats kan användas för att begränsa antalet rader som returneras av SELECT påstående. LIMIT tar ett eller två numeriska argument, som båda måste vara icke-negativa heltalskonstanter, med dessa undantag:

  • Inom förberedda uttalanden, LIMIT parametrar kan specificeras med ? platshållarmarkörer.

  • Inom lagrade program, LIMIT parametrar kan specificeras med heltalsvärde rutinparametrar eller lokala variabler.

Dina val inkluderar:

  • Bind parametrar en efter en så att du kan ställa in en typ:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Skicka inte dessa värden som parametrar:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Inaktivera emulerade förberedelser (MySQL-drivrutinen har en bugg/funktion som gör att den citerar numeriska argument):

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


  1. Konfigurera AlwaysOn-tillgänglighetsgrupper - Del 2

  2. Vad är MySQL-ekvivalenten för STUFF() i SQL Server?

  3. Hur du komprimerar din databas så att den går snabbare

  4. Oracle hur man exporterar en fråga till en text/csv-fil