usando una tabla registros para mostrar mandar listar guardar formulario extraer datos criterios como codigo busqueda buscar buscador avanzado php mysql search

tabla - ¿Cuál es la mejor manera de buscar una base de datos MySQL con PHP?



mandar datos de php a mysql (6)

Digamos que si tuviera una tabla de libros en una base de datos MySQL y quisiera buscar palabras clave en el campo ''título'' (entrada del usuario en un campo de búsqueda); ¿Cuál es la mejor manera de hacer esto en PHP? ¿Es el comando MySQL LIKE la forma más eficiente de buscar?


Aquí hay una manera simple de separar algunas palabras clave para construir algunas cláusulas para filtrar una columna en esas palabras clave, ya sea ANDed o ORed juntas.

$terms=explode('','', $_GET[''keywords'']); $clauses=array(); foreach($terms as $term) { //remove any chars you don''t want to be searching - adjust to suit //your requirements $clean=trim(preg_replace(''/[^a-z0-9]/i'', '''', $term)); if (!empty($clean)) { //note use of mysql_escape_string - while not strictly required //in this example due to the preg_replace earlier, it''s good //practice to sanitize your DB inputs in case you modify that //filter... $clauses[]="title like ''%".mysql_escape_string($clean)."%''"; } } if (!empty($clauses)) { //concatenate the clauses together with AND or OR, depending on //your requirements $filter=''(''.implode('' AND '', $clauses).'')''; //build and execute the required SQL $sql="select * from foo where $filter"; } else { //no search term, do something else, find everything? }


Sí, la forma más eficiente generalmente es buscar en la base de datos. Para hacer eso tienes tres alternativas:

  • LIKE, ILIKE para coincidir con subcadenas exactas
  • RLIKE para que coincida con las expresiones regulares POSIX
  • Índices FULLTEXT para que coincidan con otros tres tipos diferentes de búsquedas dirigidas al procesamiento del lenguaje natural

Por lo tanto, depende de qué buscará realmente para decidir qué es lo mejor. Para los títulos de los libros, ofrecería una búsqueda LIKE para la coincidencia de subcadenas exacta, útil cuando las personas conozcan el libro que están buscando y también una búsqueda FULLTEXT para ayudar a encontrar títulos similares a una palabra o frase. Les daría diferentes nombres en la interfaz, por supuesto, probablemente algo así como exacto para la búsqueda de subcadenas y similar para la búsqueda de texto completo.

Un ejemplo sobre el texto completo: http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html



Considera usar Sphinx . Es un motor de texto completo de código abierto que puede consumir su base de datos mysql directamente. Es mucho más escalable y flexible que las sentencias LIKE de codificación manual (y mucho menos susceptible a la inyección de SQL)


El ejemplo de código de Paul Dixon lleva bien la idea principal para el enfoque basado en LIKE.

Añadiré esta idea de usabilidad: proporcione un botón de opción (AND | O) en la interfaz, por defecto a AND, luego, si la consulta de un usuario da como resultado cero (0) coincide y contiene al menos dos palabras, responda con una opción al efecto:

"Lo sentimos, no se encontraron coincidencias para su frase de búsqueda. ¿Expandir búsqueda para que coincida con CUALQUIER palabra en su frase?

Tal vez haya una mejor manera de decir esto, pero la idea básica es guiar a la persona hacia otra consulta ( que puede ser exitosa ) sin que el usuario tenga que pensar en términos de la lógica booleana de AND y OR.


Creo que Like es la forma más eficiente si se trata de una palabra. Las palabras múltiples se pueden dividir con la función de explosión como ya se dijo. Luego puede buclearse y usarse para buscar individualmente a través de la base de datos. Si el mismo resultado se devuelve dos veces, se puede verificar leyendo los valores en una matriz. Si ya existe en la matriz, ignórelo. Luego, con la función de conteo, sabrá dónde detenerse mientras imprime con un bucle. La ordenación puede hacerse con la función similar_text. El porcentaje se usa para ordenar la matriz. Eso es lo mejor.