Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: MaximAlekz en 10 Enero 2016, 07:46 am



Título: [Resuelto] Input de texto con sugerencias en php o el código que sea
Publicado por: MaximAlekz en 10 Enero 2016, 07:46 am
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



Título: Re: Input de texto con sugerencias en php o el código que sea
Publicado por: gAb1 en 10 Enero 2016, 17:13 pm
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
  1. 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.


Título: Re: Input de texto con sugerencias en php o el código que sea
Publicado por: MaximAlekz en 10 Enero 2016, 20:00 pm
Este es mi codigo para el buscador.
Código
  1. <?php
  2. require_once 'Conexion.php';
  3. @$Buscar = $_GET['Buscar'];
  4. ?>
  5. <html>
  6.    <head>
  7.        <title><?php echo $Buscar; ?> - M&aacute;xima S</title>
  8.        <link rel="stylesheet" type="text/css" href="css/stail.css">
  9.    </head>
  10. <body>
  11. <form method="GET" action="">
  12. <table>
  13. <tr>
  14.    <td><h1 id="engine"><a href="index.php">M&aacute;xima Search</a></h1></td>
  15. </tr>
  16. <tr>
  17.   <td><div id="searchbox"><input autocomplete="off" id="search" type="text" name="Buscar" placeholder="Qu&eacute; quieres buscar" value="<?php echo $Buscar; ?>" /></div></td>
  18. </tr>
  19. </table>
  20. <div id="total-result-search">
  21.    <table border="0" width="600px">
  22.  
  23.            <?php
  24.            if($Buscar == NULL)
  25.            {
  26.                echo "<tr><td><div id='subindice-searchbox'>Ingrese una palabra o frase en el cuadro de b&uacute;squeda</div></td></tr>";
  27.            }
  28.                else
  29.            {
  30.            $Busqueda = "SELECT * FROM paginas WHERE Nombre LIKE '%$Buscar%' OR URL LIKE '%$Buscar%' OR Descripcion LIKE '%$Buscar%' ";
  31.            $Resultado = mysql_query($Busqueda);
  32.            $Numero_De_Resultados = @mysql_num_rows($Resultado);
  33.            echo "<tr><td><div id='subindice-searchbox'>Resultados de la busqueda</div></td></tr>";
  34.            echo "<br />";
  35.                 if ($Numero_De_Resultados < 1)
  36.                    {
  37.                       echo "<tr><td><div id='subindice-searchbox'>Sin resultados</div></td></tr>";
  38.                    }
  39.                        elseif($Numero_De_Resultados == 1)
  40.                         {
  41.                            echo "<tr><td><div id='subindice-searchbox'>Solo un resultado</div></td></tr>";
  42.                            echo "<br /><br />";
  43.                            $Inicio = 0;
  44.                        }
  45.                        elseif($Numero_De_Resultados > 1)
  46.                        {
  47.                            echo "<tr><td><div id='subindice-searchbox'>Varios resultados = ".$Numero_De_Resultados."</div></td></tr>";
  48.                            echo "<br /><br />";
  49.                            $Inicio = 0;
  50.                        }
  51.                        else
  52.                        {
  53.                            echo "Error";
  54.                        }
  55.            }
  56.            while (($Fila = @mysql_fetch_array($Resultado)) && ($Inicio < 10))
  57.            {
  58.                $Nombre = $Fila['Nombre'];
  59.                $URL = $Fila['URL'];
  60.                $Descripcion = $Fila['Descripcion'];
  61.  
  62.                echo "<tr><td><a id='nombrepagina-search' href='$URL'>".$Nombre."<a></td></tr>";
  63.                echo "<tr><td><div id='descripcionpagina1-search'>".$URL."</div></td></tr>";
  64.                echo "<tr><td><div id='descripcionpagina2-search'>".$Descripcion."</div></td></tr>";
  65.                echo "<tr><td><hr id='linea-separa-search'></hr></td></tr>";
  66.                $Inicio++;
  67.            }
  68.  
  69.            ?>
  70.    </tr>
  71.    </table>
  72.    </div>
  73. </form>
  74. </body>
  75. </html>

