Foros del Web » Programando para Internet » PHP »

Optimizacion

Estas en el tema de Optimizacion en el foro de PHP en Foros del Web. Miren este código y diganme si se puede optimizar más o así esta bueno. A partir de esas funciones estoy creando mi foro. Código PHP: ...
  #1 (permalink)  
Antiguo 04/06/2004, 14:19
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Pregunta Optimizacion

Miren este código y diganme si se puede optimizar más o así esta bueno. A partir de esas funciones estoy creando mi foro.
Código PHP:
function Foro(){
  if(isset(
$_GET['foro']) && $_GET['foro']=="all"){
   
$query "SELECT cf.* FROM catforos cf WHERE cf.active<>0 ORDER BY cf.presentation_order ASC";
   
$result mysql_query($query) or die("No se ha podido ejecutar la consulta ".$query.". Error: ".mysql_error());
   if(
mysql_num_rows($result)!=0){
    echo 
"<table width='100%'  border='0' cellpadding='0' cellspacing='1' bordercolor='#003366' class='table'>
         <tr><td width='62%' class='forotema' style='padding-left:5px; padding-right:3px; padding-top:2px; padding-bottom:2px;'>Foro</td>
         <td width='11%' class='forotema center'>Mensajes</td><td width='8%' class='center forotema'>Temas</td>
         <td width='19%' class='center forotema'>Último mensaje </td></tr>"
;
    while(
$fetch=mysql_fetch_assoc($result)){
     echo 
"<tr>
           <td colspan='4' class='txt forotema' style='padding-left:5px; padding-right:3px; padding-top:2px; padding-bottom:2px;'>"
.$fetch['title']."</td>
           </tr><tr><td colspan='4' class='txt'>"
;
     
# Llamada a la función para mostrar los Foros
     
Topics($fetch['idcat']);
     echo 
"</td></tr>";
    }
    echo 
"<tr><td colspan='5' class='center forobottom' style='padding-left:5px; padding-right:3px; padding-top:2px; padding-bottom:2px;'>Foro diseñado por <a href='http://reynierpm.variosweb.com/index.php?action=show&".SID."'>ReynierPM Online</a> - &copy; Todos los derechos reservados </td></tr>
          <tr><td colspan='5' class='center forobottom' style='padding-left:5px; padding-right:3px; padding-top:2px; padding-bottom:2px;'>Versión 1.0.0a :: Acerca de ReynierPM Online Foro</td></tr>
          </table>"
;
   }else{
    echo 
"No hay categorías disponibles en el Forum para mostrar";
   }
  }else{
   
# Llamada a la función para mostrar los Post
   
Post($_GET['foro']);
  }
 }

# Mod: Mostrar subforos
 
function Topics($idcat){
  if(isset(
$_GET['foro']) && $_GET['foro']=="all"){
   
$query "SELECT fr.* FROM foros fr WHERE  fr.idcat='".$idcat."' AND fr.active<>0 ORDER BY fr.idforo";
   
$result mysql_query($query) or die("No se ha podido ejecutar la consulta ".$query.". Error: ".mysql_error());
   if(
mysql_num_rows($result)!=0){
    echo 
"<table width='100%'  border='0' cellpadding='0' cellspacing='1' bordercolor='#003366'>";
    while(
$fetch=mysql_fetch_assoc($result)){
     
# Consulta para calcular la cantidad de post
     
$sub_query "SELECT idpost,count(idpost) as cant,date, DAYOFMONTH(date) AS dia, DAYOFWEEK(date) AS semana, MONTH(date) AS mes, YEAR(date) AS year, DATE_FORMAT(date,'%h:%i %p') AS hora FROM post WHERE idforo='".$fetch['idforo']."' AND idcat='".$idcat."' group by idcat ORDER BY date ASC";
     
$sub_result mysql_query($sub_query) or die("No se ha podido ejecutar la consulta ".$sub_query.". Error: ".mysql_error());
     
$res mysql_fetch_assoc($sub_result);
     
# Consulta para calculara la cantidad de mensajes
     
$sub_sub_query "SELECT count(idreply) as cant FROM reply WHERE idforo='".$fetch['idforo']."' AND idcat='".$idcat."' AND idpost='".$res['idpost']."'";
     
$sub_sub_result mysql_query($sub_sub_query) or die("No se ha podido ejecutar la consulta ".$sub_sub_query.". Error: ".mysql_error());
     
$res_res mysql_fetch_assoc($sub_sub_result);
     
# Fecha del último post
     
if($res['date']==""){
      
$lastpost "No hay nigún mensaje";
     }else{
      
$nombre_meses = array("Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic");
      
$dias_semana = array("Dom","Lun","Mar","Mie","Jue","Vie","Sab");
      
$lastpost $dias_semana[$res['semana']-1]." ".$res['dia']." ".$nombre_meses[$res['mes']-1]." ".$res['year']." ".$res['hora'];
     }
     
# Obtenemos la cantidad de temas disponibles para ese Post, Foro y Categoria
     
if(mysql_num_rows($sub_sub_result)){
      
$themes $res_res['cant'] + $res['idpost'];
     }else{
      
$themes 0;
     }
     
# Obtenemos el numero de mensajes disponibles en ese foro y categoria
     
if(mysql_num_rows($sub_result)!=0){
      
$post $res['cant'];
     }else{
      
$post 0;
     }
     echo 
"<tr><td width='2%' rowspan='2' class='txt td' style='padding-left:5px; padding-right:3px; padding-top:2px; padding-bottom:2px;'><div align='center'><a href='foros.php?action=show&catforo=".$fetch['idcat']."&foro=".$fetch['idforo']."&".SID."'><img src='images/forum/oldtopics.gif' width='27' height='27' border='0' alt='Entrar al Foro ".$fetch['title']."'></a></div></td>
           <td width='57%' class='titleforo td' style='padding-left:5px; padding-right:3px; padding-top:2px; padding-bottom:2px;'><a href='foros.php?action=show&catforo="
.$fetch['idcat']."&foro=".$fetch['idforo']."&".SID."'>".$fetch['title']."</a></td>
           <td width='12%' class='txtcn td'>"
.$post."</td><td width='79' class='txtcn td'>".$themes."</td>
           <td width='19%' class='txtcn td'>"
.$lastpost."</td></tr><tr>
           <td colspan='4' class='txt td' style='padding-left:5px; padding-right:3px; padding-top:2px; padding-bottom:2px;'>"
.$fetch['description']."</td>
           </tr>"
;
    }
    echo 
"</table>";
   }else{
    echo 
"Esta categoría no posee ningún Foro de Discusión";
   }
  }
 } 
