尝试插入来自动态生成的表单的信息时,我遇到了一个问题。 表单由可变数量的输入组成,所有输入都由四个输入元素组成。请参阅下面的表单生成方式:
<?php $result = mysql_query("SELECT id,name,description FROM todo_q WHERE todo_id = $todo_id AND active = 'y'");
while($todo_q=mysql_fetch_array($result)){
echo '<label>';
echo $todo_q['name'];
echo '</label><br>';
echo '<input type="checkbox" name="value[]" value="y" />';
//echo '<input type="hidden" name="value[]" value="n" />';
echo '<label>';
echo $todo_q['description'];
echo '</label><br>';
echo '<input type="text" id="comment" name="comment[]">';
echo '<input type="hidden" name="user_id[]" value="';
echo $user_id;
echo '" />';
echo '<input type="hidden" name="todo_id[]" value="';
echo $todo_q['id'];
echo '" />';
echo '<HR>';
}?>
这就是我尝试将信息插入mySQL的方式:
$query = "INSERT INTO todo_a (value, comment, user_id, todo_id) VALUES ";
$query_parts = array();
for($x=0; $x<count($_POST["value"]); $x++){
$query_parts[] = "('" . $_POST['value'][$x] . "','" . $_POST['comment'][$x] . "'," . $_POST['user_id'][$x] . "," . $_POST['todo_id'][$x] . ")";
}
$q_parts = $query_parts;
foreach ($q_parts as $q_p){
$insert = ($query .= implode(',', $query_parts));
$result = mysql_query($insert);
}
我遇到的问题是,当检查所有复选框和注释时,所有内容都插入到数据库中的右侧行,但如果我跳过检查一个复选框,那么它就会搞砸......
如果选中复选框和/或输入注释,我希望插入一个新行。 任何人都能指出我正确的方向吗?
我尝试使用隐藏的输入来获取未选中复选框的值,但我似乎无法工作..这就是为什么我已经注释掉隐藏的复选框。
PS。我知道我应该使用mysqli,但这是一个我尚未升级的旧网站..
答案 0 :(得分:1)
您需要在输入复选框和评论名称中添加索引,如:
$cbIndex = 0;
while($todo_q=mysql_fetch_array($result)){
echo '<label>';
echo $todo_q['name'];
echo '</label><br>';
// Generate checkbox with index of current result
echo '<input type="checkbox" name="value[' . $cbIndex . ']" value="y" />';
// Generate comment with index of current result
echo '<input type="text" id="comment" name="comment[' . $cbIndex . ']">';
echo '<input type="hidden" name="user_id[' . $cbIndex . ']" value="';
echo $user_id;
echo '" />';
echo '<input type="hidden" name="todo_id[' . $cbIndex . ']" value="';
echo $todo_q['id'];
echo '" />';
echo '<HR>';
// Inc of index
$cbIndex++;
}
当您提交表单时,只有选中的复选框才会显示在$ _POST [&#34;值&#34;]中:
foreach ($_POST["value"] as $cbIndex => $cbValue) {
$query_parts[] = "('" . $_POST['value'][$cbIndex] . "','" . $_POST['comment'][$cbIndex] . "'," . $_POST['user_id'][$cbIndex] . "," . $_POST['todo_id'][$cbIndex] . ")";
// or
$query_parts[] = "('" . $cbValue . "','" . $_POST['comment'][$cbIndex] . "'," . $_POST['user_id'][$cbIndex] . "," . $_POST['todo_id'][$cbIndex] . ")";
}
...
顺便说一句,您不需要存储复选框的值,这将是&#39; y&#39;一直以来。
信息对于测试应用程序来说没问题,但正如@Pogrindis和@John Conde评论的那样,它不是安全的代码。 MySQLi / PDO + prepare语句将避免SQL注入。