Foros del Web » Programando para Internet » PHP »

Error al ejecutar dos funciones parecidas dentro de dos while parecidos

Estas en el tema de Error al ejecutar dos funciones parecidas dentro de dos while parecidos en el foro de PHP en Foros del Web. Hola. Estoy haciendo un sistema de amistades donde primero hago la consulta de las amistades confirmadas comprobando el id_usuario por la url, el id_envia y ...
  #1 (permalink)  
Antiguo 12/04/2016, 00:47
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Error al ejecutar dos funciones parecidas dentro de dos while parecidos

Hola.

Estoy haciendo un sistema de amistades donde primero hago la consulta de las amistades confirmadas comprobando el id_usuario por la url, el id_envia y el id_recibe en la tabla amistades:

Código PHP:
$query "SELECT * FROM amistades WHERE id_envia = '{$id_usuario}' && confirmado = '1' || id_recibe = '{$id_usuario}' && confirmado = '1'"
Una vez que tengo todas las amistades confirmadas hago otras dos consultas, una para ver si mi amistad a mostrar es por el id_envia y otra por el id_recibe.

Código PHP:
if($id_envia == $id_usuario){
                     
$query_nick_recibe "SELECT *, DATE_FORMAT(fecha_de_nacimiento,'%m-%d') as fecha_de_nacimiento FROM usuarios  WHERE id_usuario = '{$id_recibe}'"
o

Código PHP:
if($id_recibe == $id_usuario){
                     
$query_nick_envia "SELECT *, DATE_FORMAT(fecha_de_nacimiento,'%m-%d') as fecha_de_nacimiento FROM usuarios  WHERE id_usuario = '{$id_envia}'"
Hasta aquí todo bien ya que me muestra todos los nicks de los usuarios amigos que tengo.
Código PHP:
 $query "SELECT * FROM amistades WHERE id_envia = '{$id_usuario}' && confirmado = '1' || id_recibe = '{$id_usuario}' && confirmado = '1'";     
     
$amistades_query mysqli_query($conexion$query);
     if(
mysqli_num_rows($amistades_query) == 0){         
         echo 
"<p>No tiene amigos confirmados</p>";                     
     }
     
//Si tiene amigos, mostrar lista
     
else{         
         echo 
'<article class="perfil-usuario">';
         echo 
'<ul>';
         
//Consulto las amistades confirmadas     
         
while ($fila mysqli_fetch_array($amistades_query)) {
             
$id_amistad $fila['id_amistad'];
             
$id_envia $fila['id_envia'];            
             
$id_recibe $fila['id_recibe'];             
                
//Consulto para buscar al usuario en id_recibe
                 //Si el id_envia es el mismo que el id_usuario entonces muestro el id_recibe ya que es el usuario amigo
                 
if($id_envia == $id_usuario){
                     
$query_nick_recibe "SELECT *, DATE_FORMAT(fecha_de_nacimiento,'%m-%d') as fecha_de_nacimiento FROM usuarios  WHERE id_usuario = '{$id_recibe}'";                
                    
$usuario_query mysqli_query($conexion$query_nick_recibe);                    
                     while (
$fila mysqli_fetch_array($usuario_query)) {                             
                         
$id_usuario_amigo $fila['id_usuario'];                                                
                         
$usuario_nick $fila['usuario'];
                         
$email_amigo $fila['email'];
                         
$fecha_de_cumpleano $fila['fecha_de_nacimiento'];                             
                         echo 
'<li class="amistad"><a href="usuarios.php?id='.$id_usuario_amigo.'" accesskey="m" title="'.$usuario_nick.'">'.$usuario_nick.'</a></li>';

                         
//---------Aquí está el error ------//
                                               //-------- Comprobando fecha de cumpleaños --------------//                

                       
function diferencia_de_dias($dia1$dia2){
                            if (!
is_integer($dia1)) $dia1 strtotime($dia1);
                            if (!
is_integer($dia2)) $dia2 strtotime($dia2);  
                            return 
floor(abs($dia1 $dia2) / 60 60 24);
                        }                                            
                      
                        
$fecha_de_cumpleanos date("Y")."-".$fecha_de_cumpleano;
                        
date_default_timezone_set("Europe/Madrid");
                        
$fecha_actual date("Y-m-d");                         
                        
$dias diferencia_de_dias($fecha_actual,$fecha_de_cumpleanos);


                        if(
$dias 15){
                            echo 
"<span><strong> - Faltan menos de ".$dias." día para este cumpleaños y entonces envío un aviso de correo.</strong></span>";
                        }
                        else{
                            echo 
"No es fecha de avisar aun ya que todavía quedan " $dias;
                        }

                        
//-------- Fin Comprobando fecha de cumpleaños --------------//                      

                     
}                                          
                 }
//Fin Si el id_envia es el mismo que el id_usuario entonces muestro el id_recibe ya que es el usuario amigo
                 //Fin Consulto para buscar al usuario en id_recibe

                 //Consulto para buscar al usuario en id_envia
                 //Si el id_recibe es el mismo que el id_usuario entonces muestro el id_envia ya que es el usuario amigo
                 
if($id_recibe == $id_usuario){
                     
$query_nick_envia "SELECT *, DATE_FORMAT(fecha_de_nacimiento,'%m-%d') as fecha_de_nacimiento FROM usuarios  WHERE id_usuario = '{$id_envia}'";                
                    
$usuario_query_e mysqli_query($conexion$query_nick_envia);                    
                     while (
$fila mysqli_fetch_array($usuario_query_e)) {                     
                         
$id_usuario_amigo $fila['id_usuario'];                                                
                         
$usuario_nick $fila['usuario'];
                         
$email_amigo $fila['email'];
                         
$fecha_de_cumpleano $fila['fecha_de_nacimiento'];                         
                         echo 
'<li class="amistad"><a href="usuarios.php?id='.$id_usuario_amigo.'" accesskey="m" title="'.$usuario_nick.'">'.$usuario_nick.'</a></li>';

                         
//-------- Comprobando fecha de cumpleaños --------------//                

                        
function diferencia_de_dias_($dia1$dia2){
                            if (!
is_integer($dia1)) $dia1 strtotime($dia1);
                            if (!
is_integer($dia2)) $dia2 strtotime($dia2);  
                            return 
floor(abs($dia1 $dia2) / 60 60 24);
                        }                                            
                      
                        
$fecha_de_cumpleanos date("Y")."-".$fecha_de_cumpleano;
                        
date_default_timezone_set("Europe/Madrid");
                        
$fecha_actual date("Y-m-d");                         
                        
$dias diferencia_de_dias_($fecha_actual,$fecha_de_cumpleanos);


                        if(
$dias 15){
                            echo 
"<span><strong> - Faltan menos de ".$dias." día para este cumpleaños y entonces envío un aviso de correo.</strong></span>";
                        }
                        else{
                            echo 
"No es fecha de avisar aun ya que todavía quedan ".$dias;
                        }


                        
//-------- Fin Comprobando fecha de cumpleaños --------------//    
                               
                     
}                                          
                 }
//Fin Si el id_recibe es el mismo que el id_usuario entonces muestro el id_envia ya que es el usuario amigo             
             //Fin Consulto para buscar al usuario en id_envia
         
}//Fin Consulto las amistades confirmadas     
         
echo '</ul>';                         
         echo 
'</article>';            
     }
//Fin si tiene amigos mostrar lista 
Sin embargo cuando intento meter una función para comprobar las fechas de cumpleaños en la opción "consulto para buscar al usuario en id_recibe" solo me muestra uno o dos cuando por ejemplo tiene cuatro o cinco amistades, es como si al poner la palabra function dentro de ese while solo lo hiciese el recorrido una vez, sin embargo en la opción consulto para buscar al usuario en id_envia pongo la misma función y nunca falla y la verdad no encuentro el error por mas pruebas que hago.

¿Qué tengo que cambiar quitar o añadir?

Saludos.
  #2 (permalink)  
Antiguo 12/04/2016, 03:24
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Error al ejecutar dos funciones parecidas dentro de dos while parecidos

No puedes declarar una función dentro de un bucle, debes declararla fuera y hacer una llamada. Lo que tienes habitualmente da un error que indica que la función ya esta declarada, puesto que se redeclarara en cada pasada del bucle.

Ejemplo :
Código PHP:
Ver original
  1. <?php
  2. function mi_funcion ($parametro){
  3. /* lo que haga mi función */
  4. }
  5.  
  6. while  (...){
  7. /* llamada a mi función */
  8. mi_funcion ($mi_parametro);
  9. }
  10. ?>

Es más tienes 2 funciones idénticas, cosa que es absurdo y que si las funciones existen para algo es para no tener que duplicar código, si no para poder reutilizarlo.

Saca la función fuera de los bucles y haz la llamada tantas veces como necesites, pasando los parámetros que necesites.
__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 12/04/2016 a las 03:37
  #3 (permalink)  
Antiguo 12/04/2016, 03:38
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Error al ejecutar dos funciones parecidas dentro de dos while parecidos

Todo ese código se resuelve en 1 unica query. Y, para tu salud mental, separa la ejecución de la query, y la obtención de resultados, del renderizado HTML.
  #4 (permalink)  
Antiguo 12/04/2016, 04:54
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Error al ejecutar dos funciones parecidas dentro de dos while parecidos

Hola de nuevo.

xerifandtomas, he sacado la función del while y ya va todo bien, vaya error mas tonto

Gracias por tu ayuda.


dashtrash, voy a ver si soy capaz de hacerlo ya que me hice un enorme lio de algo tan simple... gracias por tus consejos.

PD: no me ha sido posible citar los mensajes anteriores para responder.

Etiquetas: fecha, funciones, mysql, select, sql, tabla, usuarios
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 20:53.