Autor Tema: select o combobox dependientes (MYSQL, PHP y Ajax) undefined index  (Leído 16877 veces)

jga

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 31
    • Ver Perfil
Hola de nuevo amigos , vereis , quiero cargar dos select box con los datos de una bbdd que tengo para ello uso cuatro documentos

el de conexion a la bbdd , que si me lo permitiis ,omitire porque funciona y no es parte del problema ,

uno con el formulario index.php
Código: [Seleccionar]
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>

<style>
div{
width:300px; float:left;
padding:10px;
background:#f6f6f6;
}
</style>
<script type="text/javascript" language="javascript" src="js/ajax.js"></script>

</head>
<body>
<?php include ("conexion.php");?>
<?php mysql_select_db($baseDatos);?>
<?php 
$sql="select * from alumnos ";
$res=mysql_query($sql);
?>

<form name="form1" action="">
<div>
Alumnos:
<select name="alumno" id="" onchange="from(document.form1.alumno.value,'midiv','curso.php')">
<option value="0">Seleccione</option>
<?php while ($fila=mysql_fetch_array($res)){ ?>
<option value="<?php echo $fila['dni_a']?>"><?php echo $fila['dni_a']?></option>
<?php }?>
</select>
</div>

<div id="midiv">

</div>



</form>
</body>
</html>



otro con el documento curso.php
Código: [Seleccionar]
<?php include ("conexion.php");?>
<?php mysql_select_db($baseDatos);?>
<?php 
$sql="select ncurso from alumnos where ncurso=".$_GET['ncurso'];
$res=mysql_query($sql);

?>


Curso:
<select name="curso" >
<?php while ($fila=mysql_fetch_array($res)){ ?>
<option value="<?php echo $fila['ncurso']?>"><?php echo $fila['ncurso']?></option>
<?php }   ?>
</select>

y el documento ajax.php con la funcion for que recibe el valor del select con nombre "alumno" , el div que tiene que refrescar "midiv" y la pagina a la que se envia el valor elegido de "alumno"  mediante get , para usarlo en la consulta que escribirá en "midiv" , el contenido de la pagina cursos.php que sera la seleccion de otro campo de la tabla de la bbdd relacionado con ese id , mostrando una nueva lista .
Código: [Seleccionar]
function obtiene_http_request()
{
var req = false;
try
  {
    req = new XMLHttpRequest(); /* p.e. Firefox */
  }
catch(err1)
  {
  try
    {
     req = new ActiveXObject("Msxml2.XMLHTTP");
  /* algunas versiones IE */
    }
  catch(err2)
    {
    try
      {
       req = new ActiveXObject("Microsoft.XMLHTTP");
  /* algunas versiones IE */
      }
      catch(err3)
        {
         req = false;
        }
    }
  }
return req;
}
var miPeticion = obtiene_http_request();
//***************************************************************************************
function from(id,ide,url){
var mi_aleatorio=parseInt(Math.random()*99999999);//para que no guarde la página en el caché...
var vinculo=url+"?id="+id+"&rand="+mi_aleatorio;
//alert(vinculo);
miPeticion.open("GET",vinculo,true);//ponemos true para que la petición sea asincrónica
miPeticion.onreadystatechange=miPeticion.onreadystatechange=function(){
               if (miPeticion.readyState==4)
               {
   //alert(miPeticion.readyState);
                       if (miPeticion.status==200)
                       {
                                //alert(miPeticion.status);
                               //var http=miPeticion.responseXML;
                               var http=miPeticion.responseText;
                               document.getElementById(ide).innerHTML= http;

                       }
               }/*else
               {
document.getElementById(ide).innerHTML="<img src='ima/loading.gif' title='cargando...' />";

                }*/
       }
       miPeticion.send(null);

}
//************************************************************************************************
function limpiar()
{
document.form.reset();

}

pues bien , el error que me da en la pagina index.php es que al seleccionar el dni en la primera lista y elegir un dni , al ir a seleccionar en la otra lista del curso me dice Notice: Undefined index: ncurso in C:\xampp\htdocs\curso.php on line 4 y no veo el error tras revisarlo , espero que alguien lo vea , un abrazo fuerte y gracias.
« Última modificación: 15 de Abril 2015, 09:56 por Ogramar »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:problema undefined index (MYSQL+PHP)
« Respuesta #1 en: 12 de Abril 2015, 12:05 »
Hola, hay cosas extrañas

