Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Aplicación en Localhost y Servidor

Estas en el tema de Aplicación en Localhost y Servidor en el foro de Mysql en Foros del Web. Buenos días, tengo un problema que no consigo solucionar. Tengo un módulo de una aplicación, que en el servidor local de mi computadora funciona a ...
  #1 (permalink)  
Antiguo 13/09/2012, 03:51
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Aplicación en Localhost y Servidor

Buenos días,

tengo un problema que no consigo solucionar. Tengo un módulo de una aplicación, que en el servidor local de mi computadora funciona a la perfección, pero cuando lo subo al servidor, no me funciona al completo. Se trata de una función que tiene un bucle foreach y tiene que ejecutar una consulta tantas veces como usuarios hay.

si hago un echo $query; puedo ver que la consulta se ejecuta pero no todas las veces que debería. Además unicamente me muestras las consultas que se han ejecutado. Ni imágenes ni datos ni nada.

He modificado el php.ini para aumentar el tiempo de ejecución de una consulta y al principio de la función he añadido ini_set("memory_limit","1024M"); para ver si funcionaba pero sigue haciendo lo mismo.

También he sacado un phpinfo() de los dos servidores (local y externo) para ver la configuración y he visto estas pequeñas diferencias aunque creo que no son importantes: active persisent link y active link (a 0 y 1 respectivamente), number of processors (2 y 4), cache_control (max-age = 0 en el servidor externo y en el local no existe) y msql.exe (en el externo no existe y en el local tiene valor: C:\AppServ\MySQL\bin)

Os dejo también la función a ver si creen que puede ser ese el problema o si se puede simplificar.
Código:
    public function ConsultoresNoReportados($mes, $ano){
    ini_set("memory_limit","1024M");
$user = new usuario();

$cons= $user->ObtenerConsultores();
    foreach($cons as $consultores) {
$consultor_no_report = $consultores['Ident_consultor'];

	$query2="Select calendario_dias.dia AS dia, consultores.consultor AS consultor from calendario_dias, consultores WHERE calendario_dias.mes = '$mes' AND dia NOT IN (SELECT DISTINCT trabajos.dia FROM trabajos INNER JOIN consultores ON trabajos.consultores_Ident_consultor = consultores.Ident_consultor WHERE mes = '$mes' AND ano = '$ano' AND (consultores.Ident_consultor) = '$consultor_no_report')AND (consultores.Ident_consultor) = '$consultor_no_report' AND (consultores.esconsultor) = '1' AND (consultores.reporte_habitual) = '1' AND ((consultores.f_fin)='' OR (consultores.f_fin) = '0000-00-00');";
	$consulta = new Consulta($query2);
	
	while($fila = $consulta->obtener_fila()) {
		$consultores_no_report[] = array(
				'consultor'		=> 	$fila['consultor'],               		 
				'dia' 			=>	$fila['dia']);
	}
    }
    
    return $consultores_no_report;
    
    if(!$consulta) 
	    throw new Exception("Al parecer han reportado todos.");

    }
Muchas gracias por anticipado.
  #2 (permalink)  
Antiguo 13/09/2012, 04:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Aplicación en Localhost y Servidor

Código MySQL:
Ver original
  1. Select calendario_dias.dia AS dia,
  2.            consultores.consultor AS consultor
  3. from calendario_dias, consultores
  4. WHERE calendario_dias.mes = '$mes'
  5.    AND dia NOT IN (SELECT DISTINCT trabajos.dia
  6.                                   FROM trabajos INNER JOIN consultores
  7.               ON trabajos.consultores_Ident_consultor = consultores.Ident_consultor
  8.               WHERE mes = '$mes'
  9.                    AND ano = '$ano'
  10.                    AND consultores.Ident_consultor = '$consultor_no_report'
  11. //Repetido   AND consultores.Ident_consultor = '$consultor_no_report'
  12.                    AND consultores.esconsultor = '1'
  13.                    AND consultores.reporte_habitual = '1'
  14.                    AND (consultores.f_fin='' OR consultores.f_fin = '0000-00-00'));


from calendario_dias, consultores Como se relacionan estas dos tablas?

Pon alias a las tablas sobre todo las repetidas para ver a que instancia se refiere cada vez....

Si calendario_dias, es un calendari con todos los dias quizas un left join con la sub consulta simplificaria las cosas.... pero siempre que haya entendido lo que intentas....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 13/09/2012 a las 05:10
  #3 (permalink)  
Antiguo 13/09/2012, 05:58
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Aplicación en Localhost y Servidor

Hola quimfv,

muchas gracias por la respuesta. ¿crees entonces que es un problema de la consulta que es muy compleja? Como comentaba, en local me va perfectamente, pero en el servidor parece que se queda a medias...

Bueno, efectivamente calendarios_dias es una tabla con todos los días del año, con dos columnas, mes y ano. Quiero que dependiendo del mes, me saque por cada usuario los días que no ha insertado nada en la BD.

Calendarios_dias y consultores no están relacionada, pero no consigo que dentro del select que está en el WHERE, me saque también el nombre del consultor. Por eso está duplicado el condicional
Código PHP:
Ver original
  1. AND consultores.Ident_consultor = '$consultor_no_report'
Uno dentro del primero SELECT y otro dentro del WHERE.

Voy a consultar el uso de LEFT JOIN que no lo tengo muy claro

Gracias nuevamente quimfv!
  #4 (permalink)  
Antiguo 13/09/2012, 06:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Aplicación en Localhost y Servidor

Cita:
con todos los días del año, con dos columnas, mes y ano
seran tres dia mes y año o fecha mes dia y año.

