2012-03-15 69 views
1

我有一个由很多单选按钮和复选框组成的表单,我想知道将它们的值保存到数据库的最佳方法是什么。有几件事情需要考虑。如何使用php向数据库发送多个复选框/无线电值?

  1. 所有收音机/复选框都有不同的名称。我已经为每个收音机/复选框创建了一个带有列的新表格,共有30个新列。我被告知这种方式比在单个列中存储多个复选框值更好。

  2. 我的工作基于MVC模式的系统上,这是我在控制文件中的代码的无线电/复选框值发送到数据库

    if (isset($this->request->post['buss_type'])) { 
        $this->data['buss_type'] = $this->request->post['buss_type']; 
    } else { 
        $this->data['buss_type'] = ''; 
    } 
    
  3. 我在想,如果我被迫为我的30个收音机/复选框复制以前的代码,还是有一种更简单的方法,可以将所有收音机/复选框放在一起?

  4. 因为我刚开始学习PHP,所以我非常感谢你。

编辑DEMO ADDED点击 “公司账户” 来查看表单。

+1

你应该几乎从不存储多值在一列中。一个例外是将二进制值组合为一个整数,甚至只适用于特定的系统。 – dqhendricks 2012-03-15 22:03:18

回答

1

嗯,这将有助于Q.3至少

foreach(array('buss_type','anotherfield','anotherfield','...etc') as $index) 
{ 
    if (isset($this->request->post[$index])) { $this->data[$index] = $this->request->post[$index]; } else { $this->data[$index] = NULL; } 
} 
+0

用这个答案,你将不得不编辑数组和html,任何时候其中一个字段改变。更何况你的代码中会有一个很长的丑陋的数组。看到我的答案是不同的。创建阵列客户端。 – dqhendricks 2012-03-15 22:10:51

+1

有一件事我会关心他如何从数据中构建数据库查询,也就是说,您是否需要在请求中使用name =“check [id]”来解释某人,并干扰不属于复选框设置?我的方法会创建一个白色的字段列表来使用。是的,你是对的,复选框名称管理名单的双倍将被创建 – Scuzzy 2012-03-15 22:16:02

+0

非常感谢您的答案。这是我正在寻找的代码。 @dqhendricks我也喜欢你的建议,但我曾被推荐过,但我从未理解我如何精确编码它。再一次,所有的值都必须到数据库中的唯一列,所以如果例如我检查[某事],我该如何命名该字段的表列?我会在一分钟内添加一个表单的演示,以便大家可以看看它。谢谢。 – codekmarv 2012-03-15 22:49:24

1

听起来像是你需要一个查询生成器。下面是我的一个例子

$guide=array(
"active"=>"Active Properties", 
"incomplete"=>"Incomplete Properties", 
"default"=>"Default (Borders and Headers) ", 
"links"=>"Link Color", 
"background"=>"Background Color", 
"navcolor"=>"Navigation Color"); 

$s="UPDATE dashboard_layout SET "; 
$c=""; 
$vs=""; 
foreach($guide as $k=>$v){ 
$s.="`$k` = \"".mysql_real_escape_string($_POST[$k])."\"".($k=="navcolor"?"":",")." "; 
$c.="`$k`".($k=="navcolor"?"":","); 
$vs.='"'.mysql_real_escape_string($_POST[$k]).'"'.($k=="navcolor"?"":","); 
} 
$n="INSERT INTO dashboard_layout ($c,lender_id) VALUES ($vs,$company)"; 
$s.="WHERE lender_id='$company'"; 
$sql=($editmode?$s:$n); 
$db->run($sql); 

请记住,您仍然可以对对象使用foreach。我推荐使用指南

+0

谢谢,但我实际上不明白这可以如何帮助我。我想我太抽象了:( – codekmarv 2012-03-15 22:50:07

1

如果你把所有的复选框都设为相同,你可以简单地将它们作为你html表单中的一个数组。

<input name="check[footype]" type="checkbox" value="1" /> 
<input name="check[bartype]" type="checkbox" value="baz" /> 

然后只是循环通过它们服务器端。

foreach ($_POST['check'] as $key => $value) { 
    // repeated logic here 

} 

基本上在你的表单这种方式命名输入,你正在$_POST['check']包含了所有的校验值的服务器端,你可以循环遍历数组。

+1

)他是对的,你必须记住用户的数据不可信,用户可以使用任何数组键来排除阵列中的任何数据 – dqhendricks 2012-03-15 22:47:45

1

增加dqhendricks回答,如果你是通过一个框架构建自己的查询,并没有,这可能会帮助你(我还没有尝试过,但!):

$values = array(); 
foreach ($_POST['check'] as $key => $value) { 
    // I advise you to use either PDO or mysqli but to simplify: 
    $values = "'" . mysql_real_escape_string($value) . "'"; 
} 

// all values will be separated by a comma 
$values_list = implode(',', $values); 

$query = "insert into table_name values ($values_list)"; 
+0

但是... isn不建议不要将所有值存储在单个列中? – codekmarv 2012-03-15 23:01:41

相关问题