El tutorial o código que verás en este artículo es la resolución más rápida y válida que encontramos a tus dudas o problema.
Solución:
Este error que está recibiendo:
SQLSTATE[HY093]: Número de parámetro no válido: el parámetro no se definió
es porque el número de elementos en $values
& $matches
no es lo mismo o $matches
contiene más de 1 elemento.
Si $matches
contiene más de 1 elemento, la inserción fallará, porque solo hay 1 nombre de columna al que se hace referencia en la consulta (hash
)
Si $values
& $matches
no contienen la misma cantidad de elementos, entonces la inserción también fallará, debido a que la consulta espera x parámetros pero está recibiendo y datos $matches
.
Creo que también deberá asegurarse de que el hash de la columna también tenga un índice único.
Prueba el código aquí:
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());
?>
Tendrás que adaptarlo un poco.
La estructura de la tabla que utilicé está aquí:
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 usa PHP 5.3.8 con MySQL 5.5.16.
Espero que esto ayude.
SQLSTATE[HY093]: Número de parámetro no válido: el parámetro no se definió
Desafortunadamente, este error no es descriptivo para una variedad de problemas diferentes relacionados con el mismo problema: un error de vinculación. Tampoco especifica dónde está el error, por lo que su problema no está necesariamente en la ejecución, sino en la declaración sql que ya estaba ‘preparada’.
Estos son los posibles errores y sus soluciones:
-
Hay una discrepancia de parámetros: el número de campos no coincide con los parámetros que se han vinculado. Cuidado con las matrices en matrices. Para verificar dos veces, use var_dump($var). “imprimir_r” no muestra necesariamente si el índice en un array es otro array (Si el array tiene un valor en él), mientras que var_dump voluntad.
-
Ha intentado enlazar utilizando el mismo valor de enlace, por ejemplo: “:hash” y “:hash”. Cada índice tiene que ser único, incluso si lógicamente tiene sentido usar el mismo para dos partes diferentes, incluso si es el mismo valor. (es similar a una constante pero más como un marcador de posición)
-
Si está vinculando más de un valor en una declaración (como suele ser el caso con un “INSERT”), debe vincular Param y luego vincular Valor 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++; //.....
-
Al vincular valores a column_names o table_names, puede usar “ pero no es necesario, pero asegúrese de ser coherente.
-
Cualquier valor en ” comillas simples siempre se trata como un string y no se leerá como un nombre de columna/tabla o marcador de posición para enlazar.
Yo tenía el mismo error. Mi problema fue usar el nombre de parámetro incorrecto al vincular.
Aviso :tokenHash en la consulta, pero :token_hash al atar. Arreglar uno u otro resuelve el error en este caso.
// Prepare DB connection
$sql = 'INSERT INTO rememberedlogins (token_hash,user_id,expires_at)
VALUES (:tokenHash,:user_id,:expires_at)';
$db = static::getDB();
$stmt = $db->prepare($sql);
// Bind values
$stmt->bindValue(':token_hash',$hashed_token,PDO::PARAM_STR);
Si sostienes alguna vacilación y disposición de avanzar nuestro post eres capaz de añadir un paráfrasis y con mucho gusto lo interpretaremos.