Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果SQL找不到确切的搜索词,是否让它查找最近的结果?_Php_Sql_Forms - Fatal编程技术网

Php 如果SQL找不到确切的搜索词,是否让它查找最近的结果?

Php 如果SQL找不到确切的搜索词,是否让它查找最近的结果?,php,sql,forms,Php,Sql,Forms,我正在创建一个多表单搜索框,用于搜索肉类包装数据库。搜索只有在用户是特定的情况下才有效,我希望他们能够在不必选择特定选项的情况下搜索数据库。其中三个表单框供用户搜索宽度、高度和深度的所有数值,但它们仅在用户完全了解尺寸的情况下返回结果。我希望搜索能够返回最接近的值,如果它无法找到与用户输入的值完全匹配的值 例如: 如果用户在宽度框中输入252,则当前将返回未找到的搜索 但数据库中有一个251。因此,如果用户在252中键入SQL查询,则会自动查找最接近的大小,然后在理论上显示251 以下是HTML

我正在创建一个多表单搜索框,用于搜索肉类包装数据库。搜索只有在用户是特定的情况下才有效,我希望他们能够在不必选择特定选项的情况下搜索数据库。其中三个表单框供用户搜索宽度、高度和深度的所有数值,但它们仅在用户完全了解尺寸的情况下返回结果。我希望搜索能够返回最接近的值,如果它无法找到与用户输入的值完全匹配的值

例如:

如果用户在宽度框中输入252,则当前将返回未找到的搜索 但数据库中有一个251。因此,如果用户在252中键入SQL查询,则会自动查找最接近的大小,然后在理论上显示251

以下是HTML和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>
而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>
如果有人能帮忙,那就太好了,提前谢谢你:

编辑:

   <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>

您可以使用SQL BETWEEN运算符。

而不是使用固定的上下边距,您可以根据表中的traywidth和用户输入的宽度之间的绝对计算对条目列表进行排序。大概是这样的:

select d.*, abs(d.traywidth - USER_SEARCH_INPUTTED_WIDTH) as WIDTH_ABS from delyn d order by WIDTH_ABS limit 20;
这将根据用户搜索输入的宽度为您提供一个附近轨道宽度的列表,例如252,作为与用户的目标和数据库实际拥有的条目之间的相对距离


注意:您允许搜索的所有列都需要签名,否则,由于abs的原因,您将得到令人生厌的结果

好主意,您是否能够使用BETWEEN来查找与精确结果相差10的结果?或者在10%以内?是的,应该是可能的。在$lowerWidth和$UpperWidth之间执行类似和traywidth的操作。您如何使用此选项将其与用户输入的内容进行比较?因此,如果他们输入251,代码将在20以内查找最接近的结果?您可以简单地将$lowerWidth和$upperWidth定义为这样的内容:$lowerWidth=$ImplementInputWidth-20$upperWidth=$ImplementInputWidth+20I编写了类似的内容,但我仍然无法让查询搜索最接近的结果。新代码在上面,我缺少什么?我已经盯着它看了好几个小时了。谢谢@oppermann的帮助,你能编辑我的代码,告诉我在哪里或者如何实现这个吗?我正在自己尝试,但无法使其正常工作。请放弃“%.width.%”之类的traywidth查询,并按照我上面所述的方法解决问题。这应该是非常直截了当的。要理解正在发生的事情,首先只考虑一个特征,即:traywidth,然后从那里开始。在我看来,一个人从自己做中学到的最多。