我尝试传递一个包含其他形式的表单(相同的内部表单,动态),但我检查了发送到'脚本处理程序的数据。 (php)是不完整的数据。我认为某处缓冲区会被覆盖或其他东西。这是代码:
<?php
if(isset($_POST['submit_num']))
{
$number=$_POST['sky'];
if($number== 0)
{
header('Location: /ceid_coffee/user_order_form.php');
}
else
{
$_SESSION['number'] = $number;
echo '<form action="user_order_form.php" method="POST">';
for($i=0;$i<$number;$i++)
{
$item = $_SESSION['item'];
echo $item;
$rec_query = "SELECT * FROM ylika";
$rec_result= mysql_query($rec_query) or die("my eroors");
while($row_rec = mysql_fetch_array($rec_result))
{
echo '<br>';
echo '<input type="checkbox" name="yliko[][$i]" value='.$row_rec['onoma'].'> '.$row_rec['onoma'].'';//<~~~~this line is form's data
}
echo '<br>';
}
echo '<input type="submit" name="submit" value="FINAL_ORDER">';
echo '</form>';
}
}
?>
这是处理脚本:
<?php
if (isset($_POST['submit']))
{
$number= $_SESSION['number'];
$item = $_SESSION['item'];
$max_id = "SELECT MAX(id_order) FROM id_of_orders";
$x=mysql_query($max_id) or die("my eroors");
$id= mysql_fetch_array($x);
$xyz = $id['MAX(id_order)'];
for($i=0;$i<$number;$i++)
{
$temp = $_POST['yliko'][$i]; // <~~~~ this line is the form's data
$temp2 = implode("," , $temp);
$inserts = ("INSERT INTO orders (order_id,product,ulika) VALUES ('$xyz' , '$item','$temp2')");
$inc_prod=("UPDATE proion SET Counter = Counter + 1 WHERE proion.onomasia='$item'");
mysql_query($inserts) or die(mysql_error());
mysql_query($inc_prod) or die(mysql_error());
}
}
?>
这一行包含每个表单的数据,但我有回显它们($ temp2),我看到它们不完整。 $ temp = $ _POST [&#39; yliko&#39;] [$ i];
如果我为每个项目选择了多个复选框($ i),我只从复选框中获取一个值到sql中。 你看我错过了吗?
答案 0 :(得分:1)
好的,我发现错误。我替换了这一行:
echo '<input type="checkbox" name="yliko[][$i]" value='.$row_rec['onoma'].'> '.$row_rec['onoma'].'';//<~~~~this line is form's data
这一行:
echo '<input type="checkbox" name="yliko['.$i.'][]" value='.$row_rec['onoma'].'> '.$row_rec['onoma'].'';
我不知道(我是php的新手),但它有效。
答案 1 :(得分:-1)
每个表单只能获得一个值,因为您要为每个表单分配$ i的值:
echo '<input type="checkbox" name="yliko[][$i]" value='. etc.
是你的问题。
查看代码生成的HTML(在大多数浏览器中使用ctrl-u),您将看到为什么得到错误的答案。您的所有复选框都需要具有唯一的名称。
我会通过为每个复选框指定一个与数据库中的行相关的名称来实现它,例如:
name="checkbox_"'.$row['ylikaprimarykey']."etc.
这样可以让您快速上手。对于它的价值,表键的ID可以为攻击者提供有关您站点的信息,因此最好以某种方式对它们进行模糊处理。网上免费提供一些优秀的课程,可以为您提供。
如果您真的需要处理每个表单中的内容作为单独的数据块,您可以轻松地更改复选框名称:
name="checkbox_$formnumber_$obfuscatedkeynumber"
然后在处理页面中使用嵌套循环遍历它们。