Sistema de búsqueda con PHP+MySQL

859 views
Skip to first unread message

Reynaldo G. R.

unread,
Sep 9, 2013, 5:56:30 PM9/9/13
to php...@googlegroups.com

Hola, estoy realizando un sistema de búsqueda con PHP+MySQL, donde tengo varias opciones dentro del buscador, la idea es que según las opciones seleccionadas se encuentren los registros que cumplan con las opciones seleccionadas, puede ser que se seleccione una o varias o ninguna opción. En caso de no ser seleccionada ninguna opción es de suponer que se devolverán todos los registros.

 

Ejemplo:

El buscador tiene las siguientes opciones:

Edad

Nacionalidad

Estatura

Peso

Pelo

Ojos

 

En un principio estaba realizando la siguiente consulta a la BD:

 

$activo = "si";

 

$query_buscar_registro = sprintf("SELECT * FROM table_persona WHERE activo = %s and edad = %s and nacionalidad = %s and estatura = %s and peso = %s and pelo = %s and ojos = %s",

                                               GetSQLValueString($activo, "text"),

                                               GetSQLValueString($edad, "text"),

                                               GetSQLValueString($nacionalidad, "text"),

                                               GetSQLValueString($estatura, "text"),

                                               GetSQLValueString($peso, "text"),

                                               GetSQLValueString($pelo, "text"),

                                               GetSQLValueString($ojos, "text"));

 

Luego vi que para poder realizar las búsquedas hay que utilizar  MATCH   y   AGAINST.   

 

Alguien me puede decir cómo utilizar estas funciones dentro de mi consulta…???

 

 

 

 

Saludos.

 

 

Federico

unread,
Sep 9, 2013, 6:06:58 PM9/9/13
to php...@googlegroups.com
MATCH y AGAINST se usan para hacer full-text search. Estas seguro que eso es lo que necesitas?

Quizás podes empezar usando LIKE y mientras tanto investigar mas sobre full-text.


2013/9/9 Reynaldo G. R. <reynal...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a php-arg+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/php-arg.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Jose Alberto Gonzalez von Schmeling

unread,
Sep 9, 2013, 6:09:11 PM9/9/13
to php...@googlegroups.com
si queres hacer un verdadero buscador. mira un poco apache solr


2013/9/9 Federico <fede...@gmail.com>



--
Podes encontrarme o comunicarte conmigo en:

Tordek

