Estoy tratando de usar un envío HTML que se completa desde una matriz asociativa de una base de datos SQL, pero me gustaría pasar varios valores en lugar de los habituales 1. He intentado usar JSON en el valor, con las variables y luego decodifique el JSON más tarde para recuperar las variables individuales.

<select name="name">
<?php
foreach($array as $vals){
  echo '<option value={"a":".'$vals['1']'.","b":".'$vals['2']'.","c":".'$vals['3']'.","d":".'$vals['4']'."}>Option Name</option>';
}?>
</select>

Funciona según lo previsto hasta que una de las opciones tiene un espacio en la cadena y luego en la página HTML. Termino con un problema donde de alguna manera se inserta un "extra en el espacio, por lo que mi navegador muestra el valor:

{"a":"x" y","b":"xy","c":"xyz","d":"xyzz"}

El problema es la "x" y "que esperaba ser" x y ".

¿Alguien tiene ideas sobre cómo puedo solucionar esto? ¿O igualmente cualquier otro método para lograr el mismo resultado?

1
James 19 ene. 2018 a las 21:43

3 respuestas

La mejor respuesta

Debe poner comillas alrededor del atributo value para que los espacios no lo terminen. Utilice también htmlentities() para codificar otros caracteres especiales.

Además, no construya JSON a mano, use json_encode().

foreach ($array as $vals) {
    $obj = ["a" => $vals[1], "b" => $vals[2], "c" => $vals[3], "d" => $vals[4]];
    $json = htmlentities(json_encode($obj));
    echo "<option value='$json'>Option Name</option>";
}
1
Barmar 19 ene. 2018 a las 19:01

Verifique la posición de. y '

echo '<option value={"a":".'$vals['1']'.","b":".'$vals['2']'.","c":".'$vals['3']'.","d":".'$vals['4']'."}>Option Name</option>';

Corregida

echo '<option value={"a":"'.$vals['1'].'","b":"'.$vals['2'].'","c":"'.$vals['3'].'","d":"'.$vals['4'].'"}>Option Name</option>';
0
Vivek Salvi 19 ene. 2018 a las 18:59

Construiría el JSON como una matriz de PHP y luego puede base64_encode (json_encode ()) la matriz. Esto sería más fácil de leer y no tiene que preocuparse por otros casos extremos con esta solución.

0
Scott Keck-Warren 19 ene. 2018 a las 18:51