[Resuelto] Input de texto con sugerencias en php o el código que sea

Iniciado por MaximAlekz, 10 Enero 2016, 07:46 AM

0 Miembros y 1 Visitante están viendo este tema.

MaximAlekz

Hola, buen día.

Cómo puedo implementar el sistema de sugerencias a mi buscador hecho en php y mysql?

Si no se puede con php, que sea con otro código. Lo importante es que me permita agregar las sugerencias desde mysql.
Gracias


gAb1

Esta pregunta debería ir a desarrollo web. Aunque lleva una pequeña parte de php (la facil), el desarrollo se debe implementar en el lado del cliente.

1º Crea un script php que reciba el input (GET o POST) y busque en la tabla correspondiente, usando "WHERE LIKE" para comparar el input con el valor de la columna.

Código (sql) [Seleccionar]
SELECT `column` FROM `table` WHERE `colum` LIKE \'%' . $string . '%\'

Si usas prepared statements (recomendado) pon "?" en lugar de la variable php.

2º En el formulario, crea una petición AJAX al script php pasandole el input (GET o POST).

3º Por últmo, usa el método AJAX "done()" para mostrar la lista desplegable (esto lo haces con css y display none) con los resultados que devuelve el script php.

MaximAlekz

Este es mi codigo para el buscador.
Código (php) [Seleccionar]
<?php
error_reporting
(0);
require_once 
'Conexion.php';
@
$Buscar $_GET['Buscar']; 
?>

<html>
    <head>
        <title><?php echo $Buscar?> - M&aacute;xima S</title>
        <link rel="stylesheet" type="text/css" href="css/stail.css">
    </head>
<body>
<form method="GET" action="">
<table>
<tr>
    <td><h1 id="engine"><a href="index.php">M&aacute;xima Search</a></h1></td>
</tr>
<tr>
   <td><div id="searchbox"><input autocomplete="off" id="search" type="text" name="Buscar" placeholder="Qu&eacute; quieres buscar" value="<?php echo $Buscar?>" /></div></td>
</tr>
</table>
<div id="total-result-search">
    <table border="0" width="600px">
   
            <?php
            
