将选中的单选按钮提交到数据库

3

我正在创建一个单选按钮的表单,类似于:

   <dl>  
        <dt><label for="a1">Meatballs?</label></dt>
        <dd>
        <input type="radio" value="yes"  name="A_1">
        </dd>
        <dd>
        <input type="radio" value="no"  name="A_1">
        </dd>
        <dd>
        <input type="radio" value="maybe"  name="A_1">
        </dd>                               
    </dl>

  ... 

<dl>  
    <dt><label for="b3">Coffee?</label></dt>
    <dd>
    <input type="radio" value="yes"  name="B_3">
    </dd>
    <dd>
    <input type="radio" value="no"  name="B_3">
    </dd>
    <dd>
    <input type="radio" value="maybe"  name="B_3">
    </dd>                               
</dl>
<dl>  
    <dt><label for="b4">Tea?</label></dt>
    <dd>
    <input type="radio" value="yes"  name="B_4">
    </dd>
    <dd>
    <input type="radio" value="no"  name="B_4">
    </dd>
    <dd>
    <input type="radio" value="maybe"  name="B_4">
    </dd>                               
</dl>   

我想将这些内容插入到一个类似下面结构的数据库中:
```html

```
INSERT INTO `notes` ( `group`, `data` ) VALUES ...

我正在处理的php文件中设置了一些这些值,例如:

$b = "Choices";

// these would be the groups
$bg3 = "Coffee";
$bg4 = "Tea";


// these are the data values
$bp3 = $_POST['B_3'];
$bp4 = $_POST['B_4'];

$b3 = array( $b, $bg3, $bp3 );
$b4 = array ($b, $bg4, $bp4 );

在我的思考中,如果我需要插入组值,因为已选择第3个选项,我将有$group = $b3[1]; $data = $b3[2]

在我的示例中,将有大约25个选择,最后提交一次。 我需要帮助理解循环遍历所有选中的单选按钮并将其值INSERT到它们需要去的地方的最有效方法是什么?

我需要这些全部取消选择,并且只有在进行选择后才能处理。 我需要为每个单独的选择编写插入语句吗?

更新

由于下面的答案,我现在有了一个更有效的方法将所有值放入数组中,因此使用dqhendricks的示例,我可以为每个集合(a、b等)生成如下数组:

print_r($b);

Array ( [0] => Array ( [0] => Choices [1] => [2] => ) [1] => Array ( [0] => Choices [1] => Milk [2] => ) [2] => Array ( [0] => Choices [1] => Water [2] => yes ) [3] => Array ( [0] => Choices [1] => Coffee [2] => ) [4] => Array ( [0] => Choices [1] => Tea [2] => ) [5] => Array ( [0] => Choices [1] => Beer [2] => ) [6] => Array ( [0] => Choices [1] => Wine [2] => ) ) 

这个数组是从只选中第二个单选按钮生成的。


首先,你发布的数组似乎不完整,这是由于dqhendricks代码的结果。 - StormByte
不太确定你的意思...我正在改变我真实代码中的东西,可能会让它更加混乱。我将示例更改为print_r,使其更易读。 - Zac
重新更新了我的回答,抱歉,我忘记了一些东西(这里是凌晨4:05),希望它能对你有用。 - StormByte
2个回答

1

首先,您可能希望为变量命名更具描述性的名称。现在您知道它们的含义,但一年后可能需要花费一分钟来弄清楚代码。

以下是您可以考虑循环的方式。

$groups = array(
   '3' => 'Coffee',
   '4' => 'Tea'
);

$b = array();

for ($i = 0; $i < $number_of_post_vars; $i++) {
   $b[$i] = array(
      'Choices',
      $groups[$i],
      $_POST['B_' . $i]
   );
}

谢谢您提供这个。看起来是我需要的,但我遇到了一些问题。我添加了这个并尝试了像print_r($b1)echo($b1[1])这样的东西,但什么也没有显示。 - Zac
@Zac $b是一个由数组组成的数组。使用print_r($b[1]); - dqhendricks
那么你没有完全复制上面的内容,或者你从未设置$number_of_post_vars。你明白上面代码中发生了什么吗? - dqhendricks

1

更新:将我的原始解决方案与bqhendrick的解决方案合并,并重构您的原始表单以澄清变量名称并使其更简单。

首先,您应该为单选按钮提供默认值(CHECKED属性),以避免NULL,并正确命名单选输入。不要使用A_1、B_1等名称,而是像它们所指的“组”一样进行命名。例如:

<dl>  
        <dt><label for="a1">Meatballs?</label></dt>
        <dd>
        <input type="radio" value="yes"  name="Meatballs">
        </dd>
        <dd>
        <input type="radio" value="no"  name="Meatballs">
        </dd>
        <dd>
        <input type="radio" value="maybe"  name="Meatballs" CHECKED>
        </dd>                               
    </dl>

  ... 

<dl>  
    <dt><label for="b3">Coffee?</label></dt>
    <dd>
    <input type="radio" value="yes"  name="Coffee">
    </dd>
    <dd>
    <input type="radio" value="no"  name="Coffee">
    </dd>
    <dd>
    <input type="radio" value="maybe"  name="Coffee" CHECKED>
    </dd>                               
</dl>
<dl>  
    <dt><label for="b4">Tea?</label></dt>
    <dd>
    <input type="radio" value="yes"  name="Tea">
    </dd>
    <dd>
    <input type="radio" value="no"  name="Tea">
    </dd>
    <dd>
    <input type="radio" value="maybe"  name="Tea" CHECKED>
    </dd>                               
</dl>

完成这个步骤后,现在只需轻松地使用以下语句来创建插入语句:

$count=count($_POST);
$counter=0;
$query="INSERT INTO `notes` ( `group`, `data` ) VALUES ";
$resource=mysql_connect('host', 'mysql_user', 'mysql_password');
foreach ($_POST AS $key => $value) {
    $key=mysql_real_escape_string($key);
    $value=mysql_real_escape_string($value);
    $query.="('$key', '$value')";
    $query.=($counter<$count-1) ? ", " : ";";
    $counter++; //To know whether to put , or ; in SQL sentence
}
//echo $query; //To test it prior to insert for debugging purposes
mysql_query($query);
mysql_close($resource);

它应该这样做。

编辑以清理一些 $_POST 数据,以避免可能的 SQL 注入。


@Zac 这可能是因为 mysql_real_escape_string 函数导致的,你可以将其移除,但这样会使你的代码容易受到 SQL 注入攻击 :) - StormByte
是的,那就是问题所在。我想我可以让它工作,但我的一些值可能会很长,而且这会抓取我的提交并将其放入字符串中,所以我必须将其从那里取出。这是一个示例(我还没有更改值)。 - Zac
为了避免提交作为选项被提交,您必须省略提交按钮的名称属性,这样它就会在POST中跳过。类似于<input type='submit' value='Submit' /> - StormByte
奇怪...我正在使用相同的方式 <input type='submit' value='提交' /> - Zac
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/8929/discussion-between-stormbyte-and-zac - StormByte
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接