Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Słowo kluczowe LIMIT na MySQL z przygotowaną instrukcją

Oto problem:

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

Strona podręcznika dla PDOStatement::execute() mówi (podkreślenie moje):

Parametry

input_parameters Tablica wartości zawierająca tyle elementów, ile jest powiązanych parametrów w wykonywanej instrukcji SQL. Wszystkie wartości są traktowane jako PDO::PARAM_STR .

W ten sposób twoje parametry są wstawiane jako ciągi, więc końcowy kod SQL wygląda tak:

LIMIT '0', '10'

Jest to szczególny przypadek, w którym MySQL nie będzie rzutować na numer, ale wywoła błąd parsowania:

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

Jakie dokumenty muszę powiedzieć:

LIMIT klauzula może być użyta do ograniczenia liczby wierszy zwracanych przez SELECT oświadczenie. LIMIT przyjmuje jeden lub dwa argumenty liczbowe, które muszą być nieujemnymi stałymi całkowitymi, z następującymi wyjątkami:

  • W ramach przygotowanych instrukcji LIMIT parametry można określić za pomocą ? znaczniki zastępcze.

  • W ramach zapisanych programów LIMIT parametry można określić za pomocą parametrów procedury o wartościach całkowitych lub zmiennych lokalnych.

Twoje wybory obejmują:

  • Powiąż parametry jeden po drugim, aby ustawić typ:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Nie przekazuj tych wartości jako parametrów:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Wyłącz emulowane przygotowania (sterownik MySQL ma błąd/funkcję, która powoduje, że cytuje argumenty numeryczne):

    $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. Ponowne podporządkowanie uszkodzonego serwera MySQL Master w konfiguracji replikacji półsynchronicznej

  2. CodeIgniter:Nie można połączyć się z serwerem bazy danych przy użyciu dostarczonych ustawień Komunikat o błędzie

  3. Ostrzeżenie:mysqli_connect():(HY000/1045):Odmowa dostępu dla użytkownika 'username'@'localhost' (przy użyciu hasła:TAK)

  4. MySQL Zmiana sortowania wszystkich tabel

  5. automatyczny przyrost pierwotny pozostawiając przerwy w liczeniu