<form name="form1" action=""> ¿Por qué tienes el action vacío?

<select name="alumno" id="" onchange="from(document.form1.alumno.value,'midiv','curso.php')">

Los resultados de ajax.php tendrías que devolverlos con un echo. Mira cómo lo hace aquí http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=882:ique-es-y-para-que-sirve-ajax-ventajas-e-inconvenientes-javascript-asincrono-xml-y-json-cu01193e&catid=78:tutorial-basico-programador-web-javascript-desde-&Itemid=206

Saludos!!

jga

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 31
    • Ver Perfil
Re:problema undefined index (MYSQL+PHP)
« Respuesta #2 en: 12 de Abril 2015, 12:34 »
Gracias por tu pronta respuesta mastermind , ante todo decirte que el codigo no es mio , lo he encontrado en una pagina web completo y ademas se explica en un video , lo que yo quiero es adaptarlo para probarlo con mi  base de datos , ya que n la pagina ademas viene la base de datos , y he probado su funcionamiento en mi equipo y funciona , el problema viene cuando lo adapto a mi bbdd , el archivo conexion funciona al cambiarlo , pero tengo algun problema con el archivo index.php o el archivo cursos.php porque no consigo que transmita correctamente el valor de la variable elegida en index.php  . Lo de el action vacio es porque solo estoy probando que se carguen los desplegables simplemente , un saludo.

la pagina web donde esta el ejemplo por si sirve para algo

http://www.tutorialesenvideo.net/select-o-combox-dependientes/

un saludo.
« Última modificación: 12 de Abril 2015, 12:36 por jga »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:select o combobox dependientes (MYSQL+PHP) undefined index
« Respuesta #3 en: 12 de Abril 2015, 20:52 »
El fallo puede estar en que no estás haciendo alusión a un elemento midiv en <select name="alumno" id="" onchange="from(document.form1.alumno.value,'midiv','curso.php')">

pero dicho midiv no tiene contenido. Prueba a escribir

<div id="midiv">&nbsp;</div>

También puedes tener un problema aquí: $sql="select ncurso from alumnos where ncurso=".$_GET['alumno'];

Estás escribiendo select ncurso ¿existe el campo ncurso en la tabla alumnos de la base de datos? No parece que al archivo le llegue nada por $_GET['ncurso'], aquí más bien parece que debiera ser $_GET['alumno'] o algo así

Recomendado: curso HTML, http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=69&Itemid=192

Curso JavaScript, http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=78&Itemid=206

Curso PHP, http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=70&Itemid=193


saludos!

jga

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 31
    • Ver Perfil
Re:select o combobox dependientes (MYSQL+PHP) undefined index
« Respuesta #4 en: 12 de Abril 2015, 23:21 »
Gracias otra vez ,mastermind por tu tiempo , veras , he decidido buscar otra funcion que haga lo mismo pero mas simplificado si se puede decir , me he descargado tambien los archivos y doy fe de que funciona , cuando deja de funcionar es cuando adapto las variables a mi base de datos , intentare explicarlo todo detalladamente a ver si podemos dar con el fallo    ;)

el primer archivo es este conexion.php

Código: [Seleccionar]
<?php
$conexion 
mysql_connect('127.0.0.1''root''root');
mysql_select_db('lugares'$conexion);
?>


y yo lo dejo asi

Código: [Seleccionar]
<?php
$conexion 
mysql_connect('localhost''root''root');
mysql_select_db('alumnos'$conexion);
?>

no falla al conectar , por lo que creo que eso no es



segundo archivo index.php
Código: [Seleccionar]
<!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=utf-8" />
<title>Nuevo</title>
<link href="../css/estilo.css" rel="stylesheet">
<script src="../js/jquery.js"></script>
<script src="../js/myjava.js"></script>
</head>
<body>
<header>
PETICION DE DATOS CON EL OBJETO "SELECT"
</header>
<section>
<select id="ciudad">
<?php require('../php/conexion.php'); 
$lug mysql_query("SELECT * FROM ciudad ORDER BY nomb_ciudad");
echo '<option selected="selected" disabled="disabled">Elija su Ciudad</option>';
while($lug2 mysql_fetch_array($lug)){
echo '<option value="'.$lug2['id_ciudad'].'">'.$lug2['nomb_ciudad'].'</option>';
}
?>

