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. Three of the form boxes are for users to search width, height and depth all numerical values, but they only return results if the user is exact with the sizes. I want the search to be able to return the nearest value if it cannot find an exact match to the one entered by the user.
Such as:
If user enters “252” in the width box, it will currently return “No searches found”
But there is a “251” in the database. So if the user types in “252” the SQL query then automatically looks for the nearest sizes and then displays in theory “251”.
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=""></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=""></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=""></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>
And the 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 = mysql_real_escape_string($_POST['trayrange']);
$varType = mysql_real_escape_string($_POST['traytype']);
$varShape = mysql_real_escape_string($_POST['trayshape']);
$varImage = mysql_real_escape_string($_POST['imagename']);
$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'];
echo '<br /> <img src=" '. $row['imagename'] . '"
width="200" length="100">' . '<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 🙂
EDIT:
<body>
$scope = 20;
$width_min = $width - $scope;
$width_max = $width + $scope;
$depth_min = $depth - $scope;
$depth_max = $depth + $scope;
$height_min = $height - $scope;
$height_max = $height + $scope;
$sql = "SELECT * FROM delyn WHERE
description LIKE '%".$descrip."%'
AND traywidth LIKE '%".$width."%'
AND traydepth LIKE '%".$depth."%'
AND trayheight LIKE '%".$height."%'
AND trayrange LIKE '%".$varRange."%'
AND traytype LIKE '%".$varType."%'
AND trayshape LIKE '%".$varShape."%'";
if ($row = 0) {
$sql = "SELECT * FROM delyn WHERE
description LIKE '%".$descrip."%'
AND (traywidth BETWEEN ".$width_min." AND ".$width_max.")
AND (traydepth BETWEEN ".$depth_min." AND ".$depth_max.")
AND (trayheight BETWEEN ".$height_min." AND ".$height_max.")
AND trayrange LIKE '%".$varRange."%'
AND traytype LIKE '%".$varType."%'
AND trayshape LIKE '%".$varShape."%'";
}
<body>
Instead of going with a fixed “upper” and “lower” margin, you can sort a list of your entries based upon an absolute calculation between the traywidth in your table and the inputted width by the user. Something like this:
This will give you a list of nearby traywidths based upon the “USER_SEARCH_INPUTTED_WIDTH”, for instance 252 as relative “distances” from what the user is after and what entries the database actually has.
Note: all columns you’re allowing search in/for needs to be signed otherwise you’ll end up with funky results (due to abs).