valores tipos retornar pasar parametros parametro otro mandar funciones formulario enviar datos como arreglo php mysql parameters yii

php - tipos - "Número de parámetro inválido: parámetro no definido" Insertar datos



retornar valores de php a html (4)

Obtuve este error cuando trato de 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 puede tener parámetros no utilizados en la matriz pasada a execute() . Cada valor en el conjunto pasado a execute() debe usar en su declaración preparada.

Esto también se especifica en los docs :

No es posible enlazar más valores de los especificados; 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.

ACTUALIZAR

Estaba cometiendo un pequeño 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 el patrón de registro activo 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 pudo ejecutar la instrucción SQL: SQLSTATE [HY093]: Número de parámetro inválido: parámetro no 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);

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


Puede ser que estés intentando vincular un parámetro dentro de comillas simples en lugar de dejar que haga el trabajo por ti.

Comparar:

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

Con:

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


Solo para proporcionar una respuesta, porque este error es bastante común, aquí hay algunas causas:

1) El nombre del :parameter no coincide con el enlace por error (¿error de escritura?). Esto es lo que sucedió aquí. Él tiene :alias en la declaración de SQL, pero obligado :username . Por lo tanto, cuando se intentó el enlace param, Yii / PDO no pudo encontrar :username de :username en la sentencia sql, lo que significa que era "un parámetro corto" y arrojó un error.

2) Olvidando por completo agregar bindValue() para un parámetro. Esto es más fácil de hacer en Yii otras construcciones como $critera , donde tienes 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 usan together y se 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 habilitar el registro de parámetros en su archivo de configuración. Agregue esto a su matriz db en su archivo de configuración:

''enableParamLogging''=>true,

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


Una causa de este error para mí no cubierto anteriormente es cuando se trata de una matriz dinámica de parámetros si desarma cualquier parámetro, necesita reindexar antes de pasarlos. La parte brutal de esto es que su registro de errores no lo hace muestra los índices para que parezca que todo está bien. P.ej:

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

Puede producir el Log: Número de parámetro inválido: parámetro no definido con params ("x", "y", "z")

Parece que no debería arrojar un error, pero si los índices son algo así como:

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

Considera el último parámetro indefinido porque busca la clave 2.