Foros del Web » Programando para Internet » PHP »

FUNCION CON PROBLEMASS !! quien se anima!!??

Estas en el tema de FUNCION CON PROBLEMASS !! quien se anima!!?? en el foro de PHP en Foros del Web. Bueno amigos, aquí les traigo una funcion que sencillamente verifica de una BD si un alumno x tiene aprobadas las materias correlativas. El problema es ...
  #1 (permalink)  
Antiguo 21/02/2006, 07:31
Avatar de Juanmax  
Fecha de Ingreso: diciembre-2005
Ubicación: Paraná, Entre Ríos , Argentina
Mensajes: 90
Antigüedad: 12 años
Puntos: 0
FUNCION CON PROBLEMASS !! quien se anima!!??

Bueno amigos, aquí les traigo una funcion que sencillamente verifica de una BD si un alumno x tiene aprobadas las materias correlativas. El problema es el siguiente, la funcion resuelve bien si puede o no cursar una materia dada, lo que además necesito es acumular aquellas materias que NO estan aprobadas para mostrarlas en un mensaje en pantalla y el bucle que hace esto para sacar los datos en una variable de session me repite dos veces el mismo dato.

Espero se haya entendido el problema, ahí va el script:

Código PHP:
<? //FUNCION PARA VERIFICAR LA APROBACIÓN DE MATERIAS CORRELATIVAS
  //**************************************************************
include("conexiones.php");
Function 
correl($materia$cod_alumno)
{
session_start();
unset(
$_SESSION['lefaltan']);
$selecta="select correl_cod_mat from correl where cod_mat = '$materia' ";
conectar_admin('sga');
$id=mysql_query($selecta);
$datosa=mysql_fetch_array($id);
foreach(
$datosa as $k)
{
    
$selectb="SELECT reg_alumno_mesa.cod_alumno , reg_alumno_mesa.nota , reg_mesa.cod_mat ,
            reg_alumno_mesa.cod_mesa
            FROM reg_alumno_mesa INNER JOIN reg_mesa
            ON reg_alumno_mesa.cod_mesa = reg_mesa.cod_mesa
            WHERE reg_mesa.cod_mat = '$k' AND reg_alumno_mesa.cod_alumno = '$cod_alumno'
            ORDER BY reg_alumno_mesa.cod_mesa DESC LIMIT 1"
;
    
$id2=mysql_query($selectb);
    
$datosb=mysql_fetch_array($id2);
    
$filas=mysql_num_rows($id2);
        if(
$datosb['nota'] < or $filas==0)
            {
            
$cuenta++;
            
$_SESSION['lefaltan'][]=$k;
            }
}
if(
$cuenta==0)
    {
    return 
1;
    }else{
    return 
0;
    }
}
?>
notese que la variable $_session['lefaltan'] es la variable problemática que repite dos veces el mismo valor, en vez de darme los valores consecutivos correspondientes al array $datosa.

Gracias.
__________________
juanmax - GUERRERO Lab
  #2 (permalink)  
Antiguo 21/02/2006, 07:52
Avatar de JorgitoAlfajor  
Fecha de Ingreso: enero-2006
Mensajes: 152
Antigüedad: 11 años, 11 meses
Puntos: 1
A primera vista y sin examinar mucho el código, el problema puede estar en la línea:

$datosa=mysql_fetch_array($id);

La función mysql_fetch_array() devuelve una fila de la consulta como una matriz, cuyos indices son asociativos y tambien numéricos. Esto quiere decir que dicha matriz va a tener los elementos duplicados pero con diferente índice (uno numérico y otro el otro el nombre del campo). Prueba utilizar mysql_fetch_assoc() o mysql_fetch_row() en vez de mysql_fetch_array().
Saludos.
__________________
¿Se me entiende la letra?
  #3 (permalink)  
Antiguo 21/02/2006, 08:12
Avatar de Juanmax  
Fecha de Ingreso: diciembre-2005
Ubicación: Paraná, Entre Ríos , Argentina
Mensajes: 90
Antigüedad: 12 años
Puntos: 0
Bien, eso funciono para que no se repitan los valores, ahora el problema persiste en este sentido:
Cuando muestro el contenido de $_SESSION['lefaltan'] con un foreach (fuera de esta funcion) se imprime solo un valor, en vez de todos los evaluados en el If. Osea que no se llena esa variable correctamente.
__________________
juanmax - GUERRERO Lab
  #4 (permalink)  
