1

Tengo dos select box, uno con provincias y otro con ciudades. Quiero que cuando se seleccione una provincia, el select box de las ciudades se actualice con los valores recibidos a partir de una llamada AJAX, pero algo falla y sus valores no cambian.

Éste es el código donde se realiza la llamada AJAX:

<!--ajax-->    
<script type="text/javascript">
    $(document).ready(function(){
        $('#provincia').on('change',function(){

            var provincia = $(this).val();

            $.ajax({
                    type:"POST", 
                    dataType:'html',
                    url : "pages/prueba.php",
                    data : { opcion: provincia },    
                    success: function(response){
                        alert("HOLA");
                        $("#ciudadID").html(response);
                    }
                    error: function() {
                        alert('Error occured');
                    }
               });
          });
     }

</script>

Y éste es el código de prueba.php:

<?php
 if(isset($_REQUEST["opcion"]))
 {
    $opciones = '<option value="0">"Elige la ciudad"</option>';
    $conexion = new mysqli("localhost","root", "", "tu_valor");
    $sqlCIU = "SELECT DISTINCT ciudad FROM establecimiento WHERE provincia ='" . $_REQUEST['opcion'] . "'";
    $resCIU = $conexion->query($sqlCIU);
    while( $fila = $resCIU->fetch_array() )
    {
       $opciones.='<option value="'.$fila[0].'">'.$fila[0].'</option>';
    }

    // Liberar resultados
    mysqli_free_result($resCIU);

    // Cerrar la conexión
    mysqli_close($conexion);

    echo $opciones;
 }
?>

<!-- html con los select box -->

 <select name="provincia" id="provincia" class="form-control">
 <option value="" selected>Elige la provincia</option>
<?PHP 

$conexion = new mysqli("localhost","root", "", "tu_valor");
$acentos = $conexion->query("SET NAMES 'utf8'");

$sqlPROV = "SELECT DISTINCT provincia FROM establecimiento";

if ($resPROV = $conexion->query($sqlPROV)) 
{
    while ($fila = $resPROV->fetch_row()) 
    {

    echo "<option value='" . $fila[0] . "' >" . $fila[0] . "</option>";    
    }
    $resPROV->close();
 }
?>
</select>
</div>
<div class="form-group">

  <select name="ciudad" id="ciudadID" class="form-control">
  <option selected>Elige tu ciudad</option>   
Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
  • 3
    No pongas sólo código en la pregunta, añade una descripción del problema y dónde está fallando. Tal y como está ahora la pregunta, no sigue las indicaciones del [Centro de Ayuda](http://es.stackoverflow.com/help/on-topic) y puede acabar cerrada. – Alvaro Montoro Nov 03 '16 at 11:00
  • 2
    Aparte, deberías leer sobre la [inyección SQL](http://es.stackoverflow.com/questions/10518/qu%C3%A9-es-la-inyecci%C3%B3n-sql-y-c%C3%B3mo-puedo-evitarla) y [cómo evitarla con PHP](http://es.stackoverflow.com/questions/18232/c%C3%B3mo-evitar-la-inyecci%C3%B3n-sql-en-php). El código que compartes es vulnerable a ataques de inyección SQL y no debería usarse en entornos de producción de cara al público. – Alvaro Montoro Nov 03 '16 at 11:08
  • @AlvaroMontoro perdona es la primera pregunta que hago. Lo que quiero es seleccionar en un select la provincia, y que con ajax en el otro select box me salgan las ciudades que tengo de esa provincia en mi bd. – Miguel Martin Nov 03 '16 at 11:16
  • ¿Cómo está fallando el código que tienes? – Alvaro Montoro Nov 03 '16 at 11:23
  • No me actualiza el select box, creo que no recibe respuesta. Y al no dominar mucho ajax, no encuentro una solución. – Miguel Martin Nov 03 '16 at 11:27
  • ¿Recibes algún error en la consola de JavaScript?¿Cuando dices que "no me actualiza el select box" te refieres a que no cambia de valor o a que recibe los valores equivocados? – Alvaro Montoro Nov 03 '16 at 11:31
  • Aparte, ¿por qué hay código repetido en prueba.php? – Alvaro Montoro Nov 03 '16 at 11:32
  • No cambia de valor, no recibe la respuesta del php. A lo mejor me estoy equivocando a la hora de escribir el código ajax. – Miguel Martin Nov 03 '16 at 11:33
  • Ya está, perdona, aún no me controlo este editor a la hora de pegar código. – Miguel Martin Nov 03 '16 at 11:35
  • Solo te voy a dar un consejo. Utiliza console log no alerts. y asi puedes debugear mucho mejor. Puedes ir viendo que es lo que está pasando. – Mikel Nov 03 '16 at 11:42

2 Answers2

2

He editado la pregunta para añadir una descripción del problema y formatear mejor el código... y entonces me he dado cuenta de que el código JavaScript contiene errores de sintaxis (que deberías poder ver desde la consola de JS) y que harán que la petición AJAX no se realice.

En concreto:

  • falta una coma (,) entre el success y el error.
  • falta un paréntesis de cierre al final del todo.

Corrige eso y el código quedará así:

$(document).ready(function(){
  $('#provincia').on('change',function(){

    var provincia = $(this).val();

    $.ajax({
      type:"POST", 
      dataType:'html',
      url : "pages/prueba.php",
      data : { opcion: provincia },    
      success: function(response){
        alert("HOLA");
        $("#ciudadID").html(response);
      },  // aquí faltaba una coma
      error: function() {
        alert('Error occured');
      }
    });
  });
});
Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
2

Tu ajax estaba diciendo que el dataType es html cuando yo te aconsejaria que ocuparas json

<script type="text/javascript">
$(document).ready(function() {
            $('#provincia').on('change', function() {

                var provincia = $(this).val();

                $.ajax({
                    type: "POST",
                    dataType: 'json',
                    url: "pages/prueba.php",
                    data: {
                        opcion: provincia
                    },

                    success: function(response) {
                        alert("HOLA");
                        $("#ciudadID").html(response);
                    },
                    error: function() {
                        alert('Error occured');
                    }
                });

            });
        });
</script>

Por otro lado la ventaja de trabajar con tipos de datos json es un codigo que es muy amigable con javascript y te ayuda a identificar y gestionar los datos, por ende, tu codigo una vez que ocupo el valor de provincia, debe devolver echo json_encode($opciones);. Pero estas opciones no debes devolver el tipo de elemento html, si no lo que devuelve tu respuesta a la llamada de tu base de datos.

$ciudades = array();
while ($fila = $resCIU - > fetch_array()) {
   $ciudades[] = $fila[0];
}
echo json_encode($ciudades);

Luego en la respuesta de tu AJAX recorrer este arreglo y agregas las opciones a un elemento HTML, podria ser algo asi :

var $ciudad= $('#ciudad');
$ciudad.empty();
$('#ciudad').empty();
for (var i = 0; i < data.length; i++) {
    $ciudad.append('<option id=' + data[i] + ' value=' + data[i] + '>' + data[i] + '</option>');
}

Por lo tanto tu ajax deberia quedar mas o menos asi :

<script type="text/javascript">
$(document).ready(function() {
            $('#provincia').on('change', function() {

                var provincia = $(this).val();

                $.ajax({
                    type: "POST",
                    dataType: 'json',
                    url: "pages/prueba.php",
                    data: {
                        opcion: provincia
                    },

                    success: function(response) {
                        alert("HOLA");
                        var $ciudad = $('#ciudad');
                        $ciudad.empty();
                        $('#ciudad').empty();
                        for (var i = 0; i < response.length; i++) {
                            $ciudad.append('<option id=' + response[i] + ' value=' + response[i] + '>' + response[i] + '</option>');
                        }
                    },
                    error: function() {
                        alert('Error occured');
                    }
                });

            });
        });
</script>
sioesi
  • 11,365
  • 5
  • 20
  • 55