unread,
Sep 9, 2013, 7:03:30 PM9/9/13
to php...@googlegroups.com
On 09/09/13 18:56, Reynaldo G. R. wrote:
>
> $activo = "si";
>
> $query_buscar_registro = sprintf("SELECT * FROM table_persona WHERE
> activo = %s and edad = %s and nacionalidad = %s and estatura = %s
> and peso = %s and pelo = %s and ojos = %s",

Esto me apesta a SQL injection. No s�, a lo mejor tus
"GetSQLValueString" te protegen, pero a mi me huele a que es muy
probable que sean inyectables.

> Luego vi que para poder realizar las b�squedas hay que utilizar
> *MATCH* y *AGAINST*.

Eso, como te dijeron, es para los �ndices FULLTEXT, y lo que te
permiten es que si vos ten�s una columna con mucho texto (Ej, posts
de un blog), puedas poner "ojos rojos -dragon" y te devuelve todos
los posts que dicen "ojos" y "rojos" pero no "dragon". Pero en base
a la consulta que mostr�s, no es lo que necesit�s.

Por otro lado, si vos quer�s tener que algunas opciones sean "no me
importa", vas a tener problemas de �ndices. Ejemplo:

Si tu consulta es "ojos = azul, edad = no me importa" y tu �ndice es
sobre (edad, ojos, nacionalidad), no pod�s usar un �ndice para
buscar r�pido y vas a terminar usando una b�squeda lineal (que para
pocos registros no importa).

En ese caso, te conviene usar cosas como solr, que te recomendaron;
esos son motores de b�squeda y te permiten r�pidamente buscar sobre
much�simos campos y con much�simas opciones.

Y, �ltimo: tu dise�o de DB me huele mal. Ten�s "activo = si" y
"nacionalidad" es un string. A menos que esta sea una tabla s�lo
para b�squedas (y hasta eso tiene feo olor), parece que ten�s un
problema de normalizaci�n.

>
> Alguien me puede decir c�mo utilizar estas funciones dentro de mi
> consulta�???
>
> Saludos.
>
> --
> Has recibido este mensaje porque est�s suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.
> Para anular la suscripci�n a este grupo y dejar de recibir sus
> correos electr�nicos, env�a un correo electr�nico a
> php-arg+u...@googlegroups.com.
> Para publicar una entrada en este grupo, env�a un correo electr�nico
> Para obtener m�s opciones, visita
> https://groups.google.com/groups/opt_out.


--
Guillermo O. �Tordek� Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek

Reynaldo G. R.

unread,
Sep 9, 2013, 8:50:21 PM9/9/13
to php...@googlegroups.com
Si, tienes razón en lo que me explicas, en realidad este no es un proyecto
muy amplio es más bien algo sencillo, pero sin duda creo que debo utilizar
solr. Porque en ocasiones las opciones puede ser que no se seleccionen, solo
se elegirán las que el usuario necesite, en ese caso necesito que se
devuelvan todos los registros que han sido seleccionado como "no me
importa".

De todos modos agradezco si me pasas algún manual o tutorial sobre solr.

Gracias.




-----Mensaje original-----
De: php...@googlegroups.com [mailto:php...@googlegroups.com] En nombre de
Tordek
Enviado el: lunes, 09 de septiembre de 2013 07:04 p.m.
Para: php...@googlegroups.com
Asunto: Re: [php-arg] Sistema de búsqueda con PHP+MySQL

On 09/09/13 18:56, Reynaldo G. R. wrote:
>
> $activo = "si";
>
> $query_buscar_registro = sprintf("SELECT * FROM table_persona WHERE
> activo = %s and edad = %s and nacionalidad = %s and estatura = %s and
> peso = %s and pelo = %s and ojos = %s",

Esto me apesta a SQL injection. No sé, a lo mejor tus "GetSQLValueString" te
protegen, pero a mi me huele a que es muy probable que sean inyectables.

> Luego vi que para poder realizar las búsquedas hay que utilizar
> *MATCH* y *AGAINST*.

Eso, como te dijeron, es para los índices FULLTEXT, y lo que te permiten es
que si vos tenés una columna con mucho texto (Ej, posts de un blog), puedas
poner "ojos rojos -dragon" y te devuelve todos los posts que dicen "ojos" y
"rojos" pero no "dragon". Pero en base a la consulta que mostrás, no es lo
que necesitás.

Por otro lado, si vos querés tener que algunas opciones sean "no me
importa", vas a tener problemas de índices. Ejemplo:

Si tu consulta es "ojos = azul, edad = no me importa" y tu índice es sobre
(edad, ojos, nacionalidad), no podés usar un índice para buscar rápido y vas
a terminar usando una búsqueda lineal (que para pocos registros no importa).

En ese caso, te conviene usar cosas como solr, que te recomendaron; esos son
motores de búsqueda y te permiten rápidamente buscar sobre muchísimos campos
y con muchísimas opciones.

Y, último: tu diseño de DB me huele mal. Tenés "activo = si" y
"nacionalidad" es un string. A menos que esta sea una tabla sólo para
búsquedas (y hasta eso tiene feo olor), parece que tenés un problema de
normalización.

>
> Alguien me puede decir cómo utilizar estas funciones dentro de mi
> consulta…???
>
> Saludos.
>
> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus correos
> electrónicos, envía un correo electrónico a
> php-arg+u...@googlegroups.com.
> Para publicar una entrada en este grupo, envía un correo electrónico a
> Para obtener más opciones, visita
> https://groups.google.com/groups/opt_out.


--
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek

--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP
Argentina" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos
electrónicos, envía un correo electrónico a
php-arg+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a

Reynaldo G. R.

unread,
Sep 9, 2013, 8:50:21 PM9/9/13
to php...@googlegroups.com

Puedes recomendarme por dónde empezar, algún manual o tutorial…?

 

De: php...@googlegroups.com [mailto:php...@googlegroups.com] En nombre de Jose Alberto Gonzalez von Schmeling
Enviado el: lunes, 09 de septiembre de 2013 06:09 p.m.
Para: php...@googlegroups.com
Asunto: Re: [php-arg] Sistema de búsqueda con PHP+MySQL

 

si queres hacer un verdadero buscador. mira un poco apache solr

Reynaldo G. R.

unread,
Sep 9, 2013, 8:50:22 PM9/9/13
to php...@googlegroups.com

Si, gracias, con like me funciona, pero no cuando dejo de elegir una de las opciones.

 

 

 

De: php...@googlegroups.com [mailto:php...@googlegroups.com] En nombre de Federico
Enviado el: lunes, 09 de septiembre de 2013 06:07 p.m.
Para: php...@googlegroups.com
Asunto: Re: [php-arg] Sistema de búsqueda con PHP+MySQL

 

MATCH y AGAINST se usan para hacer full-text search. Estas seguro que eso es lo que necesitas?

Federico

unread,
Sep 9, 2013, 9:48:59 PM9/9/13
to php...@googlegroups.com
Podes armar la query solamente usando las opciones que elegiste.

Jose Alberto Gonzalez von Schmeling

unread,
Sep 9, 2013, 10:56:05 PM9/9/13
to php...@googlegroups.com
en mi blog tengo algunas cosas que te pueden ayudar con apache solr. http://proyectosbeta.net/?s=apache+solr&x=0&y=0

espero que te sirva.
Saludos, jose


2013/9/9 Federico <fede...@gmail.com>



--

Miguel Barraza

unread,
Sep 10, 2013, 9:54:54 AM9/10/13
to php...@googlegroups.com
Buenas, ando desarrollando un sitio en php 5 y sqlite 3, pero no logro hacerlo andar en mi pc windows.
el unico server que me pareció bueno para tenerlo, ya que es portable y puedo trabajar en cualquier maquina (me lo puedo llevar a donde sea y seguir trabajando en el sitio) es el usbwebserver, un servidor portable muy bueno y configurado.
 
el problema que tengo que no logro activar el pdo sqlite, según el phpinfo() me dice que solo tiene activado el driver mysql el pdo, y aunque las lineas de php.ini están descomentadas no logro que lo tome, revisando los archivos del servidor me di cuenta que no tiene la librería: php_pdo_sqlite.dll, así que la busqué, la bajé, la puse en la carpeta ext y lo corrí pero no me lo quiere tomar.
 
consulto: alguien trabajó con el usbwebserver y pudo activar el sqlite?.
o alguien conoce algun servidor portable que tenga php 5 y sqlite 3 que me pueda recomendar.
 
gracias.
 
un saludo y buena semana!.
 
atte, Miguel

Reynaldo G. R.

unread,
Sep 10, 2013, 10:12:17 AM9/10/13
to php...@googlegroups.com

Como?

Federico

unread,
Sep 10, 2013, 10:18:03 AM9/10/13
to php...@googlegroups.com
Programando...

Básicamente tenes que ir viendo cuales opciones tenes y solo agregar esas a la query.



2013/9/10 Reynaldo G. R. <reynal...@gmail.com>

OmaR yepez

unread,
Sep 10, 2013, 10:35:00 AM9/10/13
to php...@googlegroups.com
Hola Miguel.

Debes colocar el .dll en la carpeta System32 de Windows.

Saludos.


--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a php-arg+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/php-arg.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Omar Yepez
http://www.yepsua.com The YepSua team
http://jquery4php.sourceforge.net/ The jQuery4PHP project
Sigueme: http://twitter.com/oyepez003

Camello Ar

unread,
Sep 10, 2013, 11:03:12 AM9/10/13
to php...@googlegroups.com
y haces un bat que diga

@copy php_pdo_sqlite.dll %windir\system32

y lo ejecutas cuando pones el pendrive.

Un paso más es hacer en el pendrive (imagino que la idea es tener un pendrive con el server y tu sitio) un autorun.inf que ejecute el bat apenas enchufas el pendrive

Y otro paso más implicaría poner una rutina de control del archivo php_pdo_sqlite.dll en el bat que si existe el archivo, haga una copia de seguridad y luego copie el archivo tuyo (por el tema de versiones distintas), y eventualmente puedas restaurar las cosas

INSTALAR.BAT
@echo off
if exist %windir%\system32\php_pdo_sqlite.dll ren %windir%\system32\php_pdo_sqlite.dll %windir%\system32\php_pdo_sqlite.dll.bak  & echo El fichero existia. Se realizó copia de seguridad
copy php_pdo_sqlite.dll %windir\system32

DESINSTALAR.BAT
@echo off
if exist %windir%\system32\php_pdo_sqlite.dll del %windir%\system32\php_pdo_sqlite.dll & echo Fichero eliminado
if exist %windir%\system32\php_pdo_sqlite.dll.bak ren %windir%\system32\php_pdo_sqlite.dll.bak %windir%\system32\php_pdo_sqlite.dll  & echo Copia de seguridad restaurada

Miguel Barraza

unread,
Sep 10, 2013, 10:52:32 AM9/10/13
to php...@googlegroups.com
buenas, en el caso de un instalable si, pero el usbwebserver es portable, por lo tanto posee todo dentro de una misma carpeta.
dentro de donde está el php, puse en la carpeta ext, donde están las demás librerías de extensión, pero no me la toma.
 
el pdo está habilitado, y deshabilité el driver de mysql, entonces ahora me dice que no ahi ningun driver disponible, no se como activar el sqlite, no me deja.
 
atte, Miguel
 
 
 
Subject: Re: [php-arg] servidor portable con php5 y sqlite 3

Miguel Barraza

unread,
Sep 10, 2013, 10:55:56 AM9/10/13
to php...@googlegroups.com
igual por si las dudas lo probé poniendo el archivo en system32, pero tampoco lo toma, me sigue diciendo lo mismo:

PDO

PDO support enabled
PDO drivers no value
 
atte, Miguel
 
 
Subject: Re: [php-arg] servidor portable con php5 y sqlite 3

Reynaldo G. R.

unread,
Sep 10, 2013, 11:16:37 AM9/10/13
to php...@googlegroups.com

Si pero hay opciones que pasarían sin valor…

Federico

unread,
Sep 10, 2013, 11:27:59 AM9/10/13
to php...@googlegroups.com
Eso es lo que tenes que programar :)

$query = 'SELECT ........... FROM ...... WHERE ';

If (!empty($edad)) {
    $query .= 'edad LIKE \'%s\'';
}

Algo asi.

Reynaldo G. R.

unread,
Sep 10, 2013, 4:11:21 PM9/10/13
to php...@googlegroups.com

Gracias Federico, al final me funcionó asi:

 

$query_buscar_registro = "SELECT * FROM table_persona WHERE activo = '$activo'";

 

if(!empty($edad)) {

$query_buscar_registro .= " and edad LIKE '$edad'";    

}

if(!empty($nacionalidad)) {

$query_buscar_registro .= " and nacionalidad LIKE '$nacionalidad'";     

}

if(!empty($estatura)) {

$query_buscar_registro .= " and estatura LIKE '$estatura'";      

}

if(!empty($peso)) {

$query_buscar_registro .= " and peso LIKE '$peso'";    

}

if(!empty($pelo)) {

$query_buscar_registro .= " and pelo LIKE '$pelo'";      

}

if(!empty($ojos)) {

$query_buscar_registro .= " and ojos LIKE '$ojos'";       

}

$query_buscar_registro .= " ORDER BY id_ table_persona DESC";

Federico

unread,
Sep 10, 2013, 5:05:00 PM9/10/13
to php...@googlegroups.com
Ok. No te olvides de sanitizar las opciones que pones en la query ($ojos, $pelo, etc)

Miguel Barraza

unread,
Sep 13, 2013, 8:42:10 PM9/13/13
to php...@googlegroups.com
Aunque nos lleve muchas hora de escritura, análisis, dolor de cabeza, o incluso pasar muchas horas con café y sin dormir, debo decir: felíz día del programador, a todos aquellos que aman esta profesión, o a todos aquellos locos que están intentando entrar en este mundo de pura locura y aventura de bits.
tenemos todo un mundo en nuestras manos, para poder mejorarlo, y gracias a la hermandad que se encuentra en las comunidades virtuales, puedo encontrar un compañero de trabajo, un compañero de locuras, un compañero de vida, esta profesión me a dado mucho para agradecer, así que hoy ahi que celebrar, y programar!
print('felíz día!')
 
atte, Miguel

Jadull Edgardo

unread,
Sep 13, 2013, 9:23:43 PM9/13/13
to php...@googlegroups.com
El "Dia del programador",  dia en el que solo nosotros nos saludamos  entre nosotros,  jaja



--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a php-arg+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/php-arg.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Saludos

Edgardo A. Jadull

Santiago Rojo

unread,
Sep 13, 2013, 10:51:23 PM9/13/13
to php...@googlegroups.com
Nah, a mi me saludo un montón de gente no programadora.


2013/9/13 Jadull Edgardo <jadu...@gmail.com>



--
Santiago Rojo

Jadull Edgardo

unread,
Sep 14, 2013, 1:05:28 AM9/14/13
to php...@googlegroups.com
try {
echo "El 'Dia del programador',  dia en el que solo nosotros nos saludamos  entre nosotros,  jaja";
throw new Exception('
Santiago Rojo: Nah, a mi me saludo un montón de gente no programadora.');
    
} catch (Exception $e) {
    echo 'WTF?: ',  $e->getMessage(), "\n";
} finally {
    echo "Feliz dia.\n";
}


El 13 de septiembre de 2013 23:51,
Santiago Rojo <tia...@gmail.com> escribió:
Reply all
Reply to author
Forward
0 new messages