2011-02-16 20 views
5

Necesito una guía para hacer un script de búsqueda avanzada para un sitio web en el que estoy trabajando.Script de búsqueda avanzada de PHP/MYSQL. ¿Cómo?

Ya sé cómo buscar en la base de datos consultas simples. El problema que estoy enfrentando ahora es cómo buscar, cuando se usan múltiples cuadros de selección. Por ejemplo:

enter image description here

Esto es sólo una forma sencilla, con diferentes opciones de búsqueda. La pregunta es:

El visitante puede elegir buscar en un país o ciudad, ambos o incluso con las tres opciones.

¿Cómo capto eso en el script PHP? ¿Tengo que verificar si, por ejemplo, se ha elegido una ciudad, y activar una consulta basada en eso? Pero si hago eso tendré que hacer diferentes consultas basadas en cada opción de selección.

En pseudo-código sería algo como esto: (imagino)

si el país y la ciudad y algo más no es nulo, lanzar una consulta para buscar en las tres tablas en la base de datos.

¿Pero qué hacer cuando se acaba de elegir el país? ¿O solo la ciudad?

¿Hay una manera simple de lograr esto?

Gracias de antemano.

+1

Parece que ya has respondido a tu pregunta. – diagonalbatman

+1

Bueno, la forma más sencilla de lograr esto es conectar algo como [Lucene] (http://framework.zend.com/manual/en/zend.search.lucene.overview.html) o [Sphinx] (http: //sphinxsearch.com/), pero eso puede depender de tu definición del trabajo "simple" :) –

+1

En tu "pseudo código" mencionas que la ciudad y el país están en tablas separadas. ¿Es eso cierto?¿O son columnas separadas dentro de la misma mesa? Si de hecho están en una tabla separada, tendrá que unirse a las tablas para que pueda obtener un conjunto de resultados unificado. – sholsinger

Respuesta

6

me gusta utilizar un conjunto para unirse a las condiciones por lo que no tiene que preocuparse por principio o al final de Y.

$conditions = array(); 
if ($formCondition1) { 
    $conditions[] = 'state = "'.$somevalue.'"'; 
} 
if ($formCondition2) { 
    $conditions[] = 'country = "'.$somevalue.'"'; 
} 
... 
if ($formConditionN) { 
    $conditions[] = 'N = "'.$somevalue.'"'; 
} 

// finalmente unirse a las condiciones en conjunto, el caso más simple es con AND (si es necesario agregar las RUP, que suena como si no, entonces este código podría ser un poco más complejo)

$sqlStatement = 'SELECT field1, field2 FROM tableABC WHERE '.implode(' AND ', $conditions); 

EDITAR: no se olvide de evitar la entrada para evitar ataques de inyección, y por supuesto probar para asegurarse de que hay al menos 1 condición antes de ejecutar la consulta. EDITAR: lol jswolf y creo que se parece mucho :)

+0

Muchas gracias por la respuesta detallada. Creo que iré con esta respuesta, incluso si los otros dos también funcionan bien. ¡Muchas gracias a todos por su ayuda! – moonwalker

4

me gustaría probar algo como:

$qry = "SELECT * FROM table WHERE "; 
if ($country != '') { 
    $qry .= "country='".mysql_real_escape_string($country)."' AND " 
} 
if ($city != '') { 
    $qry .= "city='".mysql_real_escape_string($city)."' AND " 
} 
$qry .= '1'; 
$res = mysql_query($qry); 

La consulta se construye en función de lo establecido. Tenga en cuenta el "1" al final de la cadena de consulta que siempre es verdadero. Esto es necesario para seguir el "DONDE" si $ country y $ city están vacíos, o para seguir el último "Y" si no lo están.

+0

Muchas gracias por su respuesta. Ahora tengo 3 respuestas diferentes, todas funcionan y no sé cuál usar. Gracias de nuevo. – moonwalker

+0

Creo que esta es una de la respuesta perfecta para el concepto de búsqueda avanzada. Gracias por compartir esta:) ... –

5

Realizo una matriz $where, agrego mis condiciones según sea necesario, y luego implode con 'Y' como pegamento. Así que algo como:

$where = array(); 
if $city is defined 
    $where[] = "city = '".mysql_real_escape_string($city)."'"; 
fi 
if $country is defined 
    $where[] = "country = '".mysql_real_escape_string($country)."'"; 
fi 
... 

if(count($where)) { 
    $query.= ' WHERE '.implode(' AND ', $where); 
} 
+0

elegante, me gusta. – sholsinger

+0

Eso es muy simple y elegante. ¡Gracias! – moonwalker

+0

¡Eso es lo que estaba buscando! –

Cuestiones relacionadas