sentencias - Enlazar múltiples parámetros en la consulta mysqli
sentencias preparadas php mysqli (1)
Aquí va la solución o el problema real de vincular un número variable de valores a la declaración preparada de mysqli:
<?php
$values = array(''b'',''c'',''d'');
$in = str_repeat("?,", count($values));
$in = trim($in, ",");
$sql = "SELECT * from users where username in($in)";
$stm = $con->prepare($sql);
$types = str_repeat("s", count($values));
if (strnatcmp(phpversion(),''5.3'') >= 0)
{
$bind = array();
foreach($values as $key => $val)
{
$bind[$key] = &$values[$key];
}
} else {
$bind = $values;
}
array_unshift($bind, $types);
call_user_func_array(array($stm, ''bind_param''), $bind);
#var_dump($sql, $types, $bind, $con->error);
$stm->execute();
$res = $stm->get_result();
while($row = $res->fetch_assoc()) var_dump($row);
La línea comentada es solo para pruebas de desarrollo. Extremadamente útil.
Pero su problema inicial fue la falta de informes de errores.
Te echó a perder no solo en este caso en particular, sino en toda tu experiencia con PHP.
Cada vez que algo sale mal, PHP te dirá: qué sucedió y a quién culpar. Solo si lo dejas. Y siempre deberías.
Puede leer esta respuesta sobre los principios básicos de informes de errores
Mientras tiene un mensaje de error, puede buscarlo y encontrar una solución en segundos. O al menos sabrá, qué cierto problema tiene. Que es realmente el comportamiento de la función call_user_func_array()
, que se cambió de repente.
En este momento, tengo que usar la siguiente estructura para hacer frente a la vinculación de múltiples parámetros en una consulta mysqli:
if ($words_total == 1)
{
$statement -> bind_param("s", $words[0]);
}
else if ($words_total == 2)
{
$statement -> bind_param("ss", $words[0], $words[1]);
}
else if ($words_total == 3)
{
$statement -> bind_param("sss", $words[0], $words[1], $words[2]);
}
//and so on....
Resuelvo el número de signos de interrogación usando el siguiente código e inserto en mi consulta:
$marks = "";
for($i = 1; $i<=$words_total; $i++) {
if ($i == $words_total)
{
$marks .= "?";
}
else
{
$marks .= "?,";
}
}
Mi pregunta es, seguramente, que debe haber una forma de manejar tantas entradas en la consulta como necesite dinámicamente. La codificación de bind_param () parece una forma realmente mala de manejar esto.
Estoy usando php versión 5.4.10