Om du använder positionsparametrar, arrayen av parametrar du skickar till execute()
måste vara en ordinal array. På samma sätt, om du använder namngivna parametrar, måste arrayen vara en associativ array.
Här är ett test för att bekräfta beteendet:
$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());
}
Observera att i nuvarande versioner av PHP, inte de associativa arraynycklarna måste ha prefixet :
som @prodigitalson kommenterar. :
prefix brukade krävas i arraynycklar i äldre versioner av PHP.
Det är också värt att nämna att jag har stött på buggar och oförutsägbart beteende när jag försökt blanda positionsparametrar och namngivna parametrar i en enda fråga. Du kan använda båda stilarna i olika frågor i din app, men valde en eller annan stil för en given fråga.