if($Buscar == NULL)
            {
                echo 
"<tr><td><div id='subindice-searchbox'>Ingrese una palabra o frase en el cuadro de b&uacute;squeda</div></td></tr>";
            }
                else
            {
            
$Busqueda "SELECT * FROM paginas WHERE Nombre LIKE '%$Buscar%' OR URL LIKE '%$Buscar%' OR Descripcion LIKE '%$Buscar%' ";
            
$Resultado mysql_query($Busqueda);
            
$Numero_De_Resultados = @mysql_num_rows($Resultado);
            echo 
"<tr><td><div id='subindice-searchbox'>Resultados de la busqueda</div></td></tr>";
            echo 
"<br />";
                 if (
$Numero_De_Resultados 1
                    {
                       echo 
"<tr><td><div id='subindice-searchbox'>Sin resultados</div></td></tr>";
                    } 
                        elseif(
$Numero_De_Resultados == 1
                         {
                            echo 
"<tr><td><div id='subindice-searchbox'>Solo un resultado</div></td></tr>";
                            echo 
"<br /><br />";
                            
$Inicio 0;
                        }
                        elseif(
$Numero_De_Resultados 1)
                        {
                            echo 
"<tr><td><div id='subindice-searchbox'>Varios resultados = ".$Numero_De_Resultados."</div></td></tr>";
                            echo 
"<br /><br />";
                            
$Inicio 0;
                        }
                        else
                        {
                            echo 
"Error";
                        }
            }
            while ((
$Fila = @mysql_fetch_array($Resultado)) && ($Inicio 10)) 
            {
                
$Nombre $Fila['Nombre'];
                
$URL $Fila['URL'];
                
$Descripcion $Fila['Descripcion'];

                echo 
"<tr><td><a id='nombrepagina-search' href='$URL'>".$Nombre."<a></td></tr>";
                echo 
"<tr><td><div id='descripcionpagina1-search'>".$URL."</div></td></tr>";
                echo 
"<tr><td><div id='descripcionpagina2-search'>".$Descripcion."</div></td></tr>";
                echo 
"<tr><td><hr id='linea-separa-search'></hr></td></tr>";
                
$Inicio++;
            }
            
            
?>

    </tr>
    </table>
    </div>
</form>
</body>
</html>


Y pues tambien tengo una pagina con la que introduzco en mysql
Código (php) [Seleccionar]
<?php 
require_once 'Conexion.php';
@
$Nombre_web $_POST['Nombre'];
@
$URL_web $_POST['URL'];
@
$Descripcion_web $_POST['Descripcion'];
if(
$_POST)
{
   if(
$Nombre_web == "")
   {
       echo 
"No has ingresado el <b>nombre</b> de la pagina web a agregar";
   }
   elseif(
$URL_web == "")
   {
       echo 
"<br />No has ingresado la <b>URL</b> de la pagina web a agregar";
   }
   elseif(
$Descripcion_web == "")
   {
       echo 
"<br />No has ingresado la <b>descripcion</b> de la pagina web a agregar";
   }
  else
  {
   
$Guardando "INSERT INTO paginas (Nombre, Descripcion, URL) ".
     
"VALUES ('".$_POST['Nombre']."', '".$_POST['Descripcion']."', '".$_POST['URL']."')";
   
   
mysql_query($Guardando);
   echo 
'Se ha guardado satisfactoriamente<br />';
   echo 
'<a href="index.php">Volver a al buscador y comprobar la busqueda</a>';
   exit();
}
}

?>

<html>
    <body> 
    <head>
        <title>Agregar paginas web</title>
    </head>
<form method="POST" action="">
   
    <label>Nombre de la pagina:</label>
    <br />
    <input type="text" name="Nombre" value="<?php echo $Nombre_web?>">
    <br />
    <label>URL:</label>
    <br />
    <input type="text" name="URL" value="<?php echo "http://".$URL_web?>">
    <br />
    <label>Descripcion:</label>
    <br />
    <textarea name="Descripcion"><?php echo $Descripcion_web?></textarea>
    <br />
    <input type="submit" value="Registrar pagina web" />
   
</form>
    </body>
    </html>


El problema es que no conozco nada sobre AJAX. Podrías explicarme un poco la peticion con AJAX y el done()?

gAb1

#3
Si, por su puesto. Pero antes de nada tienes que arreglar ese agujero de seguridad tan gordo :-\ (Sql injection de 1er y 2do nivel...).

Puedes elegir entre usar los filtros de saneamiento junto a la función filter_input() (creados explicitamente para filtrar/limpiar el input) o usar la función preg_replace() (que es customizable y puedes elegir que carácteres dejar y cuales quitar). Utiliza cualquiera de estas dos opciones siempre que necesites trabajar con user input.

Te recomiendo que empieces a usar mysqli (más facil que pdo) con los prepared statement. Aunque puedes seguir usando query (con mysqli mejor) para consultas normales tipo "SELECT * FROM table" o "INSERT INTO table (col1, col2, col3) VALUES ('noget', 'nopost', 'nouserinput')"  ;)

Ahora sí, necesitas crear otra página con un script php que realice la petición a la base de datos en busca de las surgerencias (no olvides limpiar el GET/POST).

AJAX te permite hacer peticiones al servidor una vez la página se ha cargado y no necesita volver a cargarse. Te permite cargar contenido de manera dinamica, facil y sencilla. La sintaxis es muy sencilla, hechale un vistazo a la documentación (aunque está en ingles). Un ejemplo para lo que necesitas:

Código (javascript) [Seleccionar]
$.ajax({
   method: 'GET',
   url: '/script.php',  // url del script
   data: $( '.input-texto' ).val();  // coger el valor del input
}).done(function (data) {

    var target =  '.la-lista-de-sugerencias';
   // muestra la lista
   $( target ).show();
   // agrega las sugerencias a la lista
   $( target ).replaceWith( data );

});


Tienes dos opciones, aprender y hacerlo por ti mismo o ir a lo facil y buscarlo ya hecho  ;D

MaximAlekz

#4
Gracias por tomarte tu tiempo para responder mis preguntas.
Pues si, creo que me toca meterme en SQLi. Porque soy nuevo en esto, sin embargo he buscado algo sobre ello, sé usar las bases de datos en lo básico.


El php, lo estoy empezando a entender, como caracterización de variables y así.