Bucle mysqli, devuelve solo uno

Estoy tratando de crear varios menús desplegables, pero solo se usa el último elemento de la matriz.

$arr = explode("\n", $ingredients);
foreach($arr as $value){

print '<select size="1" name="a[]"><option>'.$value.'</option>';

$stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%$value%'");
    while ($loop = $stmt->fetch_assoc()) {
        print '<option value="'.$loop[FoodId].'">'.$loop[DanName].'</option>';
    }
print '</select>';
}

$arr se parece a esto:

Array ( [0] => mel [1] => ost [2] => mælk ).

Pero solo se procesa el último valor [2].

Respuestas de seguimiento Quiero múltiples menús desplegables con múltiples selecciones. Se muestran todos los menús desplegables, pero solo el último menú desplegable se completa desde la base de datos.

preguntado el 02 de diciembre de 13 a las 08:12

Pregunta: ¿Realmente ve los menús desplegables de selección múltiple, pero solo la selección seleccionada vuelve a PHP? -

Otra pregunta, ya que no conozco su contexto: desea tener MÚLTIPLES cuadros desplegables, con MÚLTIPLES valores en cada cuadro desplegable, ¿verdad? ¿O solo quería tener 1 cuadro desplegable con MÚLTIPLES valores? -

Veo los menús desplegables de selección múltiple, pero solo uno está lleno de valores de la base de datos. -

2 Respuestas

En primer lugar, sus menús desplegables no deben tener el mismo nombre en forma de matriz a[]. Ahora tiene varios cuadros desplegables, pero todos tienen el mismo nombre. Solo use nombres de matriz si puede tener una selección múltiple. (Por ejemplo, una lista en la que mantiene presionada la tecla Mayús mientras realiza una selección múltiple. O con casillas de verificación.

Tampoco tiene mucho sentido, porque no tendría una referencia a qué cuadro desplegable pertenece a qué valor seleccionado.

En segundo lugar, como ya se sugirió, escape sus valores antes de ponerlos en componentes HTML. Te sugiero que uses htmlspecialchars() para esto.

En tercer lugar, encapsule las claves de matriz con nombre. $loop[FoodId] => $loop['FoodId']. Esto podría evitar avisos/advertencias que podrían romper su HTML.

En realidad, no estoy seguro de si desea tener MÚLTIPLES cuadros desplegables, con MÚLTIPLES valores en cada uno. O simplemente desea tener 1 cuadro desplegable con MÚLTIPLES valores en él.

En el primer caso:

Pruébelo así:

$arr = explode("\n", $ingredients);
for($i = 0; $i < count($arr); $i++) {
    print '<select size="1" name="a{$i}"><option>'.htmlspecialchars($arr[$i]).'</option>';
    $stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%{$arr[$i]}%'");
        while ($loop = $stmt->fetch_assoc()) {
            print '<option value="'.$loop['FoodId'].'">'.htmlspecialchars($loop['DanName']).'</option>';
        }
    print '</select>';
}

Luego, en PHP mira hacia atrás para $_REQUEST['a0'], $_REQUEST['a1'], $_REQUEST['a2']Etc. ...

En el segundo caso:

Pruébelo así:

$arr = explode("\n", $ingredients);
print '<select size="1" name="a"><option>'.htmlspecialchars($value).'</option>';
foreach($arr as $value){
    $stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%$value%'");
        while ($loop = $stmt->fetch_assoc()) {
            print '<option value="'.$loop['FoodId'].'">'.htmlspecialchars($loop['DanName']).'</option>';
        }
}
print '</select>';

Moviendo así el <select> fuera del foreach. En PHP luego busque $_REQUEST['a'].

EDITAR

Según los comentarios a continuación, normalice sus nuevas líneas:

$ingredients = str_replace("\r","\n", $ingredients); // normalize
$ingredients = str_replace("\n\n","\n", $ingredients); // normalize
$arr = explode("\n", $ingredients);
for($i = 0; $i < count($arr); $i++) {
    print '<select size="1" name="a{$i}"><option>'.htmlspecialchars($arr[$i]).'</option>';
    $stmt = $mysqli->query("SELECT FoodId, DanName FROM FoodInfo WHERE DanName LIKE '%{$arr[$i]}%'");
        while ($loop = $stmt->fetch_assoc()) {
            print '<option value="'.$loop['FoodId'].'">'.htmlspecialchars($loop['DanName']).'</option>';
        }
    print '</select>';
}

Respondido el 02 de diciembre de 13 a las 12:12

Primero; Realmente no importa que se conozcan, pero es una gran idea de todos modos. Segundo; Usé declaraciones preparadas antes, pero las eliminé para probarlas. Tercero; No he tenido problemas, pero nuevamente excelente información, tanques. Quiero tener MÚLTIPLES cuadros desplegables, con MÚLTIPLES valores en cada uno. - Sims

@Sims Ok, visto sus respuestas de seguimiento, realmente diría que necesita verificar si tiene algún valor en la base de datos, ya que todo el código se ve bien. Así en la tabla FoodInfo, ¿tiene filas con DanName "Ser" mel or ost ? - nl-x

lo hago, si ost or mel es el último en la matriz, obtengo muchos resultados. Creo que el problema está en algún lugar de mysqli. - Sims

No me atrevo a preguntar, pero es el FoodId Quizas null a veces ? - nl-x

No, no es NULL en ninguna parte. - Sims

Las claves de matriz en $loop[FoodId] y $loop[DanName] deben citarse, o PHP los tratará como constantes no inicializadas. Además, probablemente debería ejecutarlos a través de una codificación HTML, para evitar ataques como XSS. Haciendo algunas suposiciones sobre los resultados deseados, es posible que desee probar algo como esto como el cuerpo de su bucle while:

$foodId  = htmlentities($loop['FoodId'], ENT_COMPAT|ENT_HTML5, 'UTF-8');
$danName = htmlentities($loop['DanName'], ENT_COMPAT|ENT_HTML5, 'UTF-8');
echo '<option value="'.$foodId.'">'.$danName.'</option>';

Además, no está claro dónde se originaron $ingredients, pero si se ve afectado de alguna manera por la entrada del usuario, realmente debería considerar usar una consulta parametrizada con $value como parámetro vinculado. Desafortunadamente, la API mysqli puede hacer que esto sea un poco doloroso, por lo que es posible que desee considerar cambiar a php: DOP en cambio; si no, php:mysqli.prepare Es probablemente un buen lugar para comenzar.

Respondido el 02 de diciembre de 13 a las 08:12

Estoy usando declaraciones preparadas, solo se eliminó para probar en este momento. También estoy usando preg_replace en las salidas que se ven afectadas por la entrada del usuario. - Sims

Es bueno escucharlo, aunque le insto a que considere htmlentities() sobre preg_replace(). Mantener su propia tabla de caracteres de expresiones regulares cuando htmlentities() ya proporciona una probablemente no sea una idea fantástica. :) - TML

Bien, gracias por su preocupación por la seguridad, excelente información :) - Sims

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.