Y pues tambien tengo una pagina con la que introduzco en mysql
Código
  1. <?php
  2. require_once 'Conexion.php';
  3. @$Nombre_web = $_POST['Nombre'];
  4. @$URL_web = $_POST['URL'];
  5. @$Descripcion_web = $_POST['Descripcion'];
  6. if($_POST)
  7. {
  8.   if($Nombre_web == "")
  9.   {
  10.       echo "No has ingresado el <b>nombre</b> de la pagina web a agregar";
  11.   }
  12.   elseif($URL_web == "")
  13.   {
  14.       echo "<br />No has ingresado la <b>URL</b> de la pagina web a agregar";
  15.   }
  16.   elseif($Descripcion_web == "")
  17.   {
  18.       echo "<br />No has ingresado la <b>descripcion</b> de la pagina web a agregar";
  19.   }
  20.  else
  21.  {
  22.   $Guardando = "INSERT INTO paginas (Nombre, Descripcion, URL) ".
  23.     "VALUES ('".$_POST['Nombre']."', '".$_POST['Descripcion']."', '".$_POST['URL']."')";
  24.  
  25.   mysql_query($Guardando);
  26.   echo 'Se ha guardado satisfactoriamente<br />';
  27.   echo '<a href="index.php">Volver a al buscador y comprobar la busqueda</a>';
  28.   exit();
  29. }
  30. }
  31.  
  32. ?>
  33. <html>
  34.    <body>  
  35.    <head>
  36.        <title>Agregar paginas web</title>
  37.    </head>
  38. <form method="POST" action="">
  39.  
  40.    <label>Nombre de la pagina:</label>
  41.    <br />
  42.    <input type="text" name="Nombre" value="<?php echo $Nombre_web; ?>">
  43.    <br />
  44.    <label>URL:</label>
  45.    <br />
  46.    <input type="text" name="URL" value="<?php echo "http://".$URL_web; ?>">
  47.    <br />
  48.    <label>Descripcion:</label>
  49.    <br />
  50.    <textarea name="Descripcion"><?php echo $Descripcion_web; ?></textarea>
  51.    <br />
  52.    <input type="submit" value="Registrar pagina web" />
  53.  
  54. </form>
  55.    </body>
  56.    </html>

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


Título: Re: Input de texto con sugerencias en php o el código que sea
Publicado por: gAb1 en 11 Enero 2016, 16:21 pm
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 (http://php.net/manual/es/filter.filters.sanitize.php) junto a la función filter_input() (http://php.net/manual/es/function.filter-input.php) (creados explicitamente para filtrar/limpiar el input) o usar la función preg_replace() (http://php.net/manual/es/function.preg-replace.php) (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 (http://php.net/manual/es/book.mysqli.php) (más facil que pdo) con los prepared statement (http://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 (http://api.jquery.com/jquery.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
  1. $.ajax({
  2.    method: 'GET',
  3.    url: '/script.php',  // url del script
  4.    data: $( '.input-texto' ).val();  // coger el valor del input
  5. }).done(function (data) {
  6.  
  7.    var target =  '.la-lista-de-sugerencias';
  8.    // muestra la lista
  9.    $( target ).show();
  10.    // agrega las sugerencias a la lista
  11.    $( target ).replaceWith( data );
  12.  
  13. });

Tienes dos opciones, aprender y hacerlo por ti mismo o ir a lo facil y buscarlo ya hecho (http://ianlunn.co.uk/demos/ajax-search-suggest-wearehunted/)  ;D


Título: Re: Input de texto con sugerencias en php o el código que sea
Publicado por: MaximAlekz en 11 Enero 2016, 16:29 pm
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í.