</select><br /><br />

<select id="provincia">
</select><br /><br />

<select id="distrito">
</select>
</section>
</body>
</html>

y yo lo dejo asi
Código: [Seleccionar]
<!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=utf-8" />
<title>Nuevo</title>
<link href="../css/estilo.css" rel="stylesheet">
<script src="../js/jquery.js"></script>
<script src="../js/myjava.js"></script>
</head>
<body>
<header>
PETICION DE DATOS CON EL OBJETO "SELECT"
</header>
<section>
<select id="ciudad">
<?php require('../php/conexion.php'); 
$lug mysql_query("SELECT * FROM alumnos ");
echo '<option selected="selected" disabled="disabled">Elija Alumno</option>';
while($lug2 mysql_fetch_array($lug)){
echo '<option value="'.$lug2['dni_a'].'">'.$lug2['nombre'].'</option>';
}
?>

</select><br /><br />

<select id="provincia">
</select><br /><br />

<select id="distrito">
</select>
</section>
</body>
</html>
lo unico que cambio como ves es el select que esta probado en la base de datos y arroja resultados , y dentro del option el value dni_a que contiene el dni del alumno que en ese momento esta elegido y el campo que se mostrara en la lista de la seleccion que es el nombre del alumno ( aunque el valor que se usara para relacionar las tablas debe ser el dni porque es la primary key )

tercer archivo myjava.js

Código: [Seleccionar]
$(function(){
//Aqui se coge el elemento ciudad y con la propiedad .on que requiere dos  parametros : change (cuando el valor de ese id cambie, que es cuando se elige otra opcion en la desplegable)y ejecutar la siguiente funcion cuando se haga change
$('#ciudad').on('change', function(){
//el primer parametro de la funcion y lo primero que hace , es obtener el valor con .val() el valor (lo que esta seleccionado despues de elegir de la lista que aparece)del elemento con el id ciudad que es el que corresponde a la primera lista desplegable y lo mete en la variable $id
var id = $('#ciudad').val();
// lo segundo que hace la funcion es encontrar la pagina donde se va va enviar el valor guardado en $id a traves del metodo POST , en esta pagina esta la consulta mysql y la variable $id se podra usar en ella para obtener por ejemplo un SELECT * FROM provincia WHERE id_ciudad = '$id' , ya que $id en el paso anterior se cargo con el valor que se obtuvo de la lista desplegable que tenia el id ciudad , esta pagina se almacena tambien en una variable llamada url
var url = '../php/agrega_provincias.php';
//en esta parte se le da la informacion a ajax para que trabaje: como se enviara la informacion (POST) 
$.ajax({
//como se enviara la informacion (POST)
type:'POST',
//la pagina (guardada antes en la variable url)
url:url,
//el valor de $id recogido antes
data:'id='+id,
// los datos que los echo de los dos option que estan en la pagina guardada en la variable url
success: function(data){
//con esto de abajo se borraran los datos que tuviera la siguiente select para evitar que si en la primera se cambia de ciudad en la segunda select no se quede una provincia que no sea la de la ciudad del primer select , o sea que borra el segundo select si el primero se cambia
$('#provincia option').remove();
//con esto despues de borrarlo se añade otra vez la lista de opciones referente a la del primer select
$('#provincia').append(data);
}
});
return false;
});

$('#provincia').on('change', function(){
var id = $('#provincia').val();
var url = '../php/agrega_distritos.php';
$.ajax({
type:'POST',
url:url,
data:'id='+id,
success: function(data){
$('#distrito option').remove();
$('#distrito').append(data);
}
});
return false;
});
});

aqui no he cambiado nada porque los id de los select me da igual cambiarlos ya que a efectos del programa no se ven aunque es conveniene cambiarlos para este ejemplo no lo hago por comodidad , este archivo es el que procesa la informacion de index.php