tablaizquierda ti LEFT JOIN tabladerecha td ON ti.uncampocomun=td.uncampocomun
WHERE td.uncampocomun IS NULL

Esto esto dari los registro de la tabla de la izquierda que no tienen ninguno relacionado en la tabla de la derecha

Código MySQL:
Ver original
  1. SELECT cd.dia AS dia,
  2.            sbc.consultor AS consultor
  3. FROM calendario_dias cd
  4.        LEFT JOIN (SELECT DISTINCT t.dia,
  5.                                   c.consultor
  6.                                   FROM trabajos t
  7.                                     INNER JOIN consultores c
  8.                                       ON t.consultores_Ident_consultor =c.Ident_consultor
  9.               WHERE MONTH(t.dia) = $mes
  10.                    AND YEAR(t.dia) = $ano
  11.                    AND c.Ident_consultor = $consultor_no_report
  12.                    AND c.esconsultor = 1
  13.                    AND c.reporte_habitual = 1
  14.                    AND (c.f_fin='' OR c.f_fin = '0000-00-00')) as sbc
  15.         ON  cd.dia=sbc.dia      
  16. WHERE cd.mes = $mes
  17.    AND sbc.dia IS NULL;

Esto podria funcionar.... siempre que dia sea un campo de tipo fecha

Pero el fallo lo puedes tener en que al ejecutar muchas veces la consulta el script en su conjunto tarde tanto que el navegador lo corte....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 13/09/2012 a las 06:34
  #5 (permalink)  
Antiguo 13/09/2012, 06:38
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Aplicación en Localhost y Servidor

Gracias quimfv de nuevo!

En cuanto esté con mi ordenador en casa lo pruebo...

En el caso de que el problema sea que tiene que ejecutar la consulta en numerosas ocasiones, como he comentado antes he intentado aumentar tanto la memoria que se requiere, como el tiempo de ejecución. ¿Habría que modificar algo más que pueda influir?

Muchas gracias!!!
  #6 (permalink)  
Antiguo 13/09/2012, 06:40
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 17 años, 11 meses
Puntos: 58
Respuesta: Aplicación en Localhost y Servidor

Si realizas muchas consultas, es posible que esté relacionado con el número de consultas máximo por hora de un usuario o en caso de no cerrar las conexiones, en el número máximo de conexiones del usuario simultáneas.
  #7 (permalink)  
Antiguo 14/09/2012, 05:33
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Aplicación en Localhost y Servidor

Muchas gracias a los dos por las respuestas.

Pues día no es un campo fecha, es un campo numérico. La tabla calendarios_dias tiene dos campos solamente mes y día, independientemente del año. Sin embargo en la otra tabla hay un campo fecha, y otros 3 campos numéricos para el día, mes y año. ¿cómo podría modificar la consulta para ese tipo de dato?

Y en el caso de que tenga que ver con el número de consultas máximo por hora de un usuario o el número máximo de conexiones del usuario simultáneas, ¿desde donde se puede modificar?

muchas gracias!
  #8 (permalink)  
Antiguo 15/09/2012, 06:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Aplicación en Localhost y Servidor

Con el LEFT JOIN no te saldrá lo que buscas, me he dado cuenta ahora puesto que si la fecha es nula tambien lo serà el consultor....

Habria que repensarlo todo, apesar del error fijate en el uso de las funciones de fecha para que veas lo inutiles que son los campos numéricos adicionales que estas usando. Aparte de inutiles son peligrosos y expresamente prohibidos en un buen diseño de bbdd relacional. Es la misma información guardada dos veces lo que ademas de ocupar especio inutilmente pone en peligro la consistencia de la información, si por un error X fecha y los campos dia, mes y ano no son coherentes que info será la buena....?

Para solucionar esto deberias obtener el nombre del consultor previamente, igual que obtinenes su identificador y agregarlo como una constante usando la variable que lo guarda.


Código MySQL:
Ver original
  1. SELECT cd.dia AS dia,
  2.              cd.mes AS mes,
  3.              $ano AS ano,
  4.              $consultor AS consultor
  5. FROM calendario_dias cd
  6.        LEFT JOIN (SELECT DISTINCT t.fecha
  7.                                   FROM trabajos t
  8.                                     INNER JOIN consultores c
  9.                                       ON t.consultores_Ident_consultor =c.Ident_consultor
  10.               WHERE MONTH(t.fecha) = $mes
  11.                    AND YEAR(t.fecha) = $ano
  12.                    AND c.Ident_consultor = $consultor_no_report
  13.                    AND c.esconsultor = 1
  14.                    AND c.reporte_habitual = 1
  15.                    AND (c.f_fin='' OR c.f_fin = '0000-00-00')) as sbc
  16.         ON  cd.dia=DAYOFMONTH(sbc.fecha) AND cd.mes=MONTH(sbc.fecha)    
  17. WHERE cd.mes = $mes
  18.    AND sbc.fecha IS NULL;

En cuanto a si el error se produce por la cantidad de consultas...sin conocer tu negocio es dificil aventurar alternativas pero la solucion iria en la linea de pensar una consulta que retorne la info de todos los consultores a la vez y luego tratar la info sobre el array obtenido....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #9 (permalink)  
Antiguo 17/09/2012, 03:49
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: Aplicación en Localhost y Servidor

Buenas!

muchas gracias por tu ayuda quimfv. Finalmente he conseguido que funcione, indexando en la base de datos el campo dia de la tabla trabajos, lo que hace que la consulta se ejecute mucho más rapidamente. Aún así, voy a replantear el problema como comentas, para quitar los campos numéricos y trabajar unicamente con los campos fecha (DATE)

un saludo y gracias de nuevo!

Etiquetas: localhost, servidor, sql, 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 18:40.