<option> 标签中有多个值?

Posted

技术标签:

【中文标题】<option> 标签中有多个值?【英文标题】:Having multiple values within an <option> tag? 【发布时间】:2012-10-02 03:57:54 【问题描述】:

我正在尝试创建一个从 10 到 90 的下拉框,我希望每个值代表介于两者之间的数字(因此 10 将包含 11、12、13、14 等等等等)。因此,如果用户单击 10,它将显示数据库中范围从 10 到 19 的任何条目,而不仅仅是其中带有“10”的条目。

是否可以在选项标签中添加多个值?这是我迄今为止尝试的。

HTML:

<body>


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

         <label for="trayheight">Height: </label>
                <select name="trayheight">
                    <option value="">All</option>
                    <option value="10">10</option>
                    <option value="[20:21:22:23:24:25:26:27:28:29]">20</option>
                    <option value="30">30</option>
                    <option value="40">40</option>
                    <option value="50">50</option>
                    <option value="60">60</option>
                    <option value="70">70</option>
                    <option value="80">10</option>
                    <option value="90">90</option>
                </select><br />

         <label for="trayrange">Trayrange: </label>
                <select name="trayrange">
                    <option value="">All</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><br />

        <label for ="traytype">Traytype: </label> 
                <select name="traytype">
                    <option value="">All</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">Hinge pack</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="">All</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']); 
            $width   = mysql_real_escape_string($_POST['width']);
            $depth   = mysql_real_escape_string($_POST['depth']);

            $varHeight= mysql_real_escape_string($_POST['trayheight']);
            $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 '%".$varHeight."%'
                    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 /> <img src="   '. $row['imagename'] . '"  length="100">';
                        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>

提前感谢任何可以提供帮助的人:)

【问题讨论】:

我认为您不需要将值的范围放在选项标签中。为什么不能只在服务器上实现业务逻辑。因此,如果他们选择 10,则在您的 PHP 代码中,您可以在查询中将其转换为 10-19 因为我正在做的是,10 将代表 100。因此,当它搜索 10 (100) 时,它将在数据库中查找具有 10、11、12 或最多 19 英寸(因此理论上它会在前 100 英寸内找到任何东西)。我正在尝试通过数据库进行搜索,而不必获得确切的结果。 离题了,我很清楚你是从 php 开始的。请使用PDO,或至少Mysqli 使用mysql API 是你不想养成的坏习惯。 【参考方案1】:

简单的答案:您不能在一个选项标签值中存储多个值。

最简单和最安全的解决方案是在选项值中存储一个值(例如10),然后将其视为从设置的值到下一个 10 倍数的范围:

'AND col &gt;= '.$value.' AND col &lt; '.$value+10

第二种解决方案是将值设置为10-19 之类的范围,然后在服务器端:

list($min,$max) = explode('-',$value);
... 'AND col >= '.$min.' AND col <= '.$max ...

另一种解决方案是存储包含您希望封装在一个选项中的值的数组的 JSON 编码,然后在服务器端解码该值:

'AND col IN ('.implode(',',json_decode($value)).')'

我个人会避免使用 JSON 方法,因为它对于此类问题来说太过分了。

【讨论】:

为什么大家都在这里跳到 JSON 编码?像“10-19”和“10,11,12,13”这样的简单符号有什么问题? 我刚刚尝试了第二个选项:'list($min, $max) = explode('-',$value); $sql .= "SELECT * FROM delyn WHERE description LIKE '%".$descrip."%' AND trayheight >= '.$min' AND trayheight 乍一看,您缺少一个 . $分钟后。另外,我的答案是从您的代码中抽象出来的,并为该问题提供了通用的解决方案。例如,我不相信 $value 与您的代码相关。 我根本无法让它返回任何结果。抱歉,值是 $varHeight,即使这样它仍然没有返回任何内容。 我现在什至返回 BOOLEAN 区域... mysql_fetch_array() 期望参数 1 是资源,给定布尔值 哈哈。【参考方案2】:

我假设您正在从 PHP 源代码中检索这些整数。在这种情况下,只需将此逻辑存储在您的databasephp file 或某种config file 中的某个位置,以便将此逻辑保持在服务器端。不可能在一个选项中存储多个值,这就是选项的想法。或者您必须将其存储为 json_encode 字符串,但我不确定这是否是您想要的。

将它放在服务器端也会更安全,我不确定你在创建什么,但安全始终是前提。

More about json encoding

【讨论】:

一个选项不能代表多个值吗?所以 20 代表 20-29 之间的任何东西?你将如何在 php 中实现这个服务器端? @LiamHorizo​​n 不,一个选项只有一个值,它是一个字符串。使用您想要的任何 PHP 代码赋予该字符串含义完全取决于您 - 字符串“a,b,c”可以是使用 explode() 的三个值的列表,但它可能只是字符串“a, b,c"。【参考方案3】:

&lt;option&gt; 的值可以是任何字符串;由您的服务器端代码来适当地解释该字符串。

您需要为每个列选择适当的条件,而不是总是在 SQL 中使用字符串匹配运算符 LIKE

例如,将您的值设置为由最小值和最大值指定的范围:&lt;option value="11-20"&gt;foo&lt;/option&gt;,然后在您的 SQL 中使用 &lt;=&gt;=(当心“围栏错误”!)

list($min,$max) = explode('-', $_POST['trayheight']);
$sql .= 'And trayheight >= ' . intval($min) . ' And trayheight <= ' . intval($max);

【讨论】:

以上是关于<option> 标签中有多个值?的主要内容,如果未能解决你的问题,请参考以下文章

Select 标签中的 Option 可以携带多个值吗?

select option 中的注意点

如果值为空,如何隐藏 <option> 标签?

获取select标签中option的value值

如何在 <option> 标签中使用变量作为“值”属性

html的option标签里value属性的值不能带<>吗