简体   繁体   中英

Make SQL ignore a specific search value if clicked in a dropdown?

I am creating a multi-form search box that searches a Meat packaging database. The search works only if users are specific, I want them to be able to search the database without having to choose a specific option from the dropdown box, limiting the number of searches.

Is it possible to add an option into the dropdown boxes such as "Any" and have the SQL query ignore it if the user chooses it? So then it will only search for results that match those of the ones within the text forms?

Here is the HTML and PHP:

 <body>

  <form action="form3.php" method="post"> 
    <label for ="description">Description:</label>
    <input type="text" name="descrip" /><br />

    <label for ="trayheight">Trayheight:</label>
    <input type="text" name="height" /> <br /> 

    <label for ="traywidth">Traywidth:</label>
    <input type="text" name="width" /> <br />

    <label for ="traydepth">Traydepth:</label>
    <input type="text" name="depth" /> <br />

         <label for="trayrange">Trayrange: </label>
                <select name="trayrange">
                    <option value="Other">Any</option>

                    <option value="BBQ">BBQ</option>

                    <option value="Dessert">Dessert</option>

                    <option value="Display">Display</option>

                    <option value="Meat">Meat</option>  

                    <option value="Microwave">Microwave</option>

                    <option value="Party">Party</option>

                    <option value="Salad/Wet Pasta">Salad/Wet Pasta</option>

                    <option value="Snacks">Snacks</option>

                    <option value="Standard">Standard</option>

                </select>

        <label for ="traytype">Traytype: </label> 
            <select name="traytype">
                    <option value="Other">Any</option>

            <option value="Open">Open</option>

            <option value="Cavitised">Cavitised</option>

                    <option value="Lid">Lid</option>

                    <option value="Tray">Tray</option>

                    <option value="Coallition">Coallition</option>

                    <option value="Bowl">Bowl</option>

                    <option value="Hinge pack">Open</option>

                    <option value="Pot">Pot</option>

                    <option value="Base & Lid">Base and Lid</option>

                    <option value="Rectangular">Rectangular</option>

                    <option value="Specalist">Specialist</option>
                </select><br />

        <label for="trayshape">Trayshape: </label>
            <select name="trayshape">
                    <option value="Other">Any</option>

            <option value="Rectangular">Rectangular</option>

                <option value="Oval">Oval</option>

                <option value="Square">Square</option>

                    <option value="Insert">Insert</option>

                    <option value="Round">Round</option>

                    <option value="Open">Open</option>
        </select><br />
        <input type="submit" value="Submit" /> 
    </form> 

        </body>

(Maybe making it so the Any option just makes the code ignore the dropboxes for the search)

PHP:

      <body>

    <?php
         $con = mysql_connect ("localhost", "root", "");
         mysql_select_db ("delyn_db", $con);

    if (!$con)
        { 
        die ("Could not connect: " . mysql_error());
        }

            $descrip = mysql_real_escape_string($_POST['descrip']); 
            $height = mysql_real_escape_string($_POST['height']);
            $width = mysql_real_escape_string($_POST['width']);
            $depth = mysql_real_escape_string($_POST['depth']);

            $varRange = $_POST['trayrange'];
            $varType = $_POST['traytype'];
            $varShape = $_POST['trayshape'];

    $sql = "SELECT * FROM delyn WHERE description LIKE '%".$descrip."%' AND trayheight
                    LIKE '%".$height."%'AND traywidth LIKE '%".$width."%' AND traydepth LIKE
                    '%".$depth."%' AND trayrange LIKE '%".$varRange."%' AND 
                    traytype LIKE '%".$varType."%' AND trayshape LIKE '%".$varShape."%' ";


    $r_query = mysql_query($sql);

    while ($row = mysql_fetch_array($r_query))
            { 
            echo '<br /> Tool Code:   '.$row['toolcode'];
            echo '<br /> Description: '.$row['description']; 
            echo '<br /> Tray range:  '.$row['trayrange']; 
            echo '<br /> Tray type:   '.$row['traytype'];
                echo '<br /> Tray size:   '.$row['traysize']; 
            echo '<br /> Tray shape:  '.$row['trayshape'] . '<br />' . 
                            '<br />'; ;  
                    }

        if (mysql_num_rows($r_query) <= 0){
            echo 'No results match your search, please try again';
               }
        ?>
      </body>

If anyone could help that would be great, thanks in advance :)

You are correct in your assumption that if the "Any" options is used it would be better to not include the filter in the query (as you are generating the query).

An other option is to use a multi-select control and if the length of the selection is zero, then not too generate the filter

A word of caution, the extensive use of the LIKE keyword will lead to performance issues if the table the query is executed on grows.

You can use optional parameters as in the following. You would set the value of a selection of "All" to asterisk or similar and then code your SQL as follows:

"SELECT * FROM delyn 
WHERE description LIKE '%".$descrip."%' 
AND ((.$height.   = '*') OR (trayheight LIKE '%".$height."%'))
AND ((.$width.    = '*') OR (traywidth LIKE '%".$width."%')) 
AND ((.$depth.    = '*') OR (traydepth LIKE %".$depth."%')) 
AND ((.$varRange. = '*') OR (trayrange LIKE '%".$varRange."%')) 
AND ((.$varType.  = '*') OR (traytype LIKE '%".$varType."%')) 
AND ((.$varShape. = '*') OR (trayshape LIKE '%".$varShape."%'))";

This example assumes that the first selection - description requires a value. The user could leave the rest of the selections set to "All".

You can build your $sql differently:

$varRange="";
if ($_POST['trayrange'] != "*") {
$varRange="and trayrange like %".$_POST['trayrange']."%";
}

then concatenate

$sql="select"...$varRange...;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM