Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Aviso:PDOStatement::execute():SQLSTATE[HY093]:Número de parâmetro inválido:o parâmetro não foi definido em...filetext


Se você usa parâmetros posicionais, o array de parâmetros que você passa para execute() deve ser uma matriz ordinal. Da mesma forma, se você usar parâmetros nomeados, a matriz deverá ser uma matriz associativa.

Aqui está um teste para confirmar o comportamento:
$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());
}

Observe que nas versões atuais do PHP, as chaves de matriz associativa não tem que ser prefixado com : como comentários @prodigitalson. O : prefixo costumava ser necessário em chaves de array em versões mais antigas do PHP.

Também vale a pena mencionar que encontrei bugs e comportamento imprevisível quando tentei misturar parâmetros posicionais e parâmetros nomeados em uma única consulta. Você pode usar qualquer um dos estilos em diferentes consultas em seu aplicativo, mas escolheu um estilo ou outro para uma determinada consulta.