2011-05-03 21 views
28

ACTUALIZACIÓN"número de parámetro no válido: parámetro no se define" Insertar datos

que estaba haciendo una pequeña error al enumerar los VALORES. Debería haber puesto ": username" y no ": alias". Supongo que el crédito de respuesta a esta pregunta es libre para cualquiera que lo desee. ¿O borro la pregunta?

ORIGINAL

He estado usando Active Record de Yii por un tiempo. Ahora, mi proyecto necesita acceder a una base de datos diferente para una pequeña transacción. Pensé que el DAO de Yii sería bueno para esto. Sin embargo, estoy recibiendo un error críptico.

CDbCommand no se pudo ejecutar la sentencia SQL: SQLSTATE [HY093]: número de parámetro no válido: parámetro no fue definido

Aquí está mi código:

public function actionConfirmation 
{ 
    $model_person = new TempPerson(); 

    $model = $model_person->find('alias=:alias',array(':alias'=>$_GET['alias'])); 
    $connection=Yii::app()->db2; 
      $sql = "INSERT INTO users (username, password, ssn, surname 
        , firstname, email, city, country) 
        VALUES(:alias, :password, :ssn, :surname 
        , :firstname, :email, :city, :country)"; 
      $command=$connection->createCommand($sql); 
      $command->bindValue(":username", $model->alias); 
      $command->bindValue(":password", substr($model->ssn, -4,4)); 
      $command->bindValue(":ssn", $model->ssn); 
      $command->bindValue(":surname", $model->lastName); 
      $command->bindValue(":firstname", $model->firstName); 
      $command->bindValue(":email", $model->email); 
      $command->bindValue(":city", $model->placeOfBirth); 
      $command->bindValue(":country", $model->placeOfBirth); 
      $command->execute(); 
      $this->render('confirmation',array('model'=>$model)); 
} 

Esto construye la siguiente consulta (como se ve en el registro de la aplicación):

INSERT INTO users (username, password, ssn, surname, firstname, email 
        , city, country) 
VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country); 

FYI $model->placeOfBirth se supone que está en valores de ciudad y condado. Eso no es un error tipográfico (solo una tontería que tengo que hacer).

Respuesta

73

sólo para proporcionar una respuesta - debido a este error es bastante común - aquí están algunas causas:

1) El nombre :parameter no coincide con el aprieto por error (error tipográfico)?. Esto es lo que sucedió aquí. Tiene :alias en la declaración de SQL, pero está limitado a :username. Entonces, cuando se intentó el enlace param, Yii/PDO no pudo encontrar :username en la instrucción sql, lo que significa que era "un parámetro corto" y arrojó un error.

2) Olvidando completamente agregar el bindValue() para un parámetro. Esto es más fácil de hacer en Yii otras construcciones como $critera, donde tiene una matriz o params ($criteria->params = array(':bind1'=>'test', ':bind2'=>'test)).

3) Conflictos extraños con la paginación y/o clasificación de CDataProvider cuando se usa together y joins. No hay una manera específica y fácil de caracterizar esto, pero cuando uso consultas complejas en CDataProviders he tenido problemas extraños con los parámetros que se descartan y se produce este error.

Una forma muy útil de solucionar estos problemas en Yii es a enable parameter logging en su archivo de configuración. Agregue esto a su gama db en el fichero de configuración:

'enableParamLogging'=>true, 

Y asegúrese de que la ruta CWebLogRoute está configurado en su sección log. Esto imprimirá la consulta que dio y el error, y todos los parámetros que intentaba enlazar. Súper útil!

+4

Good post. Encontré en mi instancia que tenía un espacio después de uno de los nombres de columna y eso fue suficiente para arrojar el error. – salonMonsters

+4

Mi problema era una diéresis en el nombre ': parameter' ... – testing

+1

Una lista de caracteres válidos de marcadores de posición aquí http://stackoverflow.com/questions/5809951/pdo-valid-characters-for-placeholders – maartenmachiels

4

Puede estar intentando vincular un parámetro dentro de comillas simples en lugar de dejar que haga el trabajo por usted.

Compare:

Model::model()->findAll("t.description ilike '%:filter%'", array(':filter' => $filter)); 

Con:

Model::model()->findAll("t.description ilike :filter", array(':filter' => '%' . $filter . '%')); 
4

A causa de este error para mí no especificado anteriormente es cuando se está tratando con una matriz dinámica de parámetros si desactivar cualquier params, necesitas reindexar antes de pasarlos. La parte brutal de esto es que tu registro de errores no muestra índices, así que parece que todo está bien. Ej:

SELECT id WHERE x = ?, y = ?, z = ? 

podría producir el registro: número de parámetro no válido: parámetro no se definió con params ("x", "y", "z")

Esto parece que no se debe tirar un error, pero si los índices son algo así como:

0 => x, 1 => y, 4 => z 

se considera el último parámetro definido porque está buscando llave 2.

+1

Agregando a su respuesta que una simple print_r mostrará los índices y que se puede arreglar con valores_arreglos, ya que reindexará la matriz comenzando en 0 – chifliiiii

0

tengo este error al intentar hacer algo como:

$stmt = $pdo->prepare("select name from mytable where id = :id"); 
$stmt->execute([ 
    'id' => $id, 
    'unusedvar' => $foo, // This row causes the error. 
]); 

Básicamente, no se puede tener parámetros utilizados en la matriz pasada a execute(). Todos los valores en el conjunto pasado a execute() se deben usar en su declaración preparada.

Esto también se especifica en la docs:

de unión más valores que especificado no es posible; si existen más claves en los parámetros de entrada que en el SQL especificado en el PDO :: prepare(), la instrucción fallará y se emitirá un error.

Cuestiones relacionadas