Foros del Web » Programando para Internet » PHP »

PHP OO Problema con Strpos

Estas en el tema de Problema con Strpos en el foro de PHP en Foros del Web. Estoy descomponiendo una cadena en partes guardandola en un arreglo y buscando en escribiendo las ocurrencias al extraer en la base de datos, pero no ...
  #1 (permalink)  
Antiguo 24/04/2013, 19:00
Avatar de fmb1982  
Fecha de Ingreso: junio-2007
Mensajes: 128
Antigüedad: 17 años, 5 meses
Puntos: 0
Sonrisa Problema con Strpos

Estoy descomponiendo una cadena en partes guardandola en un arreglo y buscando en escribiendo las ocurrencias al extraer en la base de datos, pero no encuentro nada!!!! alguien sabe cual es el problema?? saludos.

Código PHP:
  <?php 
   
if (!empty($_POST['bus_']))
  {
  
$param=explode(" ",$_POST['bus_']);
  
$bus_=$_POST['bus_'];
  
$maxi=count($param);
     for(
$punt=0;$punt<$maxi;$punt++)
       {
       
$queryca mysql_query("select * from usr_pmx");
       
$resultca mysql_num_rows($queryca);
         for(
$punta=0;$punta<$resultca;$punta++)
       {
        
$resultdca mysql_fetch_array($queryc);
        if (
strpos($resultdca['pmx_nom'],$param[$punt]) or strpos($resultdca['pmx_app'],$param[$punt]) or strpos($resultdca['pmx_apm'],$param[$punt]))
          {
          echo 
$resultdca['pmx_nom']." ".$resultdca['pmx_app']." ".$resultdca['pmx_apm']." ";
          }
       }
      }
  }
  
?>
__________________
Fidel Medina Bravo
TodocabeN150charsabiendoloacomodar...
http://about.me/fidelMB
  #2 (permalink)  
Antiguo 25/04/2013, 06:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Problema con Strpos

Difícil de leer ese codigo...

Porque haces $maxi veces la misma consulta a la bbdd.

Que seguridad tienes que esa consulta te retorna los registros en el orden que te interesa para que tenga algo que ver el registro con el registro de $param.... bueno comparas todos con todos quizas no hace falta ordenar.

Código PHP:
Ver original
  1. <?php
  2.    if (!empty($_POST['bus_']))  {
  3.         $param=explode(" ",$_POST['bus_']);
  4.         $bus_=$_POST['bus_'];
  5.         $consulta=array();
  6.         //ejecutamos la consulta una sola vez
  7.         $queryca = mysql_query("select * from usr_pmx");
  8.         while ($row=mysql_fetch_array($queryca)){
  9.                array_push($consulta,$row);
  10.         }
  11.         //ahora en $consulta tienes el resultado completo de la consulta
  12.  
  13.        //Apartir de aqui puedes comparar los dos arrays, sin "molestar" mas al servidor
  14.  
  15.        for($punt=0;$punt<count($param);$punt++){
  16.            for($punta=0;$punta<count($consulta);$punta++)
  17.                  $row=$consulta[$punta];
  18.                  if (strpos($row['pmx_nom'],$param[$punt]) ||
  19.                      strpos($row['pmx_app'],$param[$punt])  ||
  20.                      strpos($row['pmx_apm'],$param[$punt]))  {
  21.                          echo $row['pmx_nom']." ".$row['pmx_app']." ".$row['pmx_apm']." ";
  22.                 }
  23.             }
  24.       }
  25. }
  26. ?>

No se si tiene sentido pero esto cargará menos al servidor de bbdd.

He supuesto que aqui solo habia un error tipografico

$queryca = mysql_query("select * from usr_pmx");
...

$resultdca = mysql_fetch_array($queryc);

$queryca <>$queryc

y tambien he supuesto que $bus_ la usas mas adelante....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 25/04/2013 a las 06:14
  #3 (permalink)  
Antiguo 25/04/2013, 06:04
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problema con Strpos

Tu codigo puede resumirse en este:

Código PHP:
Ver original
  1. <?php  
  2.     if (!empty($_POST['bus_'])) {
  3.         $busqueda=str_replace('%','\%',$_POST['bus_']); //Si hay un '%' lo escapamos para que no sea comodin.
  4.         $busqueda=str_replace(' ','%',$busqueda); //Los espacios delimitan palabras.
  5.         $queryca = mysql_query("select * from usr_pmx WHERE pmx_nom LIKE '%$busqueda%' OR pmx_app LIKE '%$busqueda%' OR pmx_apm LIKE '%$busqueda%'");
  6.         while($resultdca = mysql_fetch_array($queryca)) {
  7.             echo $resultdca['pmx_nom']." ".$resultdca['pmx_app']." ".$resultdca['pmx_apm']." ";
  8.         }
  9.     }
  10. ?>

saludos
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 25/04/2013, 07:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Problema con Strpos

Bien visto NSD.????

Solo dos dudas

1. Esa consulta si funciona puede ser muy muy pesada.
2. Esos LIKE van a buscar toda la "frase"

