sql >> Database >  >> RDS >> Mysql

Waarschuwing:PDOStatement::execute():SQLSTATE[HY093]:Ongeldig parameternummer:parameter is niet gedefinieerd in...bestandstekst

Als u positionele parameters gebruikt, de reeks parameters die u doorgeeft aan execute() moet een ordinale array zijn. Evenzo, als u benoemde parameters gebruikt, moet de array een associatieve array zijn.

Hier is een test om het gedrag te bevestigen:

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

Merk op dat in de huidige versies van PHP de associatieve array-sleutels niet moeten worden voorafgegaan door : zoals @prodigitalson opmerkingen. De : voorvoegsel was vroeger vereist in array-sleutels in oudere versies van PHP.

Het is ook vermeldenswaard dat ik bugs en onvoorspelbaar gedrag ben tegengekomen toen ik probeerde positionele parameters en benoemde parameters in een enkele query te combineren. U kunt beide stijlen gebruiken in verschillende zoekopdrachten in uw app, maar kies een of andere stijl voor een bepaalde zoekopdracht.




  1. Hoe maak je een globaal configuratiebestand aan?

  2. Hoe UTC_TIME() werkt in MariaDB

  3. Accentongevoelige zoekopdracht in MySQL

  4. Excel-download loopt vast 188 kb