Foros del Web » Programando para Internet » PHP »

optimizar código

Estas en el tema de optimizar código en el foro de PHP en Foros del Web. Hola. Actualmente útilizo este script para realizar búsquedas, pero desearía optimizarlo, ya que para implementarlo correctamente debo repetirlo 30 veces!! titulo, autor, editorial, etcc.. os ...
  #1 (permalink)  
Antiguo 28/05/2011, 03:58
 
Fecha de Ingreso: junio-2008
Mensajes: 291
Antigüedad: 15 años, 10 meses
Puntos: 9
optimizar código

Hola. Actualmente útilizo este script para realizar búsquedas, pero desearía optimizarlo, ya que para implementarlo correctamente debo repetirlo 30 veces!! titulo, autor, editorial, etcc..

os lo pongo y os cuento mejor:

Código PHP:
Ver original
  1. if (!isset($_GET['buscar'])){
  2. $_pagi_sql = "";
  3.  
  4. if (isset ($autor) && !($autor == "")) {
  5. $_pagi_sql .= " autor LIKE '%$autor%'";
  6. }
  7. if (isset ($titulo) && !($titulo == "")) {
  8.   $palabras=explode(" ",$titulo);
  9.   foreach ($palabras as $palabra){
  10.     if (! ($_pagi_sql == "")) {$_pagi_sql .= " AND "; } //tendras que poner esto aquí
  11.     $_pagi_sql .= " titulo LIKE '%$palabra%'";
  12.   }
  13. }


Debería modificar todas las líneas como:

Código PHP:
Ver original
  1. if (isset ($autor) && !($autor == "")) {
  2. $_pagi_sql .= " autor LIKE '%$autor%'";
  3. }

por:

Código PHP:
Ver original
  1. if (isset ($titulo) && !($titulo == "")) {
  2.   $palabras=explode(" ",$titulo);
  3.   foreach ($palabras as $palabra){
  4.     if (! ($_pagi_sql == "")) {$_pagi_sql .= " AND "; } //tendras que poner esto aquí
  5.     $_pagi_sql .= " titulo LIKE '%$palabra%'";
  6.   }
  7. }

con el consiguiente lío para asignar a todas las variables lo mismo una y otra vez y repetirla instrucción constantemente tantísimas veces. Por otro lado desconozco si aplicar en todas las intrucciones esto me daría problemas ya que asignaría siempre:

Código PHP:
Ver original
  1. LIKE '%$palabra%'";
  #2 (permalink)  
Antiguo 28/05/2011, 07:57
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 13 años, 8 meses
Puntos: 202
Respuesta: optimizar código

Hay una cosa que se llama function. Básico en los lenguajes de programación
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(
  #3 (permalink)  
Antiguo 28/05/2011, 11:15
 
Fecha de Ingreso: julio-2009
Mensajes: 72
Antigüedad: 14 años, 8 meses
Puntos: 16
Respuesta: optimizar código

Como dice IEKK usa funciones, y tambien te recomiendo que uses indices full text de mysql. visita este enlace: http://dev.mysql.com/doc/refman/5.0/...xt-search.html, quizas te ayude para no usar tanto los like en las consultas sql

saludos!
__________________
Desarrollo de proyectos web
Cursos en Argentina - Cursos en México
  #4 (permalink)  
Antiguo 29/05/2011, 05:14
 
Fecha de Ingreso: junio-2008
Mensajes: 291
Antigüedad: 15 años, 10 meses
Puntos: 9
Respuesta: optimizar código

Hola y gracias por las respuestas.

actualmente he visto una función que podría adaptar, la pregunta es: ¿cómo puedo introducir el array de todos los campos del $_GET?

Código PHP:
Ver original
  1. function buscar($sTabla,$aCampos,$cDb,$iPaginas = 10){
  2.   global $iTotal,$aResultados;
  3.   $_GET['pag'] *= 1;
  4.   $aPalabras = split(' ',addslashes($_GET['q']));
  5.   foreach($aPalabras as $sPalabra)if($sPalabra != ''){
  6.     $preq .= " AND ( 0";
  7.     foreach($aCampos as $sCampo)$preq .= " OR $sCampo LIKE '%".$sPalabra."%'";
  8.     $preq .= ")";
  9.   }
  10.   $iTotal = mysql_result(mysql_query("SELECT COUNT(".$aCampos[0].") FROM `$sTabla` WHERE 1$preq",$cDb),0);
  11.   $aResultados=mysql_query("SELECT * FROM `$sTabla` WHERE 1$preq LIMIT ".($_GET['pag']*$iPaginas).",$iPaginas",$cDb);
  12. }

Última edición por charlyta; 29/05/2011 a las 05:32
  #5 (permalink)  
Antiguo 29/05/2011, 07:53
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: optimizar código

Yo te recomiendo usar lo que te recomendó pochos. Es fácil de implementar y es mucho mas eficiente.
Nota: Los indices FULLTEXT solo funcionan con el engine MyISAM de MySQL, si usas InnoDB o algún otro tendrás que usar un servidor aparte e instalarte algo como Sphinx o Lucene.
  #6 (permalink)  
Antiguo 29/05/2011, 11:14
 
Fecha de Ingreso: junio-2008
Mensajes: 291
Antigüedad: 15 años, 10 meses
Puntos: 9
Respuesta: optimizar código

Hola. Ya utilizo full text, tan sólo quiero mejorar esta parte porque con full text no es fiable:

Código PHP:
Ver original
  1. if(isset($_POST['submitted'])) {
  2. if ($clave<>''){  
  3.  
  4. {
  5.  
  6.    $trozos=explode(" ",$clave);
  7.    $numero=count($trozos);
  8.   if ($numero==1)
  9.    {
  10.   $buscar="SELECT * FROM $db WHERE NOMB LIKE '%$clave%' OR AUTOR LIKE '%$clave%'
  11. OR TEMA LIKE '%$clave%' OR COLECCION LIKE '%$clave%' OR EDITORIAL LIKE '%$clave%'
  12. OR LIBRE LIKE '%$clave%' OR OBSERVA LIKE '%$clave%' order by $ordenarpor $orden";
  13.   }
  14.   elseif ($numero>1)
  15.    {
  16.  
  17.    $buscar= "SELECT * , MATCH (NOMB, AUTOR, TEMA, COLECCION, EDITORIAL, LIBRE, OBSERVA)
  18. AGAINST ('$clave' IN BOOLEAN MODE) AS Score FROM $db WHERE MATCH (NOMB, AUTOR, TEMA,
  19. COLECCION, EDITORIAL, LIBRE, OBSERVA) AGAINST ('$clave' IN BOOLEAN MODE) ORDER BY Score DESC ";
  20. }
  21. }
  22. }}else
  23.  
  24.  {
  25.  $buscar = "SELECT * FROM $db WHERE NOMB LIKE '%$NOMB%' AND AUTOR LIKE '%$AUTOR%'
  26. AND TEMA LIKE '%$TEMA%'  AND EDITORIAL LIKE '%$EDITORIAL%'  OR TEMA LIKE '%$TEMA%' AND
  27. (AUTOR LIKE '%$AUTOR%' AND EDITORIAL LIKE '%$EDITORIAL%' AND NOMB LIKE '%$NOMB%') OR
  28. NOMB LIKE '%$NOMB%' AND (AUTOR LIKE '%$AUTOR%' AND EDITORIAL LIKE '%$EDITORIAL%' AND
  29. TEMA LIKE '%$TEMA%') order by $ordenarpor $orden";
  30.  }

utilizando lo anterior a este post, pudo encontrar busquedas multicriterio con frases en cada campo..
  #7 (permalink)  
Antiguo 29/05/2011, 11:37
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: optimizar código

Me quede un poco confundido. Si deseas repetirlo 30 veces, aunque esta es la forma menos recomendada en el mundo pero te ayudará a entender como usar una funcion para repetir las instrucciones dentro un determinado numero de veces.

Código PHP:
Ver original
  1. for($i=0;$i<30;$i++){
  2.  
  3. echo "El interior de éste for se ha ejecutado ".$i." veces <br>";
  4.  
  5. }

Resultado:

Código texto:
Ver original
  1. El interior de éste for se ha ejecutado 0 veces
  2. El interior de éste for se ha ejecutado 1 veces
  3. El interior de éste for se ha ejecutado 2 veces
  4. El interior de éste for se ha ejecutado 3 veces
  5. El interior de éste for se ha ejecutado 4 veces
  6. .
  7. .//Sucesivamente hasta 29
  8. .
  9. El interior de éste for se ha ejecutado 29 veces

Contado que empieza en 0 y termina en 29, son un total de 30 ejecuciones

Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #8 (permalink)  
Antiguo 29/05/2011, 11:47
 
Fecha de Ingreso: junio-2008
Mensajes: 291
Antigüedad: 15 años, 10 meses
Puntos: 9
Respuesta: optimizar código

Gracias por las respuestas.

Perdonadme pero creo que no me he explicado bien.. Imaginaros que tengo esta instrucción:

Código PHP:
Ver original
  1. $fields=array('tema', 'autor', 'titulo');
  2. $sql_where="";
  3. for ($i=0;$i<count($fields);$i++)
  4. {
  5.  
  6.     ($sq_where="")?"":" , ";
  7.     $sql_where.=$fields[$i]."='".$_GET[$fields[$i]]>"' ";
  8.  
  9. }
  10. $sql="SELECT * from $table where ".$sql_where." limit 20";

Lo que necesito es introducir en ella el GET con las variables recibidas
(yo suelo hacer:

Código PHP:
Ver original
  1. foreach ($_GET as $key => $value)
e implementar AND/OR

es decir sustituir $_GET[$fields[$i]]>" por las variables recibidas


Sé que es todo demasiado tonto pero me ayuda a aprender.. Gracias de nuevo


que me quedase parecido a esto

Código PHP:
Ver original
  1. foreach ($_GET as $key => $value) if ($key != ''){
  2.       $preq .= " AND ( 0";
  3.     foreach($Campos as $Campo)$preq .= " OR $Campo LIKE '%".$value."%'";
  4.     $preq .= ")";


o lo que es lo mismo solucionar esta función correctamente:

Código PHP:
Ver original
  1. function buscar($Tabla,$Campos,$db,$con){
  2. foreach ($_GET as $key => $value) if ($key != ''){
  3.       $preq .= " AND ( 0";
  4.     foreach($Campos as $Campo)$preq .= " OR $Campo LIKE '%".$value."%'";
  5.     $preq .= ")";
  6.    
  7.   }
  8.   $result=mysql_query("SELECT * FROM '$Tabla' WHERE $preq",$con);
  9.          
  10. }

Última edición por charlyta; 29/05/2011 a las 11:52
  #9 (permalink)  
Antiguo 29/05/2011, 11:59
 
Fecha de Ingreso: junio-2008
Mensajes: 291
Antigüedad: 15 años, 10 meses
Puntos: 9
Respuesta: optimizar código

Código PHP:
Ver original
  1. <?php
  2. function buscar($Tabla,$Campos,$db,$con){
  3.     $numero = count($_GET);
  4.     $tags = array_keys($_GET);
  5.     $valores = array_values($_GET);
  6.     for($i=0;$i<$numero;$i++)
  7.     {
  8.         $$tags[$i]=$valores[$i];
  9.     }
  10. foreach ($_GET as $key => $value) if ($key != ''){
  11.       $preq .= " AND ( 0";
  12.     foreach($Campos as $Campo)$preq .= " OR $Campo LIKE '%".$value."%'";
  13.     $preq .= ")";
  14.    
  15.   }
  16.   $result=mysql_query("SELECT * FROM '$Tabla' WHERE $preq",$con);
  17.          
  18. }
  19. ?>
  20. <html><head>
  21. <title>Buscando ...</title>
  22. </head><body><?
  23. ?>
  24. <form method="GET" action="recibir.php">
  25. <input type="text" name="autor" id="autor" value="">
  26. <input type="text" name="titulo" id="titulo" value="">
  27. <input type="submit" value="Buscar"><br> </form>
  28. <?
  29.  
  30.  
  31.  
  32.  
  33. $db = mysql_connect('localhost','root','')or die (mysql_error()); ;
  34.  
  35. $con = mysql_select_db('libros',$db)or die (mysql_error()); ;
  36.  
  37. $Campos = array ('tema','autor','titulo');
  38.  
  39. buscar('libros',$Campos,$db,$con);
  40.  while ($row = mysql_fetch_array($result)){
  41.  
  42. echo $row['autor'];
  43.  
  44.  }


esta es mi función que no va bien

Etiquetas: Ninguno
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 03:12.