Antiguo 21/02/2006, 08:34
Avatar de JorgitoAlfajor  
Fecha de Ingreso: enero-2006
Mensajes: 152
Antigüedad: 11 años, 11 meses
Puntos: 1
Creo que tenes un error en la forma de recorrer el resultado de la consulta.
Con la linea:
$datosa=mysql_fetch_array($id);
en $datosa tienes sólo una fila del resultado, no la tabla completa. Luego, con:
foreach($datosa as $k)
recorrés esa fila obteniendo en cada iteracion, en la variable $k, un campo de la fila (y por como es la consulta, dicha fila tiene sólo un campo: correl_cod_mat).
La forma correcta de hacerlo creo que sería mas o menos así

Código PHP:
<?
...
while (
$datosa=mysql_fetch_row($id)) {

$k $datosa[0];

$selectb="SELECT reg_alumno_mesa.cod_alumno , reg_alumno_mesa.nota , reg_mesa.cod_mat , 
            reg_alumno_mesa.cod_mesa 
            FROM reg_alumno_mesa INNER JOIN reg_mesa 
            ON reg_alumno_mesa.cod_mesa = reg_mesa.cod_mesa 
            WHERE reg_mesa.cod_mat = '$k' AND reg_alumno_mesa.cod_alumno = '$cod_alumno' 
            ORDER BY reg_alumno_mesa.cod_mesa DESC LIMIT 1"

    
$id2=mysql_query($selectb); 
    
$datosb=mysql_fetch_array($id2); 
    
$filas=mysql_num_rows($id2); 
        if(
$datosb['nota'] < or $filas==0
            { 
            
$cuenta++; 
            
$_SESSION['lefaltan'][]=$k
            }

}
...
?>
Saludos.
__________________
¿Se me entiende la letra?
  #5 (permalink)  
Antiguo 21/02/2006, 08:48
Avatar de Juanmax  
Fecha de Ingreso: diciembre-2005
Ubicación: Paraná, Entre Ríos , Argentina
Mensajes: 90
Antigüedad: 12 años
Puntos: 0
bien!! jorgito.. nos vamos acercando... no entiendo porqué ahora me falta una fila de resultado, es decir: si le faltaban 3 materias, me imprime 2 y así...

Saludos, ...
__________________
juanmax - GUERRERO Lab
  #6 (permalink)  
Antiguo 21/02/2006, 08:55
Avatar de Juanmax  
Fecha de Ingreso: diciembre-2005
Ubicación: Paraná, Entre Ríos , Argentina
Mensajes: 90
Antigüedad: 12 años
Puntos: 0
De acuerdo Muchas Gracias Alfajor

Hehem... retiro lo dicho!!

Me había quedado una linea demás...:

Código PHP:
//$datosa=mysql_fetch_assoc($id);
while ($datosa=mysql_fetch_row($id)) 
{

$k $datosa[0]; 
es la que esta comentada.. ... sin palabras.. je je...

LO SUYO IMPECABLE ALFAJOR.. LE DEBO UNA... Saludos y muchísimas gracias.
__________________
juanmax - GUERRERO Lab
  #7 (permalink)  
Antiguo 21/02/2006, 09:00
Avatar de JorgitoAlfajor  
Fecha de Ingreso: enero-2006
Mensajes: 152
Antigüedad: 11 años, 11 meses
Puntos: 1
Puede ser que antes del while hayas dejado la línea:

$datosa=mysql_fetch_array($id);

Si está, tenés que borrarla. La función mysql_fetch_array() devuelve la primer fila del resultado de una consulta la primer vez que se llama y al llamarla nuevamente devuelve la fila siguiente hasta que no quedan más filas. En ese caso devuelve false. Por eso si tenías esa línea antes del while, cuando se ejecuta la sentencia:

while ($datosa=mysql_fetch_row($id))

la función mysql_fetch_row() devuelve la segunda fila de la consulta. Espero que sea eso.
Saludos.

PD: Upss, te llegué unos minutos tarde.
__________________
¿Se me entiende la letra?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:47.