jeje he probado optimizar las consultas pero no me va.
El diseño de la BDatos es este:
Cita:
CREATE TABLE `catforos` (
`idcat` int(6) unsigned NOT NULL auto_increment,
`title` varchar(50) NOT NULL default '',
`description` varchar(255) NOT NULL default '',
`presentation_order` bigint(2) default NULL,
`active` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`idcat`)
) TYPE=MyISAM COMMENT='Foros Categories';

CREATE TABLE `foros` (
`idforo` int(6) unsigned NOT NULL auto_increment,
`idcat` int(6) default NULL,
`title` varchar(50) NOT NULL default '',
`description` varchar(255) NOT NULL default '',
`presentation_order` tinyint(2) default NULL,
`active` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`idforo`)
) TYPE=MyISAM COMMENT='Foros';


CREATE TABLE `post` (
`idpost` int(6) unsigned NOT NULL auto_increment,
`idtopic` int(6) default NULL,
`idcat` int(6) default NULL,
`idforo` int(6) default NULL,
`iduser` int(6) default NULL,
`type` tinyint(1) NOT NULL default '0',
`subject` varchar(200) NOT NULL default '',
`text` text NOT NULL,
`date` datetime default NULL,
PRIMARY KEY (`idpost`)
) TYPE=MyISAM COMMENT='Post for Topics';


CREATE TABLE `reply` (
`idreply` int(6) unsigned NOT NULL auto_increment,
`idpost` int(6) default NULL,
`idcat` int(6) default NULL,
`idforo` int(6) default NULL,
`iduser` int(6) default NULL,
`subject` varchar(50) NOT NULL default '',
`text` text NOT NULL,
`date` datetime default NULL,
PRIMARY KEY (`idreply`)
) TYPE=MyISAM COMMENT='Replies for Post';
Salu2
__________________
Ing. Reynier Pérez Mira
  #2 (permalink)  
Antiguo 04/06/2004, 15:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si no explicas tu "modelo de datos" .. es bastante complicado ir averigüando tabla por tabla las "claves foráneas" que tienens por ahí distribuidad para hacerse una idea de las relaciones que hay .. como para luego intentar re-hacer alguna consulta SQL que tengas por ahí .. También haría falta que explicases que es lo que hacen tus funciones.

Todo código "fuera de contexto" es complicado evaluarlo y menos mejorarlo salvo algún detalle muy "obvio" ... Ten encuenta que tu llevas N dias trabajando ese código y sobre todo "probandolo en vivo". ¿ que consigue alguinen aquí en crearse esas tablas en su BD y "ver tus funciones" que no se vé como las llamas en su contexto? ..

En resumen .. O dices exactamente que cosa crees tu que se puede optimizar (tal vez por qué desconoces como hacerlo "mejor" con más SQL ..) o dejas la aplicación completa para que alguien se anime a probarlo y estudiarlo como para darte sus impresiones y mejoras si corresponden.

Un saludo,
  #3 (permalink)  
Antiguo 04/06/2004, 20:02
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Cluster lo que quiero tratar de optimizar es la consulta pues como ves he tenido que crear 3 consultas para resolver lo de cantidad de tópicos, respuestas o temas y ultimo post. He tratado de hacerlo yo pero no doy "pie con bola" como se dice acá en Cuba. En cuanto a lo de la ejecución del código con solamente hacer esto:
Código PHP:
Foro(); 
y poner este código dentro del mismo archivo ya ejecuta y te forma todo lo del foro. Espero me puedan dar una ayuda.
Salu2 :)
__________________
Ing. Reynier Pérez Mira
  #4 (permalink)  
Antiguo 05/06/2004, 06:45
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

La optimizacion a nivel de codigo (PHP o SQL) es el ultimo nivel de optimizacion. Primero debes optimizar a nivel de ideas (algoritmo).

Quieres mostrar el ultimo mensaje y el numero de mensajes. ¿Por que no creas 2 campos mas en la tabla foros: num_posts y last_post? Luego en el codigo que graba los post, tambien debes actualizar esos campos. Sacas trabajo de un sitio para ponerlo a otro.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 05/06/2004, 09:12
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Bueno ya he resuelto ese problema ahora mi duda esta en como mover el puntero arriba o abajo de la fila actual. Por ejemplo para hacer un seguimiento de mensaje siguiente y mensaje anterior.
Salu2 :)
__________________
Ing. Reynier Pérez Mira
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 01:18.