variable uncaught una udclist sqlstate solucion remove pdoexception pasar parameter otra number not invalid hy093 funcion define php mysql pdo

php - uncaught - SQLSTATE[HY093]: número de parámetro inválido: parámetro no definido



uncaught pdoexception sqlstate hy093]: invalid parameter number parameter was not define (2)

// BUILD VALUES $count = count($matches); for($i = 0; $i < $count; ++$i) { $values[] = ''(?)''; } // INSERT INTO DATABASE $q = $this -> dbc -> prepare("INSERT INTO hashes (hash) VALUES " . implode('', '', $values) . " ON DUPLICATE KEY UPDATE hash = hash"); $q -> execute($matches);

El código anterior falla con el siguiente error

SQLSTATE [HY093]: número de parámetro inválido: parámetro no definido

Aunque cuando count($matches) == count($values) justo antes de ejecutar se llama?

¿Que esta pasando aqui?


SQLSTATE [HY093]: número de parámetro inválido: parámetro no definido

Lamentablemente, este error no es descriptivo para una serie de problemas diferentes relacionados con el mismo problema: un error vinculante. Tampoco especifica dónde está el error, por lo que su problema no está necesariamente en la ejecución, sino en la sentencia sql que ya estaba ''preparada''.

Estos son los posibles errores y sus soluciones:

  1. Hay una discrepancia de parámetros: el número de campos no coincide con los parámetros que se han vinculado. Tenga cuidado con las matrices en matrices. Para verificarlo dos veces, use var_dump ($ var) . " print_r " no necesariamente le muestra si el índice en una matriz es otra matriz (si la matriz tiene un valor), mientras que var_dump sí lo hará.

  2. Ha intentado enlazar utilizando el mismo valor de enlace, por ejemplo: ": hash" y ": hash". Cada índice tiene que ser único, incluso si tiene sentido utilizarlo para dos partes diferentes, incluso si tiene el mismo valor. (es similar a una constante pero más como un marcador de posición)

  3. Si está vinculando más de un valor en una declaración (como suele ser el caso con un "INSERTAR"), debe vincularParam y luego bindValue a los parámetros. El proceso aquí es vincular los parámetros a los campos y luego vincular los valores a los parámetros.

    // Code snippet $column_names = array(); $stmt->bindParam('':''.$i, $column_names[$i], $param_type); $stmt->bindValue('':''.$i, $values[$i], $param_type); $i++; //.....

  4. Al vincular valores a column_names o table_names puede usar ``, pero no es necesario, pero asegúrese de ser coherente.

  5. Cualquier valor en '''' comillas simples siempre se trata como una cadena y no se leerá como un nombre de columna / tabla o marcador de posición para enlazar.


Este error que está recibiendo:

SQLSTATE [HY093]: número de parámetro inválido: parámetro no definido

se debe a que el número de elementos en $values & $matches no es el mismo o $matches contiene más de 1 elemento.

Si $matches contiene más de 1 elemento, la inserción fallará, porque solo hay un nombre de columna referenciado en la consulta ( hash )

Si $values & $matches no contienen el mismo número de elementos, la inserción también fallará, debido a que la consulta espera x params pero está recibiendo y data $matches .

Creo que también deberá asegurarse de que el hash de la columna también tenga un índice único.

Prueba el código here :

<?php /*** mysql hostname ***/ $hostname = ''localhost''; /*** mysql username ***/ $username = ''root''; /*** mysql password ***/ $password = ''''; try { $dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password); /*** echo a message saying we have connected ***/ echo ''Connected to database''; } catch(PDOException $e) { echo $e->getMessage(); } $matches = array(''1''); $count = count($matches); for($i = 0; $i < $count; ++$i) { $values[] = ''?''; } // INSERT INTO DATABASE $sql = "INSERT INTO hashes (hash) VALUES (" . implode('', '', $values) . ") ON DUPLICATE KEY UPDATE hash=''hash''"; $stmt = $dbh->prepare($sql); $data = $stmt->execute($matches); //Error reporting if something went wrong... var_dump($dbh->errorInfo()); ?>

Necesitarás adaptarlo un poco.

La estructura de la tabla que utilicé está here :

CREATE TABLE IF NOT EXISTS `hashes` ( `hashid` int(11) NOT NULL AUTO_INCREMENT, `hash` varchar(250) NOT NULL, PRIMARY KEY (`hashid`), UNIQUE KEY `hash1` (`hash`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

El código se ejecutó en mi servidor XAMPP que está utilizando PHP 5.3.8 con MySQL 5.5.16.

Espero que esto ayude.