Código adecuado para filtrar un rango de precio en PHP / SQL de la Consulta

Realmente esperando que alguien me puede ayudar con esto. Estoy construyendo un PHP /MySQL formulario de búsqueda que, esperemos, que permitirá a los usuarios buscar en nuestra base de datos del vino y filtrar los resultados de acuerdo a un rango de precios seleccionados a través de un menú desplegable.

El formulario funciona bien buscando, y volver, una buena lista de resultados precisos. Pero NO precio filtrar los resultados.

Después de días de búsqueda y experimentación, he puré de diversos fragmentos de código para llegar a este punto pero, en general, PHP todavía es un misterio para mí.

Es la correcta codificación y la sintaxis de lucho.

¿Cómo podría yo el código PHP publicado aquí para integrar correctamente el Rango de Precios de filtro? Sospecho que mi inclusión de «pricerange» en la consulta sql se forma fuera de la base.

  • La versión del Servidor MySQL: 5.1.65-cll
  • Precio de columna tipo: decimal(10,2)

Cualquier ayuda sería enormemente apreciada. Por favor, compruebe el código de bloques a continuación.

Un millón de gracias!

HTML

 <form  method="post" action="winesearch.php?go" id="searchform"> 
 <input  type="text" size="35" name="user-entry"/>
 <select name="pricerange" size="1" id="pricerange">
    <option value="">Price Range&nbsp;</option>
    <option value="1">$&nbsp;10 - $20</option>
    <option value="2">$&nbsp;21 - $30</option>
    <option value="3">$&nbsp;31 - $50</option>
    <option value="4">$&nbsp;51 - $75</option>
    <option value="5">$&nbsp;76 - $100</option>
    <option value="6">$101 - $200</option>
    <option value="7">$201 - Plus</option>
</select> 
<input  type="submit" name="submit" value="Wine Search"/> 
</form>

PHP

<?php

  if(isset($_POST['submit'])){
  if(isset($_GET['go'])){
  if(preg_match("/^[a-zA-Z0-9]+/", $_POST['user-entry'])){
  $cob=$_POST['user-entry'];
  $pricerange=$_POST['pricerange'];


  //connect to the database
  $db=mysql_connect  ("server", "user", "pass") or die (mysql_error());

  //-select the database to use
  $mydb=mysql_select_db("db_name");

  if($pricerange == 0) $pricerange = 1;

  switch ($pricerange) {
  case 1  :  $pricerange = " where Price BETWEEN 10.00 AND 20.00 ";  break; 
  case 2  :  $pricerange = " where Price BETWEEN 21.00 AND 30.00 ";  break;  
  case 3  :  $pricerange = " where Price BETWEEN 31.00 AND 50.00 ";  break;   
  case 4  :  $pricerange = " where Price BETWEEN 51.00 AND 75.00 ";  break;     
  case 5  :  $pricerange = " where Price BETWEEN 76.00 AND 100.00 ";  break;       
  case 6  :  $pricerange = " where Price BETWEEN 101.00 AND 200.00 ";  break;         
  case 7  :  $pricerange = " where Price > 200.00 ";  break;           
  }

  //-query the database table
  $sql="
    SELECT  ID, 
    CSPC, 
    Country,
    Producer,
    Wine,
    Year,
    Price 
    FROM winecellar WHERE 
    CSPC LIKE '%" . $cob .  "%' 
    OR 
    Country LIKE '%" . $cob ."%'
    OR 
    Producer LIKE '%" . $cob ."%'
    OR 
    Wine LIKE '%" . $cob ."%'
    OR 
    Year LIKE '%" . $cob ."%'
    OR 
    Price LIKE '%" . $pricerange ."%'
    ";

  //-run  the query against the mysql query function
  $result=mysql_query($sql);

  //-create  while loop and loop through result set
  while($row=mysql_fetch_array($result)){
    $CSPC=$row['CSPC'];
    $Country=$row['Country'];
    $Producer=$row['Producer'];
    $Wine=$row['Wine'];
    $Year=$row['Year']; 
    $Price=$row['Price'];
    $ID=$row['ID'];

    //-display the result of the array
echo  "<ul>\n";
echo  "<li>" . $CSPC . "</li>\n";
echo  "<li>" . $Country . "</li>\n";
echo  "<li>" . $Producer . "</li>\n";
echo  "<li>" . $Wine . "</li>\n";
echo  "<li>" . $Year . "</li>\n";
echo  "<li>" . "<a href=" . $Price .  ">" . "$" . $Price . "</a></li>\n";

echo  "</ul>";
  }
  }
  else{
  echo  "<p>Please enter a search query</p>";
  }
  }
  }
