【问题标题】:Forming a query string from multiple checkboxes从多个复选框形成查询字符串
【发布时间】:2011-06-30 20:43:59
【问题描述】:

我正在尝试从多个复选框中形成一个查询字符串,用于查询我的数据库。

我有以下表格:

            <fieldset data-role="controlgroup">

            <input type="checkbox" name="wheat" id="checkbox-1a" class="custom" />
            <label for="checkbox-1a">Wheat Allergy</label>

            <input type="checkbox" name="yeast" id="checkbox-2a" class="custom" />
            <label for="checkbox-2a">Yeast Allergy</label>

            <input type="checkbox" name="sugar" id="checkbox-3a" class="custom" />
            <label for="checkbox-3a">Sugar Allergy</label>

            <input type="checkbox" name="dairy" id="checkbox-4a" class="custom" />
            <label for="checkbox-4a">Dairy Allergy</label>

我的PHP代码如下:

        if(isset($_POST['wheat']))
        {
            $str1 = 'wheatfree = 1';
        }

        if(isset($_POST['yeast']))
        {
            $str2 = 'yeastfree = 1';
        }

        if(isset($_POST['sugar']))
        {
            $str3 = 'sugarfree = 1';
        }

        if(isset($_POST['dairy']))
        {
            $str4 = 'dairyfree = 1';
        }

        $fullsearch = $str1.$str2.$str3.$str4;

        $str_SQL = "SELECT * FROM recipes WHERE ".$fullsearch;

        echo $str_SQL;

这有点像我需要的,但它不是很优雅。

首先,sql 查询如下所示:

SELECT * FROM recipes WHERE sugarfree = 1dairyfree = 1

如果用户选择不选择一个,我当然会得到一个未选择的 str 的未定义变量错误。

不确定如何解决此问题或下一步该去哪里。我想要这里的一些逻辑,它只是根据表单上检查的内容修改了字符串,然后形成一个很好的干净的 SQL 查询,我可以对我的数据库运行。但可惜我迷路了:(

帮助?

【问题讨论】:

  • 给复选框 name="allergy[]" 然后你有一个很好的数组,你可以使用 implode 来制作查询字符串

标签: php sql checkbox


【解决方案1】:

Dave 的进一步回答:

$options = Array();
$ingredients = Array('wheat', 'yeast', 'sugar', 'dairy');

foreach ($ingredients as $i)
   if (isset($_POST[$i]))
      $options[] = $i . 'free = 1';

$sql = "SELECT * FROM recipes";
if (count($options))
   $sql .= " WHERE " . implode(' AND ', $options);

echo $sql;

但是你为什么不使用复选框的value 属性呢?

<input type="checkbox" name="ingredients[]" value="wheat" />
<input type="checkbox" name="ingredients[]" value="sugar" />

等等

然后:

$options = Array();
foreach ($_POST['ingredients'] as $i)
   $options[] = $i . 'free = 1'; // don't forget to escape $i somehow!

$sql = "SELECT * FROM recipes";
if (count($options))
   $sql .= " WHERE " . implode(' AND ', $options);

echo $sql;

【讨论】:

  • 太棒了,没想到把它扔进数组rollseyes谢谢!
  • @redcow:我已经扩展了我的答案以包含一个更好的选择。
  • 这不一定更好,因为它现在很容易发生 SQL 注入(我看到你提到要逃避 $i)。我个人认为“白名单”更好。但无论如何,只是我的看法。与原来的相比,它仍然是一个改进;)(你已经从我那里得到了 +1 ;))
  • @Felix:是的,我不太确定tbh。这当然是可扩展性和合理性之间的折腾。 :)
【解决方案2】:

这个怎么样:

$options = array();
if(isset($_POST['wheat']))
{
    $options[] = 'wheatfree = 1';
}

if(isset($_POST['yeast']))
{
    $options[] = 'yeastfree = 1';
}

if(isset($_POST['sugar']))
{
    $options[] = 'sugarfree = 1';
}

if(isset($_POST['dairy']))
{
    $options[] = 'dairyfree = 1';
}

$fullsearch = implode(' AND ', $options);

$str_SQL = "SELECT * FROM recipes";
if ($fullsearch <> '') {
    $str_SQL .= " WHERE " . $fullsearch;
}

echo $str_SQL;

【讨论】:

  • 嘿,只是编辑它来做到这一点,并在您发表评论时将 str 更改为选项。不过,谢谢,而且发现得很好。 (这是对另一条评论的回应,已删除。)
  • 呃,你真的需要所有这些牙套吗?
  • 我喜欢牙套,我。另外,我发现最好总是添加它们 - 你永远不知道其他人什么时候会修改你的代码,而不是发现没有大括号的 if ...
  • 谢谢戴夫,正是我需要的。没想到把它扔进数组... :)
  • @Dave:请看我的回答,这表明不需要这种冗长而冗余的条件流。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 2023-04-03
  • 2011-05-25
相关资源
最近更新 更多