sql >> Databáze >  >> RDS >> Mysql

Varování:PDOStatement::execute():SQLSTATE[HY093]:Neplatné číslo parametru:parametr nebyl definován v...text souboru

Pokud používáte poziční parametry, pole parametrů, které předáte execute() musí být řadové pole. Podobně, pokud použijete pojmenované parametry, pole musí být asociativní pole.

Zde je test k potvrzení chování:

$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());
}

Všimněte si, že v aktuálních verzích PHP se klíče asociativního pole nedělají musí mít předponu : jak komentuje @prodigitalson. : prefix býval vyžadován v klíčích pole ve starších verzích PHP.

Za zmínku také stojí, že jsem se setkal s chybami a nepředvídatelným chováním, když jsem se snažil smíchat poziční parametry a pojmenované parametry v jediném dotazu. Oba styly můžete použít v různých dotazy ve vaší aplikaci, ale pro daný dotaz zvolili ten či onen styl.




  1. Jak provést proceduru uvnitř balíčku v Oracle

  2. Jak přiměju SQLAlchemy, aby správně vložila unicode elipsu do tabulky mySQL?

  3. Správné použití BoneCP

  4. Nemohu spustit bundler, stále se zobrazuje chyba