?>
  • Lo que no funciona exactamente? ¿Sabes exactamente qué instrucción SQL que han construido? Tiene impresa la $sql que han construido antes de ejecutarlo?
  • primero quitar WHERE cláusula de $pricerange
  • Si el tamaño de sus productos es relativamente pequeño, me volvería a considerar la eliminación de la gama de precios de la característica de búsqueda. A continuación, una lista de todos, y agregar un jquery tabla clasificador en sus resultados. A continuación, el usuario puede ordenar según su encabezados de tabla. También, actualmente se muestran los resultados en una lista no ordenada, podría reconsiderar así.
  • Gracias gSaenz, que es una gran idea. SI no puedo conseguir este menú desplegable para el trabajo, que es, definitivamente, el enfoque necesito, muchas gracias!
InformationsquelleAutor user1515259 | 2012-12-06

3 Kommentare

  1. 0
    <?php
    
      if(isset($_POST['submit'])){
      if(isset($_GET['go'])){
       //improved the filter to support space and -
       //Also closed critical security breache (SQL-injection)
      if(preg_match("/^[a-zA-Z0-9 -]+$/", $_POST['user-entry'])){
      $cob=$_POST['user-entry'];
      $pricerange=$_POST['pricerange'];
    
    
      //connect to the database
      $db=mysql_connect  ("server", "user", "pass") or die (mysql_error());
    
      //-select the database to use
      $mydb=mysql_select_db("db_name");
    
      switch ($pricerange) {
      case 2  :  $pricerange = " AND Price BETWEEN 21.00 AND 30.00 ";  break;  
      case 3  :  $pricerange = " AND Price BETWEEN 31.00 AND 50.00 ";  break;   
      case 4  :  $pricerange = " AND Price BETWEEN 51.00 AND 75.00 ";  break;     
      case 5  :  $pricerange = " AND Price BETWEEN 76.00 AND 100.00 ";  break;       
      case 6  :  $pricerange = " AND Price BETWEEN 101.00 AND 200.00 ";  break;         
      case 7  :  $pricerange = " AND Price > 200.00 ";  break;
      default :  $pricerange = " AND Price BETWEEN 10.00 AND 20.00 "; //covers all other cases
      }
    
      //-query the database table
      $sql="
        SELECT  ID, 
        CSPC, 
        Country,
        Producer,
        Wine,
        Year,
        Price 
        FROM winecellar WHERE 
        (CSPC LIKE '%" . $cob .  "%' 
        OR 
        Country LIKE '%" . $cob ."%'
        OR 
        Producer LIKE '%" . $cob ."%'
        OR 
        Wine LIKE '%" . $cob ."%'
        OR 
        Year LIKE '%" . $cob ."%')
        " . $pricerange;
    
      //-run  the query against the mysql query function
      $result=mysql_query($sql);
    
      //-create  while loop and loop through result set
      while($row=mysql_fetch_array($result)){
        $CSPC=$row['CSPC'];
        $Country=$row['Country'];
        $Producer=$row['Producer'];
        $Wine=$row['Wine'];
        $Year=$row['Year']; 
        $Price=$row['Price'];
        $ID=$row['ID'];
    
        //-display the result of the array
    echo  "<ul>\n";
    echo  "<li>" . $CSPC . "</li>\n";
    echo  "<li>" . $Country . "</li>\n";
    echo  "<li>" . $Producer . "</li>\n";
    echo  "<li>" . $Wine . "</li>\n";
    echo  "<li>" . $Year . "</li>\n";
    echo  "<li>" . "<a href=" . $Price .  ">" . "$" . $Price . "</a></li>\n";
    
    echo  "</ul>";
      }
      }
      else{
      echo  "<p>Please enter a search query</p>";
      }
      }
      }
    ?>
    • También no hay necesidad de Price LIKE
    • Gracias Andy, Alexander y CGE para el super-rápido de comentarios! Lo siento, no estoy muy versado en esto. Acabo de hacer los cambios Alexander sugerido, pero ahora el formulario queda totalmente en blanco y no se devuelven mensajes de error. Podría haber algo mal en el bucle while o eco de la pantalla? Sólo estoy adivinando ..
    • Gracias Alejandro, muy apreciada, te voy a dar los nuevos cambios de probar ahora mismo …
    • No puedo decirle cuánto agradezco la ayuda chicos, impresionante! Alejandro, he hecho los cambios sugeridos, y ahora recibirá el mensaje de error siga: Parse error: syntax error, inesperado ‘}’ en la línea 152. Que es la llave de cierre aquí: default: $pricerange = » }
    • OK. Debo dejar de intentar la solución rápida a su problema. Voy a volver un par de horas más tarde, cuando voy a tener un tiempo para proporcionarle toda la solución
    • Muchas gracias Alejandro, he ajustado el código sin la default: $pricerange = '' y ahora devuelve TODOS los vinos en el derecho de la gama de precio, ADEMÁS de todos los vinos cuyo nombre (Merlot) he entrado en el cuadro de búsqueda. Me gustaría filtro de la Merlot (por ejemplo) para que, dentro de los seleccionados de la gama de precio son devueltas, y nada más. Pero estoy en el camino correcto gracias a ustedes, esperamos escuchar de usted de nuevo 🙂
    • He actualizado mi respuesta inicial con la mejora del código. Usted puede usarlo o no, pero la línea 7, que debe ser cambiado. Estos era muy peligrosa vulnerabilidad de inyección SQL en esta línea. He arreglado esto. Recomiendo encarecidamente el uso de mysql_real_escape_string() en todas las entradas de formularios web antes de su uso en las consultas de mysql
    • Alexander, you rock! Gracias mi amigo, funciona a la PERFECCIÓN. Aprecio mucho su esfuerzo y un talento considerable. Todo lo mejor .. Chris.

  2. 1

    La tenía hasta el momento de poner la consulta juntos. Usted no necesita el «dónde» en las instrucciones de abajo ya que usted ya tiene en la consulta que se está construyendo de abajo.

    switch ($pricerange) {
      case 1  :  $pricerange = " Price BETWEEN 10.00 AND 20.00 ";  break; 
      case 2  :  $pricerange = " Price BETWEEN 21.00 AND 30.00 ";  break;  
      case 3  :  $pricerange = " Price BETWEEN 31.00 AND 50.00 ";  break;   
      case 4  :  $pricerange = " Price BETWEEN 51.00 AND 75.00 ";  break;     
      case 5  :  $pricerange = " Price BETWEEN 76.00 AND 100.00 ";  break;       
      case 6  :  $pricerange = " Price BETWEEN 101.00 AND 200.00 ";  break;         
      case 6  :  $pricerange = " Price > 200.00 ";  break;           
    }
    
    OR 
    Price LIKE '%" . $pricerange ."%'

    debe ser

    OR ". $pricerange ."

    porque ya está la construcción de la factura.

    • MagicMarkker: muchas Gracias por tu aportación. Creo que nos estamos acercando. con sus sugerencias.
    • He ajustado el código como se indicó anteriormente. Ahora el formulario devuelve TODOS los vinos en el derecho de la gama de precio, ADEMÁS de todos los vinos cuyo nombre (Merlot) he entrado en el cuadro de búsqueda. Me gustaría filtro de la Merlot (por ejemplo) para que, dentro de los seleccionados de la gama de precio son devueltas, y nada más. Alguna idea sobre esto? De nuevo, gracias!
    • cambiar el OR ". $pricerange ." a » Y «. $pricerange .»` y si hay un pricerange conjunto, se podría quitar todos los de la O las declaraciones que usted no desea visualizar más. Así que tendrás que construir la consulta de forma dinámica, con un par de instrucciones if.
    • Gracias, voy a buscar alrededor para un adecuado si el bloque de instrucciones y ver lo que se convierte, al menos yo estoy en el camino correcto, todo el mundo ha sido genial! Gracias de nuevo ..
  3. 0

    Haría eco a su consulta sql antes de ejecutar así que usted puede ver lo que parece. Pero parece que la parte de SQL es malo para el pricerange sección. Ahora tendría este aspecto:

    OR Price LIKE '% where price BETWEEN 10.00 AND 20.00 %'

    Yo creo que usted quiere que se vea como:

    OR PRICE BETWEEN 10.00 AND 20.00

    ¿Quieres que se trata de una ‘o’ o ‘y’?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea