Ejemplo de implementación. Búsqueda en vivo en Bitrix. Ejemplo de implementación Requerir elemento de búsqueda masculino php i

En la lección de hoy, veremos php mysql búsqueda. Hay muchos scripts de búsqueda, algunos usan una base de datos, otros prescinden de ella, hay búsquedas avanzadas con clasificación exacta. Nos centraremos en la búsqueda simple habitual, que busca información en dos tablas de la base de datos. mysql.

Primer paso. Base de datos mysql.

Creando una base de datos buscar_lite, tiene dos mesas noticias- noticias y vacaciones- vacantes.

Establecer privilegios:

Acceso - " raíz",

Clave - "",

Anfitrión - " servidor local".

Volcado de la mesa de noticias.

Estructura de tabla para la tabla `noticias` -- CREAR TABLA SI NO EXISTE `noticias` (`id` int(2) NOT NULL, `title` varchar(255) NOT NULL, `text` text NOT NULL, PRIMARY KEY (`id` `)) MOTOR=MyISAM JUEGO DE CARACTERES POR DEFECTO=cp1251;

Volcado mesa vac - vacantes.

Estructura de tabla para la tabla `vac` -- CREAR TABLA SI NO EXISTE `vac` (`id` int(2) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `text` text NOT NULL, PRIMARY KEY (` id`)) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

Segundo paso. HTML y PHP.

Nos conectamos a la base de datos. Establecer una condición en una variable $buscar, en el que no se ingresa la consulta de búsqueda, o tiene menos de 4 caracteres, y también verifica si hay barras y recorta la variable. Creamos dos consultas que buscan en la base de datos dos tablas. noticias y vacaciones por condición de búsqueda de campo texto. (Ya puedes elegir en cuántas tablas necesitas buscar. Por ejemplo, tendrás tablas lecciones, materiales, artículos etc. También puede cambiar las condiciones de búsqueda, en lugar del campo texto, puede seleccionar el campo título u otro campo.) Luego indicamos cuántos caracteres hay en el texto al mostrar la búsqueda en la variable $símbolos. Si en las tablas noticias y vacaciones No se encontró nada en la búsqueda, mostramos un mensaje. Si se encuentran, datos de salida de dos tablas noticias y vacaciones para la consulta de búsqueda dada.

Resultados de la búsqueda para la consulta: $buscar


"; eco "
¡La consulta de búsqueda no está ingresada o tiene menos de 4 caracteres!

";) más (eco"
Resultados de la búsqueda para la consulta: $buscar

"; $buscar = htmlspecialchars(stripslashes(trim($buscar))); $sql_news = mysql_query("SELECCIONE id, título, texto DE noticias DONDE texto COMO "%$buscar%""); $noticias = mysql_num_rows($sql_noticias ); $sql_vac = mysql_query("SELECCIONE id, título, texto DESDE vac DONDE texto COMO "%$buscar%""); $sql_vac = mysql_num_rows($sql_vac); $buscar = $buscar; $symbolls = "80"; if ($noticias==0 y $vac==0) echo "
¡Su búsqueda \"$buscar\" no ha producido ningún resultado! ¡Envíe otra solicitud!

"; else ( /*Noticias/noticias - tabla*/ for($i=1; $noticias = mysql_fetch_array($sql_noticias); $i++) ($buscar_texto = $noticias["texto"]; $buscar_texto = strip_tags($ buscar texto, "
"); $search_txt_length = strlen($search_text); $search_first_enter = strpos(strtolower($search_text), strtolower($find)); $pad_left = $search_first_enter - $symbolls; $pad_right = $search_first_enter + $symbolls + 5; si ($pad_right><0) $pad_left = "0"; $search_text = substr($search_text, $pad_left, $pad_right); $search_text = str_replace (strtolower($find), "".strtolower($buscar)".
$i. $noticias
...$buscar_texto...
encontrado en las noticias

"; ) /*Trabajos/vac - tabla*/ for($i=1; $vac = mysql_fetch_array($sql_vac); $i++) ($buscar_texto = $vac["texto"]; $buscar_texto = strip_tags($buscar_texto , "
"); $search_txt_length = strlen($search_text); $search_first_enter = strpos(strtolower($search_text), strtolower($find)); $pad_left = $search_first_enter - $symbolls; $pad_right = $search_first_enter + $symbolls + 5; if ($pad_right>$search_txt_length) $pad_right = $search_txt_length; if ($pad_left<0) $pad_left = "0"; $search_text = substr($search_text, $pad_left, $pad_right); $search_text = str_replace (strtolower($find), "".strtolower($buscar)".", strtolower($buscar_texto)); echo"
$i. $vac
...$buscar_texto...
encontrado en vacantes

"; } } } } ?>

Tercer paso. CSS.

Escribamos algunos estilos que darán forma a nuestra búsqueda.

Search_name ( color: negro; tamaño de fuente: 18px; ) .search_questions ( color: negro; fuente-peso: negrita; tamaño de fuente: 15px; ) .search_query ( color: azul; estilo de fuente: Cursiva; ) .search_error ( color: rojo; tamaño de fuente: 15 px; ) .search_input ( borde: 1 px negro sólido; ancho: 500 px; alto: 30 px; ) .search_word ( color: azul; ) .search_title ( tamaño de fuente: 20 px; color: azul; font-weight: bold; ) .search_text ( font-size: 15px; color: black; ) .search_cat ( font-size: 12px; color: gray; float: right; margin-top: 20px; )

Hemos considerado con usted un simple php mysql búsqueda que busca información de una base de datos. Por condición, se utilizan dos tablas, puede personalizarlas de la manera que le resulte más conveniente. La próxima lección estará dedicada a la analogía de una búsqueda simple, solo que con funciones avanzadas.

11.1K

Una de las funciones más populares y necesarias en cualquier sitio es la búsqueda, implementada mediante un formulario especial. Esta funcionalidad permite a los visitantes encontrar rápidamente el contenido que les interesa en el sitio.

Hoy queremos decirle cómo buscar en el sitio usando un formulario especial que consultará las tablas de la base de datos y mostrará información sobre los administradores actuales en el sitio. Aprenderá a crear una tabla de base de datos que contendrá información sobre el personal actual.

Desarrolle formularios de búsqueda con PHP y familiarícese con SQL ( lenguaje de consulta estructurado) es un lenguaje especial para recopilar, registrar y modificar información contenida en bases de datos. Antes de comenzar, le recomendamos que descargar archivos de proyecto.

que vas a necesitar

  • Herramienta de base de datos MySQL.
  • Servidor local o remoto con soporte PHP.
  • Editor de texto.

Creando una base de datos

Si no está completamente seguro de que puede manejar la base de datos en su alojamiento, comuníquese con el host para obtener instrucciones o asistencia. Después de crear la base de datos, deberá conectarla, crear una tabla y escribir los datos necesarios en ella.

La herramienta de administración de MySQL más popular es PHP My Admin. Esta herramienta será suficiente para nuestra guía de hoy.

crear una tabla

Nuestra tabla debe ser creada en el siguiente formato:

nombre de la columna tipo de datos Longitud Nulo o no nulo ¿Clave primaria? Autoincremento
IDENTIFICACIÓN EN T 1 No nulo
Primer nombre Várchar 50 No nulo no no
apellido Várchar 50 No nulo no no
Correo electrónico Várchar 50 No nulo no no
Número de teléfono Várchar 15 No nulo no no

Una tabla de base de datos se compone de columnas y filas, al igual que en Excel. La primera columna le permite identificar los datos por su nombre. A continuación viene la columna Tipos de datos (data type), que nos indica el tipo de datos que contiene la columna. En el campo Longitud (Length) indica la cantidad máxima de memoria (almacenamiento) para una columna de la tabla. Usamos variables que dan más flexibilidad. En otras palabras, si la longitud del nombre completo es inferior a 50 caracteres, solo se ocupará una parte del espacio asignado.

Y entre los datos de personal no puede haber valores vacíos ( nulo, vacío). La primera fila está resaltada en amarillo porque la columna ID es nuestra clave principal. La clave primaria en la base de datos garantiza que cada entrada sea única. Esta columna también se incrementa automáticamente, lo que significa que a cada registro en nuestra base de datos se le asignará un número único automáticamente.

Ingresamos a los representantes del personal en la tabla.

Una vez que comprenda la tabla, comience a llenarla con datos. 6 entradas son suficientes para fijar el procedimiento en la mente. Aquí está mi propio ejemplo:

Id. de columna Primer nombre apellido Correo electrónico Número de teléfono
2 Ryan Mayordomo [correo electrónico protegido] 417-854-8547
3 Brent Callahan [correo electrónico protegido] 417-854-6587

Desarrollo de formularios

Para crear un formulario de búsqueda de sitio a través de Google, abra cualquier editor de texto adecuado. Recomiendo usar el PSPad gratuito. Puede usar cualquier editor de texto que tenga resaltado de sintaxis. Esto facilitará enormemente el proceso de escritura y depuración de código PHP. Al crear una página para un formulario de búsqueda, asegúrese de guardarla en formato .php; de lo contrario, el código PHP no se analizará correctamente. Una vez que guarde el documento, copie el siguiente marcado en él:

Búsqueda de contactos:

Búsqueda detallada de contactos

Puedes buscar por nombre o apellido



Si está familiarizado con el lenguaje HTML, entonces todo debería estar claro para usted al menos hasta la etiqueta del formulario de apertura. Dentro de esta etiqueta se encuentra el elemento más importante de todo el código: el atributo de acción. Como acción de nuestro formulario, especificamos el nombre de nuestro archivo y luego aplicamos la cadena de consulta “ Vamos”.

Comprobación de criterios

Cuando el usuario ingresa un nombre o apellido y luego hace clic en el botón Enviar, el formulario envía los datos a sí mismo y agrega la cadena de consulta " Vamos". En este punto, estamos comprobando la presencia de la cadena de consulta go. Si el resultado es positivo, mostramos los resultados de la búsqueda.

Antes de mostrar los resultados solicitados, debemos verificar dos veces: (1) se envió el formulario, (2) la cadena de consulta contenía el valor ir, (3) ¿el término de búsqueda se ingresó en minúsculas o mayúsculas? Si ninguna de las comprobaciones da un resultado positivo ( verdadero), no estamos obligados a tomar ninguna medida.

Primero, agreguemos un pequeño bloque de código PHP para la búsqueda del sitio después de la etiqueta de cierre.:



Primero, abrimos un bloque de código PHP con la etiqueta ””.

El servidor ejecutará cualquier código PHP dentro de este par de etiquetas. Luego verificamos si el formulario ha sido enviado:

Introduzca un término de búsqueda

"; } ?>

Usaremos la función isset incorporada, que devuelve un valor bool, y le pondremos la matriz $_POST. Una expresión lógica en programación nos permite obtener verdadero o falso.

Por lo tanto, si la función devuelve true , entonces el formulario se ha enviado y debemos seguir ejecutando el código. Si la función devuelve falso, mostraremos un mensaje de error. Guarde todo el código escrito en el archivo search_submit.php.

Introduzca un término de búsqueda

"; } } } ?>

Anidamos otra expresión booleana condicional dentro de la principal, pero esta vez usamos la matriz $_GET junto con el valor " Vamos". Guarde sus cambios en el archivo search_go.php.

Ahora debemos asegurarnos de que los visitantes solo puedan ingresar la primera letra de la cadena de consulta en mayúsculas o solo en minúsculas. También debemos proporcionar una forma de tener en cuenta los criterios de búsqueda ingresados ​​por el visitante. La mejor manera de validar la entrada del visitante es con una expresión regular:

Anidamos otra expresión booleana condicional dentro de nuestras dos. Esta vez estamos usando una expresión regular para validar la entrada. Usamos la función integrada preg_match con dos parámetros: una expresión regular y un campo de formulario al que se debe aplicar la validación.

En nuestro caso, este será el campo " Nombre"( nombre). Para recuperar los parámetros de búsqueda especificados por el visitante, creamos una variable $name y le vinculamos un valor POST con el nombre del campo del formulario que se usará en la consulta SQL. Ahora hemos implementado: (1) enviar los datos del formulario, (2) la cadena de consulta incluye un valor de ir y (3) el visitante ingresó una primera letra en mayúsculas o minúsculas. Y todas estas comprobaciones se realizan incluso antes de que se realicen cambios en la base de datos. Guarde todos los cambios.

Conectar, seleccionar, consultar y devolver resultados de una tabla de base de datos

Para obtener datos de una tabla, primero debe conectarse al servidor en el script de búsqueda del sitio. Para ello utilizamos el siguiente código:

", "") o morir (" No puedo conectarme a la base de datos porque: " . mysql_error()); else( echo "

Por favor ingrese un término de búsqueda

"; } } }?>

Creamos una variable $db y la vinculamos a la función incorporada de MySQL mysql_connect , que toma tres parámetros: el servidor con la base de datos ( servidor local, si está trabajando localmente), inicio de sesión y contraseña.

Después de eso, ejecutamos la función PHP integrada die , que detiene la ejecución de código si no hay conexión con la base de datos. E imprima la información del error ejecutando la función incorporada de MySQL mysql_error , que devolverá el motivo del error. Guarde el archivo search_connectdb.php.

Por favor ingrese un término de búsqueda

"; } } } ?>

Cree una variable llamada mydb y vincúlela a la función incorporada. Funciones MySQL mysql_select_db y luego especifique el nombre de la base de datos que creamos anteriormente. A continuación, consultamos la tabla de la base de datos mediante una consulta SQL con la variable de nombre que contiene los parámetros de búsqueda ingresados ​​por el visitante:

Por favor ingrese un término de búsqueda

"; } } } ?>

Al consultar una tabla de base de datos, creamos una variable $sql y la vinculamos a una cadena que contiene una consulta SQL. Usamos la declaración SELECT para recuperar los valores de las columnas de identificación y los nombres y apellidos de la tabla de contactos. Luego usamos la cláusula WHERE junto con los valores de nombre y apellido para acotar la búsqueda.

Junto con el operador LIKE, usamos el signo de porcentaje (%): un carácter especial que devuelve 0 o más caracteres, así como la variable de nombre de la cadena de búsqueda. Como resultado, ME GUSTA ( combinado con un carácter especial) encuentra cualquier nombre coincidente en una tabla de base de datos. Todo el proceso se puede describir de la siguiente manera: Seleccionamos los nombres y apellidos de la tabla de contactos que coincidan con los ingresados ​​por el visitante". Guarde el archivo search_query.php.

Por favor ingrese un término de búsqueda

"; } } } ?>

Creamos una variable $resultado y le asignamos el valor de la función mysql_query(), colocándolo en $consulta. Ahora nuestra consulta se almacena en la variable de resultado. Para generar el resultado en PHP, creamos un bucle y luego generamos los datos en una lista desordenada:

n"; eco"

  • " . "
  • n"; eco""; ) ) más( echo "

    Por favor ingrese un término de búsqueda

    "; } } } ?>

    Primero, creamos un bucle while, dentro de él creamos una variable llamada fila y la inicializamos con el valor de retorno de la función mysql_fetch_array, que toma una variable de resultado que contiene nuestra consulta SQL. Dentro del ciclo while, asignamos a cada valor de columna el valor de una variable con el mismo nombre. Luego sacamos los valores dentro de una lista desordenada.

    Hay dos cosas importantes a tener en cuenta aquí: (1) dentro del bucle while, no es necesario asignar valores a las variables de la matriz de filas, ya que los valores se pueden tomar directamente de la matriz de filas; (2) la etiqueta de anclaje que usamos en nuestro nombre de archivo junto con la identificación y la clave principal. La razón de esto es que muchos elementos de búsqueda inicialmente no muestran nada.

    Dado que solo mostramos el nombre y el apellido al agregar una identificación al final de nuestra etiqueta de anclaje, podemos usar la identificación para una consulta adicional que mostrará información adicional sobre el personal. Guarde el archivo y pruebe el formulario PHP de búsqueda del sitio ( search_display.php).

    Quitar pestañas

    Los resultados se muestran como una lista desordenada, pero la conclusión es que no necesitamos pestañas. Para deshacerse de él, agregue la siguiente regla CSS en la parte superior de su archivo en head:

    Buscar por letras

    Solo se necesitan unas pocas líneas adicionales de código para implementar la búsqueda de hechizos. Agreguemos esta funcionalidad conveniente para los visitantes. De esta forma, podrán encontrar a los representantes del personal por las letras contenidas en el nombre o apellido.

    Agregue la siguiente línea de código después de la etiqueta del formulario de cierre:

    un | segundo | k

    Unimos la etiqueta a una cadena de consulta usando un ancla y configúrelo en una letra específica. Para implementar la función de búsqueda de hechizos, debemos agregar el siguiente código justo después de la llave de cierre en el script original, como se muestra a continuación:

    )//Fin del script del formulario de búsqueda if(isset($_GET["by"]))( $letter=$_GET["by"]; //Conectando a la base de datos $db=mysql_connect ("servername", " nombre de usuario" , "contraseña") o morir ("No puedo conectarme a la base de datos porque: " . mysql_error()); //-Seleccionar la base de datos $mydb=mysql_select_db("yourDatabase"); //-Consultar la base de datos table $sql="SELECT ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE "%" . $letter . "%" OR LastName LIKE "%" . $letter .%""; //-Ejecutar una consulta de función MySQL Query $resultado=mysql_query($sql); //-Contando resultados $numrows=mysql_num_rows($resultado); echo "

    " .$numrows . " resultados encontrados para " . $letter . "

    "; //-Iniciar el ciclo y ordenar los resultados while($row=mysql_fetch_array($result))( $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $ID=$ fila[ "ID"]; //-Mostrar el resultado en el arreglo echo "
      n"; eco"
    • " . "" .$Nombre . " " . $Apellido . "
    • n"; eco"
    "; } }

    Aquí hemos cambiado cuatro fragmentos de código del script de búsqueda del sitio:

    • Usamos la función isset() y colocamos la matriz $_GET en ella y luego verificamos por valor;
    • Cree una variable $letter e inicialice su valor con la matriz $_GET;
    • Agregar letra variable a la consulta SQL;
    • Especificamos la letra variable dentro de la expresión en la que obtenemos el número de líneas contado.

    Guarde el archivo search_byletter.php y verifique el resultado.

    Buscar un empleado específico

    Para mostrar información sobre el resto del personal, que se pasa a través de una identificación única dentro de nuestro enlace, debemos agregar el siguiente código justo después de la llave de cierre en el script de la carta, como se muestra a continuación:

    )//Fin del script if(isset($_GET["id"]))( $contactid=$_GET["id"]; //Conectando a la base de datos $db=mysql_connect ("servername", "username" , " contraseña") o morir ("No puedo conectarme a la base de datos porque: " . mysql_error()); //-seleccione la base de datos para usar $mydb=mysql_select_db("yourDatabase"); //- Consulta la base de datos table $sql="SELECT * FROM Contacts WHERE ID=" .$contactid; //- Ejecuta la consulta a la función mysql_query() $result=mysql_query($sql); //- Ejecuta el bucle y ordena los resultados while($row=mysql_fetch_array ($resultado))( $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $PhoneNumber=$row["PhoneNumber"]; $Email=$row["Email"]; //- Mostrar el resultado en el array echo "

    "; } }

    Aquí hemos cambiado cuatro piezas de código:

    • Usamos la función isset() para verificar el valor de ID en la matriz $_GET;
    • Cree una variable $contactid e inicialícela con la matriz $_GET;
    • En la tabla, seleccione todo lo que está marcado con un asterisco *. El asterisco es una notación abreviada en SQL que significa " dame todas las columnas y filas de la tabla". Para determinar qué información mostrar, mencionamos la variable contactid al final de la instrucción SQL;
    • Mostramos información adicional sobre cada representante del personal.

    Guarde el archivo search_byid.php y verifique el resultado.

    Tenga en cuenta que nuestra funcionalidad funciona como se esperaba. Cuando ingresa un nombre o apellido en el campo, o cuando selecciona una letra como hipervínculo, solo se muestran los nombres de los miembros del personal. Si pasa el cursor sobre el enlace, puede ver la identificación única en la barra de estado. Si hace clic en una persona específica, la barra de direcciones cambiará y se mostrará información adicional sobre este empleado.

    inyección SQL

    La razón por la que agregamos una expresión regular a nuestro campo de búsqueda es para que nadie pueda manipular nuestra consulta SQL. En el pasado, este problema era común y los piratas informáticos lograban ejecutar sus propias consultas SQL mientras manipulaban su aplicación. Por ejemplo, si permitimos la posibilidad de usar un apóstrofe en nuestro campo, entonces un hacker podría simplemente borrar la base de datos usando la consulta:

    "MESA PLEGABLE

    Como ya se señaló, la expresión regular garantiza que el visitante solo pueda ingresar letras minúsculas o mayúsculas como primer carácter.

    En conclusión

    En el artículo de hoy, analizamos cómo realizar una búsqueda en un sitio, además de:

    • Crear bases de datos y tablas relacionadas;
    • Use herramientas de administración de bases de datos, cree columnas e ingrese datos;
    • Desarrolle formularios de búsqueda basados ​​​​en PHP, que pueden verificar los datos de entrada, la presencia de variables en la solicitud, así como conectarse a la base de datos y mostrar los resultados de la tabla;
    • Cómo proteger su aplicación y base de datos de la inyección SQL.

    Con el conocimiento obtenido de este artículo, puede modificar fácilmente el código de otra persona y, si es necesario, ampliar la funcionalidad del formulario de búsqueda.

    Esta publicación es una traducción del artículo " Cómo crear una función de búsqueda con PHP y MySQL» preparado por un equipo de proyecto amistoso

    La mejor manera de mantener a un usuario en el sitio es permitirle encontrar lo que está buscando. Si crea un sistema conveniente para esto, entonces el nivel de preferencia por su sitio aumentará y el usuario definitivamente regresará para encontrar lo que le interesa.

    Le mostraré cómo crear un formulario de búsqueda simple, pero funcionalmente efectivo, que se utilizará para buscar artículos en el sitio. Los resultados aparecerán en la página sin recargas, lo que sin duda es la mejor forma de presentar la información.

    Crearé 2 archivos: search.php que contendrá HTML y JavaScript. El segundo archivo, do_search.php contendrá el código PHP. Empecemos a crear el primer archivo:

    PHP, demostración de búsqueda de jQuery

    Intenta ingresar la palabra ajax


    resultados para


    En este archivo, hemos creado un formulario HTML normal que envía una solicitud POST al back-end, el archivo do_search.php.

    seleccionar_lista($sql); if(recuento($fila)) ( $resultado_final = ""; foreach($fila as $r) ( $resultado = $r["título"]; $negrita = " " . $palabra .""; $resultado_final .= "

  • " .str_ireplace($palabra, $negrita, $resultado) . "
  • "; ) echo $end_result; ) else ( echo "
  • No se encontró nada para su solicitud
  • "; } } ?>

    El código PHP contiene comentarios que facilitan la comprensión de cómo funciona el script. Si hay coincidencias en la base de datos, se las muestra a su usuario poniendo en negrita las palabras que el usuario estaba buscando.

    Vamos a darle a todo algo de CSS:

    Cuerpo( familia de fuentes:Arial, Helvetica, sans-serif; ) *( margen:0;relleno:0; ) #container (margen: 0 auto; ancho: 600px; ) a ( color:#DF3D82; texto-decoración: none) a: hover (color:#DF3D82; text-decoration:subrayado;) ul.update (list-style:none;font-size:1.1em; margin-top:10px) ul.update li(height:30px; border-bottom:#dedede solid 1px; text-align:left;) ul.update li:first-child( border-top:#dedede solid 1px; height:30px; text-align:left; ) #flash ( margin- top:20px; text-align:left; ) #searchresults ( text-align:left; margin-top:20px; display:none; font-family:Arial, Helvetica, sans-serif; font-size:16px; color: #000; ) .word ( font-weight:negrita; color:#000000; ) #search_box ( padding:4px; border:solid 1px #666666; width:300px; height:30px; font-size:18px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .search_button ( border:#000000 solid 1px; padding: 6px; color:#000; font-weight:negrita; font-size:16px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .found (font-weight: negrita ; estilo de fuente: cursiva; color: #ff0000; ) h2 ( margen derecho: 70px; )

    Así que ha aprendido a crear un formulario de búsqueda simple que funciona sin recargar la página. Espero que hayas disfrutado la lección.

    Por Ibrahim Diallo

    Publicado el 2 de julio de 2014 ~ 16 minutos de lectura

    La búsqueda es una característica importante en un sitio web. Cuando mis pocos lectores quieren buscar un pasaje en particular en mi blog, usan el cuadro de búsqueda. Solía ​​​​funcionar con la Búsqueda de Google, pero desde entonces la cambié a mi propia versión casera, no porque pueda hacerlo mejor, sino porque fue un desafío interesante.

    Si tiene prisa y solo quiere que su sitio se pueda buscar, haga lo que hice antes, use Google.

    // En el archivo search.php $término = isset($_GET["consulta"])?$_GET["consulta"]: ""; $término = urlencode($término); $sitioweb = urlencode("www.tusitioweb.com"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; header("Ubicación: $redirect"); salida;

    Lo que hace es bastante simple. Obtenga el término aprobado por el usuario y reenvíelo a la página de búsqueda de Google. Limite el resultado de la búsqueda a nuestro dominio actual usando el sitio: palabra clave en la consulta de búsqueda. Todas sus páginas indexadas por Google estarán disponibles a través de la búsqueda ahora. Sin embargo, si desea manejar su búsqueda en casa, siga leyendo.

    Solución de búsqueda casera

    Antes de continuar, intente usar el cuadro de búsqueda en este blog. Utiliza el mismo proceso que describiré a continuación. Si cree que esto es lo que quiere, continúe leyendo.

    Esta solución está dirigida a sitios web pequeños. Hago uso de LIKE con comodines en ambos extremos, lo que significa que su búsqueda no se puede indexar. Esto significa que la solución funcionará bien para su blog o sitio web personal que no contenga toneladas de datos. Pórtelo a un sitio web más grande y podría volverse muy lento. MySQL ofrece búsqueda de texto completo, que no es lo que estamos haciendo aquí.

    Nota: Si tiene 5000 publicaciones de blog, todavía está bien. .

    Tomaremos como referencia la estructura de este blog. Cada entrada de blog tiene:

    • Un título p_title
    • Una URL p_url
    • Un resumen p_summary
    • Un contenido de publicación p_content
    • Y categorías categoría.tagname

    Por cada campo que coincida con nuestro término de búsqueda, le daremos una puntuación. La puntuación se basará en la importancia del partido:

    // el término exacto coincide se encuentra en el título $scoreFullTitle = 6; // coincide con el título en parte $scoreTitleKeyword = 5; // el término exacto que coincide se encuentra en el resumen $scoreFullSummary = 5; // coincide con el resumen en parte $scoreSummaryKeyword = 4; // las coincidencias exactas del término se encuentran en el contenido $scoreFullDocument = 4; // coincide con el documento en parte $scoreDocumentKeyword = 3; // coincide con una categoría $scoreCategoryKeyword = 2; // coincide con la url $scoreUrlKeyword = 1;

    Antes de comenzar, hay algunas palabras que no contribuyen mucho a una búsqueda que deben eliminarse. Ejemplo "en", "eso", "un", "el", "de" ... . Los filtraremos y siéntete libre de agregar cualquier palabra que creas que es irrelevante. Otra cosa es que queremos limitar la longitud de nuestra consulta. No queremos que un usuario escriba una novela en el campo de búsqueda y bloquee nuestro servidor MySQL.

    // Eliminar palabras innecesarias del término de búsqueda y devolverlas como una función de matriz filterSearchKeys($consulta)( $consulta = trim(preg_replace("/(\s+)+/", " ", $consulta)); $palabras = array(); // expanda esta lista con sus palabras. $lista = array("en","eso","un","el","de","o","yo","tú", "él","yo","nosotros","ellos","ella","a","pero","eso","esto","aquellos","entonces"); $c = 0; foreach(explotar(" ", $consulta) as $clave)( if (in_array($clave, $lista))( continuar; ) $palabras = $clave; if ($c >= 15)( romper; ) $c++ ; ) devuelve $palabras; ) // limita el número de palabras de caracteres función limitChars($consulta, $límite = 200)( devuelve substr($consulta, 0,$límite); )

    Nuestras funciones auxiliares ahora pueden limitar el número de caracteres y filtrar palabras inútiles. La forma en que implementaremos nuestro algoritmo es dando una puntuación cada vez que encontremos una coincidencia. Haremos coincidir palabras usando la declaración if y acumularemos puntos a medida que hagamos coincidir más palabras. Al final, podemos usar esa puntuación para ordenar nuestros resultados.

    Nota: No mostraré cómo conectarse a la base de datos MySQL. Si tiene problemas para conectarse de manera eficiente a la base de datos, le recomiendo leer esto.

    Primero demos una estructura a nuestra función. Tenga en cuenta que dejé marcadores de posición para que podamos implementar secciones por separado.

    Función search($consulta)( $consulta = trim($consulta); if (mb_strlen($consulta)===0)( // no es necesaria una búsqueda vacía, ¿verdad? return false; ) $consulta = limitChars($consulta) ; // Puntuaciones de ponderación $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKeyword = 1; $keywords = filterSearchKeys( $consulta); $escQuery = DB::escape($consulta); // vea la nota anterior para obtener el objeto db $titleSQL = array(); $sumSQL = array(); $docSQL = array(); $categorySQL = array (); $urlSQL = array(); /** Coincidencias completas RETENEDOR DE LUGAR **/ /** Palabras clave coincidentes RETENEDOR DE LUGAR **/ $sql = "SELECT p.p_id,p.p_title,p.p_date_published,p. p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Puntuación del título ".implode(" + ", $titleSQL).")+ (-- Resumen ".implode(" + ", $sumSQL) .")+ (-- documento ".implode(" + ", $docSQL).")+ (-- etiqueta/categoría ".implode(" + ", $categorySQL).")+ (-- url ". implosion(" + ", $urlSQL).")) como relevancia DESDE publicación p DONDE p.status = "publicado" TENIENDO relevancia >

    En la consulta, todas las puntuaciones se resumirán como la variable de relevancia y podemos usarla para ordenar los resultados.

    Coincidencias completas

    Primero nos aseguramos de tener algunas palabras clave y luego agregamos nuestra consulta.

    If (count($palabras clave) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($puntuaciónFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($puntuaciónFullDocument),0)"; )

    Esos son los partidos con mayor puntuación. Si el término de búsqueda coincide con un artículo que los contiene, tendrán mayores posibilidades de aparecer en la parte superior.

    Ocurrencias de palabras clave coincidentes

    Recorremos todas las palabras clave y verificamos si coinciden con alguno de los campos. Para la coincidencia de categoría, utilicé una subconsulta ya que una publicación puede tener múltiples categorías.

    Foreach($palabras clave como $clave)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($clave)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%".DB::escape($clave)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key)."%",($scoreUrlKeyword),0)"; $categorySQL = "if ((SELECCIONE el recuento (categoría.id_de_etiqueta) DESDE la categoría ÚNASE a la categoría_de_publicación EN la categoría_de_publicación.id_de_etiqueta = categoría.id_de_etiqueta DONDE la categoría_de_publicación.id_de_publicación = p.id_de_publicación Y categoría.nombre = "".DB::escape($clave)."") > 0,($puntuaciónCategoríaPalabraClave),0)"; )

    Además, como señaló un comentarista a continuación, debemos asegurarnos de que estas variables no sean matrices vacías o la consulta fallará.

    // En caso de que esté vacío, agregue 0 if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (vacío($urlSQL))( $urlSQL = 0; ) if (vacío($tagSQL))( $tagSQL = 0; )

    Al final, todas las consultas se concatenan y se suman para determinar la relevancia de la publicación para el término de búsqueda.

    // Eliminar palabras innecesarias del término de búsqueda y devolverlas como una función de matriz filterSearchKeys($consulta)( $consulta = trim(preg_replace("/(\s+)+/", " ", $consulta)); $palabras = array(); // expanda esta lista con sus palabras. $lista = array("en","eso","un","el","de","o","yo","tú", "él","yo","nosotros","ellos","ella","a","pero","eso","esto","aquellos","entonces"); $c = 0; foreach(explotar(" ", $consulta) as $clave)( if (in_array($clave, $lista))( continuar; ) $palabras = $clave; if ($c >= 15)( romper; ) $c++ ; ) return $palabras; ) // límite de palabras número de caracteres function limitChars($consulta, $limite = 200)( return substr($consulta, 0,$limit); ) function buscar($consulta)( $consulta = recortar ($consulta); if (mb_strlen($consulta)===0)( // no es necesario realizar una búsqueda vacía, ¿verdad? return false; ) $consulta = limitChars($consulta); // Puntuaciones de pesaje $scoreFullTitle = 6; $ scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKe ypalabra = 1; $palabras clave = filterSearchKeys($consulta); $escConsulta = DB::escape($consulta); // vea la nota anterior para obtener el objeto db $titleSQL = array(); $sumaSQL = matriz(); $docSQL = matriz(); $categoríaSQL = matriz(); $urlSQL = matriz(); /** Coincidencias completas **/ if (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument), 0)"; ) /** Palabras clave coincidentes **/ foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword ),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "% ".DB::escape($clave)."%",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($clave)."%",( $scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) FROM category JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id AND category.name = "". DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; ) // En caso de que esté vacío, agregue 0 if (empty($titleSQL))( $titleSQL = 0; ) si (vacío($sumSQL))( $sumSQL = 0; ) if (vacío($docSQL))( $docSQL = 0; ) if (vacío($urlSQL))( $urlSQL = 0; ) if (vacío($tagSQL))( $tagSQL = 0; ) $sql = " SELECCIONE p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Puntuación del título ".implode(" + ", $titleSQL). ")+ (-- Resumen ".implode(" + ", $sumSQL).")+ (-- documento ".implode(" + ", $docSQL).")+ (-- etiqueta/categoría ".implode (" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) como relevancia DESDE la publicación p DONDE p.status = "publicado" CON relevancia > 0 ORDENAR POR relevancia DESC,p.page_views DESC LIMIT 25"; $resultados = DB::consulta($sql); if (!$resultados)( devuelve falso; ) devuelve $resultados; )

    Ahora su archivo search.php puede verse así:

    $término = isset($_GET["consulta"])?$_GET["consulta"]: ""; $buscar_resultados = buscar($término); if (!$search_results) ( echo "Sin resultados"; exit; ) // Imprimir página con resultados aquí.

    Creamos un algoritmo de búsqueda simple que puede manejar una buena cantidad de contenido. Elegí arbitrariamente el puntaje para cada partido, siéntase libre de ajustarlo a algo que funcione mejor para usted. Y siempre hay margen de mejora.

    Es una buena idea rastrear el término de búsqueda proveniente de sus usuarios, de esta manera puede ver si la mayoría de los usuarios buscan lo mismo. Si hay un patrón, puede guardarles un viaje y simplemente almacenar en caché los resultados usando memcached.

    Si desea ver este algoritmo de búsqueda en acción, continúe e intente buscar un artículo en el cuadro de búsqueda en la parte superior de la página. He agregado funciones adicionales como devolver la parte donde se encontró la coincidencia en el texto. Siéntete libre de agregar funciones a las tuyas.

    ¿Te ha gustado este artículo? Puedes suscribirte para leer más increíbles. .

    En una nota relacionada, aquí hay algunos artículos interesantes.

    Es hora de ocuparse de las funciones mysql_* de una vez por todas. Estos métodos son obsoletos y lentos. El momento de actualizar ha pasado hace mucho tiempo, pero todavía lo vemos en todas partes. Como no puedo obligar a todos los autores a actualizar sus tutoriales y blogs, decidí escribir una publicación para clasificar mejor y brindar la información esencial para ayudar a los recién llegados.

    Crear su propio sitio web no debería ser demasiado difícil. Las empresas de alojamiento como Godaddy o Hostgator hacen que sea muy fácil para cualquiera comenzar; le permiten crear un sitio web completo sin tener que escribir código. Para la mayoría de las personas, es suficiente ejecutar un Blog de WordPress. Si esto es lo que estás buscando, debes dirigirte a Godaddy.com ahora mismo. Hemos terminado aquí. Pero, por otro lado, si quieres tener el control y no estar limitado por las deficiencias de un alojamiento compartido. sin romper su billetera, ha venido al lugar correcto.

    Vim es mi editor de texto favorito en la terminal. Después de jugar un rato con nano y emacs, finalmente me decidí por vim por su simplicidad (desnuda conmigo, por favor). Aunque se puede personalizar y usar como un IDE completo, lo uso principalmente para editar archivos en mis servidores y hacer cambios pequeños pero cruciales. No entremos en una guerra de editores y empecemos.

    Comentarios(45)

    Zaryel 12 de agosto de 2015:

    Ian Mustafá 26 de septiembre de 2015:

    Robar 29 de septiembre de 2015:

    ademas 11 de febrero de 2016:

    ivan venediktov 9 de abril de 2016.

    Objetivos principales:

    • implementar una búsqueda de tal manera que después de ingresar una consulta de búsqueda en una línea, los resultados de la búsqueda aparezcan debajo de esta línea
    • la solicitud para obtener el resultado debe ocurrir solo después del final de la entrada de la consulta de búsqueda

    ¡De acuerdo, vamos!

    Un diseño aproximado del bloque en sí con una cadena de búsqueda y un apodo div donde agregaremos los resultados de la búsqueda:

    Porque la búsqueda está disponible en el encabezado del sitio, agreguemos los scripts de estilo y búsqueda apropiados para los resultados:

    //finaliza la búsqueda: $APLICACIÓN->AddHeadScript("/search/ajax_search.js"); $APLICACIÓN->AddHeadScript("/search/jquery.mCustomScrollbar.js"); $APLICACIÓN->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/ajax_search.css"); $APLICACIÓN->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/jquery.mCustomScrollbar.min.css");

    Ahora veamos qué hay en nuestro ajax_search.js:

    Función get_result ()( //borra los resultados de la búsqueda $("#search_result").html(""); //aún no hemos recibido los resultados de la búsqueda - muestra el precargador $("#search_result").append( "

    "); $.ajax(( tipo: "POST", url: "/buscar/ajax_search.php", datos: "q="+q, tipo de datos: "json", éxito: función(json)( //borrar precargador $("#search_result").html(""); $("#search_result").append(" "); // agregue cada elemento de la matriz json dentro de un div con class="live-search" (puede usar su propio diseño) $.each(json, function(index, element) ( $("#search_result" ).find ("".búsqueda en vivo").append(" "+elemento.TÍTULO+""+elemento.BODY_FORMATED+""); //console.log (element.BODY_FORMATED); )); //diseñe el desplazamiento $(".live-search").mCustomScrollbar(( scrollInertia: 500 )); ) )); ) var timer = 0 ; var q = ""; $(documento).ready(function() ( $("#q").keyup(function() ( q = this.value; clearTimeout(timer); timer = setTimeout(get_result, 1000 ) ; )); $("#reset_live_search").click(function() ( $("#search_result").html(""); )); ));

    keyup, llamamos a la función get_result (), que en realidad completa el div-nick con id = "search_result" en ajax.

    mCustomScrollbar es solo una llamada de estilo (puede desactivarlo).

    Recibimos datos de /search/ajax_search.php en formato JSON.

    Todo está claro con el componente JS, ahora veamos qué sucede en ajax_search.php:

    Search(array("QUERY" => $q, "SITE_ID" => LANG, "MODULE_ID" => "iblock", "CHECK_DATES" => "Y", "PARAM2" => "8")); $resultado = matriz(); while ($res = $obSearch->GetNext())( $id = $res["ITEM_ID"]; //si se encuentra la sección: if (strripos($id, "S")!==false)( $result_item ["TÍTULO"] = $resultado["TÍTULO"]; $resultado_elemento["URL"] = $resultado["URL"]; $resultado_elemento["BODY_FORMATED"] = $resultado["TITLE_FORMATED"]; $resultado = $ result_item; ) //si no hay S, entonces else($result_item["TITLE"] = $result_item["TITLE"]; $result_item["URL"] = $result_item["URL"]; $result_item[" BODY_FORMATED"] = $res["BODY_FORMATED"]; $resultado = $result_item; ) ) echo json_encode($resultado); ) ?>

    En este caso, la búsqueda se realiza mediante el método Search de la clase CSearch de Bitrix. En PARAM2 escribimos en qué bloque de información estamos buscando. Empujamos los resultados de la búsqueda a la matriz de $resultados. Tenga en cuenta que $res['ITEM_ID'] puede ser un elemento o una sección. Dependiendo de lo que encontremos, en $result_item['BODY_FORMATED'] insertamos el nombre de la sección o un fragmento de texto del elemento encontrado del bloque de información.