archivo agrega_provincias.php que es el que cargara el select con todas las provincias relacionadas con la ciudad ( en mi caso con el curso relacionado con el alumno a traves del dni
Código: [Seleccionar]
<?php
require('conexion.php');
$id $_POST['id'];
$prov mysql_query("SELECT * FROM provincia WHERE id_ciudad = '$id' ORDER BY nomb_provincia");
if(mysql_num_rows($prov)>0){
echo '<option selected="selected" disabled="disabled">Elija su Provincia</option>';
while($prov2 mysql_fetch_array($prov)){
echo '<option value="'.$prov2['id_provincia'].'">'.$prov2['nomb_provincia'].'</option>';
}
}
?>


yo lo dejo asi
Código: [Seleccionar]
<?php
require('conexion.php');
//llega la variable desde el proceso de ajax ( en el proceso ajax se le llama id y se envia por post )a traves del metodo post y se guarda en la variable $id , que contiene el dni del alumno 
$id $_POST['id'];
//sencilla consulta que devuelve el curso donde el dni del alumno es igual al de la variable $id ( que no se debe tocar ya que almacena el dni ) 
$prov mysql_query("SELECT curso FROM cursos , alumnos WHERE dni_a='id' AND curso=ncurso ");
if(mysql_num_rows($prov)>0){
echo '<option selected="selected" disabled="disabled">Elije el curso</option>';
while($prov2 mysql_fetch_array($prov)){
echo '<option value="'.$prov2['curso'].'">'.$prov2['curso'].'</option>';
}
}
?>

cambio solo la sentencia select , tambien probada en la base de datos en phpmyadmin y funciona ya que ncursos es foranea de curso en cursos , tambien cambio el value del option para que quede preparado en el siguiente select donde se mostraran las asignaturas de ese curso , pero no consigo que se cargue el primer select , y como digo he probado con el ejemplo introduciendo las tablas del archivo sql que habia en el ejemplo y funciona a la perfeccion , asi que no se que puede ser , como no sea que yo tengo las tablas en utf8 general y el en latin swedish , pero no creo que sea eso  porque una vez llegue a cargar el priimer select , pero era integramente php y tenia que reenviar informacion al servidos y validar asi que me decidi por ajax sel cual se poco aunque esta funcion es sencilla , bueno despues de este rollo espero aclarar algo porque estoy mas quemao ya...
gracias y un saludo

edito para agregar una cosa, he abierto el inspector de firefox y al mirar en el elemento select me sale un mensaje que dice :
 
warning include conexion.php : failed to open stream: no such file or directory in C:\xampp\htcdocs\vistas\index.php on line 16

y debajo otro

warning include() : failed opening 'conexion.php for inclusion (include_path'.;C:\xampp\php\PEAR') in C:\xampp\htcdocs\vistas\index.php on line

vuelvo a editar : cuaderno de bitacora ,capitan picard , fecha estelar..... bueno parece que avanzamos a trompicones , he editado el fichero index.html y he añadido
$conn=mysqli_connect('localhost','root','root','alumnos_hnp') ;
usando mysqli en vez de mysql
      $lug = mysqli_query($conn,"SELECT * FROM alumnos ");

y me carga el primer select con los nombres ...pero en el segundo select no carga nada, esto es pa mear y no echar gota ...voy a hacer lo mismo en el archivo agrega_provincias.php a ver que pasa.
« Última modificación: 13 de Abril 2015, 00:26 por jga »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:select o combobox dependientes (MYSQL+PHP) undefined index
« Respuesta #5 en: 14 de Abril 2015, 11:18 »
En el curso tienes explicadas las conexiones tanto usando mysql como usando mysqli (http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=70&Itemid=193)

Deberías ir probando los ejemplos del curso y comprobar que todo te funciona bien y luego ir paso a paso en la construcción de los archivos poniendo sentencias echo por pantalla para ver dónde te falla.

Saludos!

jga

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 31
    • Ver Perfil
Re:select o combobox dependientes (MYSQL, PHP y Ajax) undefined index
« Respuesta #6 en: 16 de Abril 2015, 16:48 »
Hola de nuevo , siento la tardanza en contestar pero lo habia olvidado , al final vi el error y esaba en las rutas a los archivos php del archivo myjava.js lo demas esta como ya dije y ya funciona sin problemas , un abrazo y gracias.

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:select o combobox dependientes (MYSQL, PHP y Ajax) undefined index
« Respuesta #7 en: 16 de Abril 2015, 20:55 »
Gracias por aclararlo

Saludos!!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".