sql >> Database teknologi >  >> RDS >> Mysql

LIMIT søgeord på MySQL med forberedt erklæring

Her er problemet:

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

Manualsiden til PDOStatement::execute() siger (fremhæver mit):

Parametre

input_parameters En matrix af værdier med lige så mange elementer, som der er bundne parametre i den SQL-sætning, der udføres. Alle værdier behandles som PDO::PARAM_STR .

Dine parametre bliver således indsat som strenge, så den endelige SQL-kode ser sådan ud:

LIMIT '0', '10'

Dette er et særligt tilfælde, hvor MySQL ikke vil caste til nummer, men udløse en parse-fejl:

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

Hvilke dokumenter må sige:

LIMIT klausul kan bruges til at begrænse antallet af rækker, der returneres af SELECT udmelding. LIMIT tager et eller to numeriske argumenter, som begge skal være ikke-negative heltalskonstanter, med disse undtagelser:

  • Indenfor forberedte erklæringer, LIMIT parametre kan angives ved hjælp af ? pladsholdermarkører.

  • Inden for lagrede programmer, LIMIT parametre kan specificeres ved hjælp af heltalsværdier rutineparametre eller lokale variabler.

Dine valg omfatter:

  • Bind parametre en efter en, så du kan indstille en type:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Send ikke disse værdier som parametre:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Deaktiver emulerede forberedelser (MySQL-driveren har en fejl/funktion, der får den til at citere numeriske argumenter):

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


  1. 2 måder at returnere ASCII-koden for en given karakter i MariaDB

  2. Sådan automatiseres udrulning af PostgreSQL-database

  3. Sådan fungerer SUBSTRING_INDEX() i MariaDB

  4. Implementering af SQL Server Performance Indicator for forespørgsler, lagrede procedurer og triggere