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

Ostrzeżenie:PDOstatement::execute():SQLSTATE[HY093]:Nieprawidłowy numer parametru:parametr nie został zdefiniowany w...filetext

Jeśli używasz parametrów pozycyjnych, tablica parametrów, które przekazujesz do execute() musi być tablicą porządkową. Podobnie, jeśli używasz nazwanych parametrów, tablica musi być tablicą asocjacyjną.

Oto test potwierdzający zachowanie:

$stmt = $db->prepare("SELECT ?, ? ,?");

$params = array( 'a', 'b', 'c' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$stmt = $db->prepare("SELECT :A, :B, :C");

$params = array( 'a', 'b', 'c' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

Zauważ, że w obecnych wersjach PHP klucze tablicy asocjacyjnej nie muszą być poprzedzone : jak komentuje @prodigitalson. : prefiks był wymagany w kluczach tablicowych w starszych wersjach PHP.

Warto również wspomnieć, że napotkałem błędy i nieprzewidywalne zachowanie, gdy próbowałem mieszać parametry pozycyjne i parametry nazwane w jednym zapytaniu. Możesz użyć obu stylów w różnych zapytań w Twojej aplikacji, ale wybierz taki lub inny styl dla danego zapytania.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zrozumienie widoków w SQL

  2. Błąd MySql:1364 Pole 'display_name' nie ma wartości domyślnej

  3. Przejście z MySQL 5.7 do MySQL 8.0 — co powinieneś wiedzieć

  4. MySQL:Klonowanie bazy danych MySQL na tej samej instancji MySql

  5. Ignoruj ​​komunikaty o błędach mysql podczas wykonywania pliku sql