$bus_="Un perro blanco";
$busqueda="Un%perro%blanco"

...WHERE pmx_nom LIKE '%Un%perro%blanco%'...

lo que quiere decir cero o n caracteres antes de "Un", idem antes de "perro"..."blanco".... con lo que si una de las tres palabras no esta la comparación fallará... e incluso si estan las tres pero en otro orden.

Si pmx_nom="perro" no es LIKE '%Un%perro%blanco%', aún que sea LIKE "%perro%"

No funciona


Código PHP:
Ver original
  1. <?php  
  2.     if (!empty($_POST['bus_'])) {
  3.         //$_POST['bus_'] = "Un perro blanco"
  4.         $busqueda='"';
  5.         $busqueda.=str_replace(' ','","',$_POST['bus_']); //Los espacios delimitan palabras.
  6.         $busqueda.='"';
  7.         //$busqueda='"Un","perro","blanco"'
  8.         $queryca = mysql_query("select * from usr_pmx ".
  9.                                            "WHERE pmx_nom IN (".$busqueda.") "
  10.                                                 ."OR pmx_app IN (".$busqueda.") "
  11.                                                 ."OR pmx_apm IN (".$busqueda.")");
  12.                                            //WHERE pmx_nom IN ("Un","perro","blanco") ...
  13.         while($resultdca = mysql_fetch_array($queryca)) {
  14.             echo $resultdca['pmx_nom']." ".$resultdca['pmx_app']." ".$resultdca['pmx_apm']." ";
  15.         }
  16.     }
  17. ?>

Esta quizas si... ya no importa ni el orden ni si estan todas o no...

Si pmx_nom="perro" luego esta en ("Un","perro","blanco")

Seguirá pesando bastante creo... no se si es mejor mi primera opción.

Ojo, con las mayúsculas y las minúsculas.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 25/04/2013 a las 07:41
  #5 (permalink)  
Antiguo 26/04/2013, 06:18
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problema con Strpos

mmmm podria ser una vercion alternativa si, depende del uso que se le quiera dar, si nesesita lo que tu planteas si, mi consulta no servira, de cualquier manera, me parece mucho mejor metrlo en la consulta (en la tuya o en la mia) que traer todos los resultados y despues recorrerlos en php, como me dijo una vez un miembro de este foro "Eso seria una solucion de programador no de DBA", imaginate que la tabla tiene 5000 registros, seria un trafico entre el motor mysql y el de php enorme, traer todos esos registros, cargarlos en memoria (el objeto con la info esta en memoria siempre) supondria un gran consumo, 20 usuarios usando en simultaneo y saturaste al server.

es preferible un poco de lentitud estable, a mi modo de verlo. igual la desicion de que codigo usara no es nuestra.

saludos
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 26/04/2013, 11:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Problema con Strpos

Totalmente de acuerdo....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #7 (permalink)  
Antiguo 26/04/2013, 14:21
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, 7 meses
Puntos: 270
Respuesta: Problema con Strpos

El código original hace strpos(), por lo que no se puede usar "=", y hay que hacer "LIKE".
Que va a ser lento, es seguro.Pero va a ser más rápido que PHP + transferencia de filas por la red + memoria usada para obtener todo el resultset...
En un one-liner:
Código PHP:
Ver original
  1. $cad="a b c d";
  2. $fields=array("pmx_nom","pmx_app","pmx_apm");
  3.  
  4. $res = mysql_query("select * from usr_pmx  WHERE ".implode(" OR ",array_map(function($p) use ($cad){return $p." LIKE '%".implode("%' OR ".$p." LIKE '%",explode(" ",$cad))."%'";},$fields));

Con 5 palabras en la entrada, esa query produce 15 "LIKE"s..
Otra opción podría ser concatenar los 3 campos, y hacer "LIKE"s sobre la concatenación (al fin y al cabo, los índices no los vamos a usar en ningún caso..)
Esto , podría hacerse con una query del tipo
Código MySQL:
Ver original
  1. ... WHERE CONCAT(pmx_nom ,' ',pmx_app,' ',pmx_apm) LIKE '%palabra1%' OR CONCAT...
3 concats y tantos OR como palabras

Y, otra cosa a probar es haciendo un solo concat, como una subquery
Código MySQL:
Ver original
  1. select * from (SELECT CONCAT(pmx_nom ,' ',pmx_app,' ',pmx_apm)  as total FROM usr_pmx ) concats WHERE total LIKE '%palabra1%' OR total LIKE '%palabra2%'...
Se hace 1 solo concat, y tantos LIKE como palabras hubiera en la cadena original.
Qué opción es mejor, no sabría decirlo sin probarlo..Supongo que el número de filas de la tabla será un factor importante.
Incluso el orden de los "OR" puede que sea importante.
  #8 (permalink)  
Antiguo 29/04/2013, 14:31
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problema con Strpos

dashtrash O-O cuantas formas distintas de plantear el mismo problema, fmb1982 ahora tienes opciones de sobra para probar jaja
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: arreglos, cadenas, strpos
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 13:14.