Ayuda con combobox en PHP

De nuevo molestándote.
Estaba haciendo el típico juego de combobox (3) que al seleccionar un valor del primero, el segundo muestra opciones relacionadas al primero, y al seleccionar un valor del segundo, el tercero muestra opciones relacionadas al segundo. El típico: provincia, canton, distrito (en mi país).
Lo estoy haciendo con dreamweaver y me encontré un código que funciona con dos combobox pero al hacerlo con tres me da un error de sintaxis en SQL que no sé qué es.
Este el código con dos combobox:
<?php require_once('Connections/retc.php'); ?>
<?
mysql_select_db($database_retc, $retc);
$query_provincias = "SELECT * FROM provincias";
$provincias = mysql_query($query_provincias, $retc) or die(mysql_error());
$row_provincias = mysql_fetch_assoc($provincias);
$totalRows_provincias = mysql_num_rows($provincias);
$colname_provincia = "-1";
if (isset($_POST['id_provincia'])) {
  $colname_provincia = (get_magic_quotes_gpc()) ? $_POST['id_provincia'] : addslashes($_POST['id_provincia']);
}
mysql_select_db($database_retc, $retc);
$query_cantones = sprintf("SELECT id_canton, canton FROM cantones WHERE id_provincia = %s", $colname_provincia);
$cantones = mysql_query($query_cantones, $retc) or die(mysql_error());
$row_cantones = mysql_fetch_assoc($cantones);
$totalRows_cantones = mysql_num_rows($cantones);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin título</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<p>
  <select name="id_provincia" id="id_provincia" onChange="submit()">
    <option value="" <?php if (!(strcmp("", $_POST['id_provincia']))) {echo "selected=\"selected\"";} ?>>-Provincia-</option>
    <?php
do {  
?><option value="<?php echo $row_provincias['id_provincia']?>"<?php if (!(strcmp($row_provincias['id_provincia'], $_POST['id_provincia']))) {echo "selected=\"selected\"";} ?>><?php echo $row_provincias['provincia']?></option>
      <?php
} while ($row_provincias = mysql_fetch_assoc($provincias));
  $rows = mysql_num_rows($provincias);
  if($rows > 0) {
      mysql_data_seek($provincias, 0);
      $row_provincias = mysql_fetch_assoc($provincias);
  }
?>
    </select>
  </p>
<p>
    <select name="id_canton" id="id_canton" onchange="submit()">
      <option value="" <?php if (!(strcmp("", $_POST['id_canton']))) {echo "selected=\"selected\"";} ?>>-Cantón-</option>
<?php
do {  
?><option value="<?php echo $row_cantones['id_canton']?>"<?php if (!(strcmp($row_cantones['id_canton'], $_POST['id_canton']))) {echo "selected=\"selected\"";} ?>><?php echo $row_cantones['canton']?></option>
      <?php
} while ($row_cantones = mysql_fetch_assoc($cantones));
  $rows = mysql_num_rows($cantones);
  if($rows > 0) {
      mysql_data_seek($cantones, 0);
      $row_cantones = mysql_fetch_assoc($cantones);
  }
?>
    </select>
    </p>
</form>
</body>
</html>
<?php
mysql_free_result($provincias);
mysql_free_result($cantones);
?>
Al hacerlo con tres le agrego en la primera sección esto:
$colname_canton = "-1";
if (isset($_POST['id_canton'])) {
  $colname_canton = $_POST['id_canton'];
}
mysql_select_db($database_retc, $retc);
$query_distritos = sprintf("SELECT id_distrito, distrito FROM distritos WHERE id_canton = %s", $colname_canton);
$distritos = mysql_query($query_distritos, $retc) or die(mysql_error());
$row_distritos = mysql_fetch_assoc($distritos);
$totalRows_distritos = mysql_num_rows($distritos);
Y en el formulario el otro combobox:
<p>
  <select name="id_distrito" id="id_distrito" onchange="submit()">
    <option value="" <?php if (!(strcmp("", $_POST['id_distrito']))) {echo "selected=\"selected\"";} ?>>-Distrito-</option>
    <?php
do {  
?><option value="<?php echo $row_distritos['id_distrito']?>"<?php if (!(strcmp($row_distritos['id_distrito'], $_POST['id_distrito']))) {echo "selected=\"selected\"";} ?>><?php echo $row_distritos['distrito']?></option>
      <?php
} while ($row_distritos = mysql_fetch_assoc($distritos));
  $rows = mysql_num_rows($distritos);
  if($rows > 0) {
      mysql_data_seek($distritos, 0);
      $row_distritos = mysql_fetch_assoc($distritos);
  }
?>
    </select>
  </p>
Si lo ejecuto con dos combobox funciona, pero al agregarle el tercero me da esto:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
En realidad estoy iniciando con PHP y no se por dónde anda el error. A ver si me puedes ayudar.

2 Respuestas

Respuesta
1
Has comprobado antes de hacer esta query:
$distritos = mysql_query($query_distritos, $retc) or die(mysql_error());
¿Qué la variable $query_distritos tiene una string con una query correcta? Pruébala directamente en PHPMyAdmin a ver si tiene los resultados que esperas. Si no, tienes que revisar la variable $_POST['id_canton'] que tenga el valor correcto :)
Gracias experto. Pude solucionarlo utilizando una variable para pasar el valor que no me estaba pasando $_POST['canton'] y ya funciona.
Lo que me pasa ahora es que al seleccionar un valor del combo me recarga la página, y me elimina los datos de los cuadros de texto que están en el mismo formulario.
¿Hay alguna forma de que no me elimine los datos de los cuadros de texto al recargar la página?
Gracias
Tendrías que hacer que con javascript se hiciera una petición AJAX onsubmit, en vez de hacer un submit del form, que llame a otra función que vaya al servidor, genere el código únicamente del combobox que quieres, y luego tú lo pones en el formulario.
Otra solución es utilizar los atributos 'value' de los demás inputs e inicializarlos con los valores $_POST que estás enviando.
Respuesta
1
Escribe un
Echo $query_distritos;, cada uno de los distintos querys, para saber por qué te está fallando. Obviamente es un fallo en el query que hay que detectar, y posiblemente sea en el tercer combo, claro
Gracias experto. Como me dijiste que el fallo era en el tercer combo, lo que hice fue que buscara según una variable (cantón) y ahora sí funciona.
Pero me gustaría que me aclararas otro problema. Los tres combos los estoy poniendo en un formulario que tiene más cuadros de texto. El problema que tengo ahora es que al seleccionar cada combo la página se recarga entonces me borra los demás datos en los cuadros de texto.
¿Qué puedo hacer para que me mantenga los valores incluidos en los cuadros de texto cuando recarga la página?
Gracias
La opción fácil es que pongas los combos lo primero, así cuando se recargue el usuario no habrá metido nada debajo.
Hay varias opciones, es hacerlo por javascript, de forma que metes todos los resultados de las posibles opciones en variables de javascript, con lo que no se recarga nada, y la otra opción es hacerlo con AJAX: http://bytes.com/topic/javascript/answers/148698-dependant-comboboxes-select-ekements

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas