【问题标题】:PHP - Select sql from html checkboxPHP - 从 html 复选框中选择 sql
【发布时间】:2017-03-21 23:12:59
【问题描述】:

我有一个 html 表单,带有一些复选框。

我想写一个 sql 来包含我的复选框。

例如在我的数据库中:
栏目:Stato
选项:0,1,2,3
其中:

  • 0 = 开场白,
  • 1 = 邮票,
  • 2 = 块状,
  • 3 = ❤(最喜欢的),

所以,如果它们都被选中,你必须向我展示所有类型,否则不会。

怎么写sql?

这是我的复选框:

<div id="radioset">
        <input type="checkbox" id="radio1" name="aperto" checked="checked"><label for="radio1">Aperto</label>
        <input type="checkbox" id="radio2" name="stampato" checked="checked"><label for="radio2">Stampato</label>
        <input type="checkbox" id="radio3" name="bloccato" checked="checked"><label for="radio3">Bloccato</label>
        <input type="checkbox" id="radio4" name="favorite" checked="checked"><label for="radio4">&#9829</label>
</div>

这是我的 PHP sql:

$input=$_POST['input'];
$id=$_POST['id'];
$tipo=$_POST['tipo'];
$numero1=$_POST['numero1'];
$numero2=$_POST['numero2'];
$data1=date('d/m/Y', strtotime($_POST['from']));;
$data2=date('d/m/Y', strtotime($_POST['to']));;

$sql="SELECT [Id Ord] AS [ID], [Tipo Ord] AS [Tipo], [N Ord] AS [Numero], [Data Ord] AS [Data], [Ragione Sociale], [Indirizzo], [TotImp] AS [IMPORTO TOTALE], [TotIva] AS [IMPORTO IVA] FROM [Ordini] WHERE [Id Ord] LIKE '$id' OR [Tipo Ord] LIKE '$tipo' OR [Data Ord] BETWEEN #$data1# AND #$data2#";

$rs = $con->execute($sql);

谢谢!

【问题讨论】:

  • @AnilMaurya 我不明白你的意思

标签: php html sql select checkbox


【解决方案1】:

首先,将您的复选框定义为一个数组(不要使用术语“单选” - 单选按钮完全不同!),并更改值以匹配数据库记录:

<div id="checkboxes">
  <input type="checkbox" id="checkbox1" name="options[]" value="0" checked="checked"><label for="checkbox1">Aperto</label>
  <input type="checkbox" id="checkbox2" name="options[]" value="1" checked="checked"><label for="checkbox2">Stampato</label>
  <input type="checkbox" id="checkbox3" name="options[]" value="2" checked="checked"><label for="checkbox3">Bloccato</label>
  <input type="checkbox" id="checkbox4" name="options[]" value="3" checked="checked"><label for="checkbox4">&#9829</label>
</div>

然后您可以使用 for each 循环遍历它们,如果存在该选项(如果未选中该框,则回发中甚至不存在复选框值)然后添加一些 SQL 以包含该选项搜索中的选项:

$optionsSQL = "";

foreach($_POST["options"] as $index => $option) {
  if ($optionsSQL == "") $optionsSQL = "AND Stato IN ("; //if it's the first detected option, add the IN clause to the string
  $optionsSQL .= $option.",";
}

//trim the trailing comma and add the closing bracket of the IN clause instead
if ($optionsSQL != "") 
{
  $optionsSQL = rtrim($optionsSQL, ","); 
  $optionsSQL .= ")";
}

最后,将$optionsSQL 字符串附加到您的查询中:

$sql="SELECT [Id Ord] AS [ID], [Tipo Ord] AS [Tipo], [N Ord] AS [Numero], [Data Ord] AS [Data], [Ragione Sociale], [Indirizzo], [TotImp] AS [IMPORTO TOTALE], [TotIva] AS [IMPORTO IVA] FROM [Ordini] WHERE ([Id Ord] LIKE '$id' OR [Tipo Ord] LIKE '$tipo' OR ([Data Ord] BETWEEN #$data1# AND #$data2#))".$optionsSQL;

注意由于这是一个简单的示例,因此我没有采取措施来防止 SQL 注入。您应该研究如何防范这种情况 - 恶意用户可能会篡改选项值并尝试提交有问题的数据。您应该在 SQL 语句中使用每个选项值之前对其进行验证。

【讨论】:

  • 拳头:我使用“radio1” [...] 因为它属于 jQuery 风格,如果我把它取下来,我就会失去风格。可以保持没有问题吗?
  • 是的,你可以保留它,它只是语义错误,因为单选按钮是别的东西。我不知道您正在尝试将其链接到预先存在的样式表。您可以在不影响 PHP 的情况下将其更改回来。
  • 太棒了。我怎样才能把"Aperto", "Stampato", "Bloccato", "Favorite" 变成"0","1","2","3"?因为,在我的数据库中,“Stato”是“0”、“1”、“2”、“3”。
  • IN 就像许多 OR 语句的替代品。因此,如果用户选择了选项 1 和 3,那么 SQL 将有效地说“WHERE...xyz...AND (Stato = 1 OR Stato = 3)”。这取决于你是否想要。如果您希望它是“AND St​​ato = 1 AND St​​ato = 3)”,那么您必须稍微重写它,但我不确定这是否有意义,因为一列不能在一行中有两个不同的值同时:-)
  • 我已修正的小错字,foreach 下的下一行应以 if ($optionsSQL == "") 开头(== 而不是 =)
【解决方案2】:

你需要一个复选框数组,

<div id="radioset">
  <input type="checkbox" id="radio1" name="options[]" value="aperto" checked="checked"><label for="radio1">Aperto</label>
  <input type="checkbox" id="radio2" name="options[]" value="stampato" checked="checked"><label for="radio2">Stampato</label>
  <input type="checkbox" id="radio3" name="options[]" value="bloccato" checked="checked"><label for="radio3">Bloccato</label>
  <input type="checkbox" id="radio4" name="options[]" value="favorite" checked="checked"><label for="radio4">&#9829</label>
</div>

使用名称 [],您将获得一个多维数组,例如 $_POST["options"] = array();

当您提交时,您可以这样做以获取值,

foreach($_POST["options"] AS $index => $option) {
  // example of print all checked boxes
  print $option;

}

如果您需要任何帮助,请告诉我

【讨论】:

  • 因此,此时,$option 具有值“aperto”或“stampato”或“bloccato”或“favorite”。是吗?
  • 我怎样才能把它们变成"0","1","2","3"?因为,在我的数据库中,我是 0,1,2,3。
  • @MarcoBagiacchi 可以将值更改为0、1、2、3。该值可以是您想要的,并且可以使用标签放置文本值以供用户解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2016-04-01
  • 1970-01-01
  • 2010-12-02
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多