2013-05-31 56 views
1

任何人都可以看到下面的代码有什么问题吗?带有多个索引变量的PHP foreach循环

我正试图从窗体的2个数组执行一个foreach循环。

表格代号:

<td> 
<input type="checkbox" name="PR[]" value="DP01">Version 1 Daypack - $55.00<br/> 
<input type="checkbox" name="PR[]" value="DP02">Version 2 Daypack - $30.00<br/> 
</td> 
<td> 
<input type="text" name="QTY[]" size = "2"/><br/> 
<input type="text" name="QTY[]" size="2"/><br/> 
</td> 

PHP代码:

if(!empty($_POST['PR'])) 
{ 
    foreach (array_combine($_POST['PR'], $_POST['QTY']) as $PRS => $QTYS) 
    { 
      $sql="INSERT INTO ORDER_TBL (TRANSACTION_ID, CUSTOMER_ID, PRODUCT_ID, QUANTITY) 
      VALUES ('','$_SESSION[user]','$PRS,'$QTYS)"; 

     if (!mysqli_query($con,$sql)) 
     { 
      die('Error: ' . mysqli_error($con)); 
      exit; 
     } 
    } 
} 
+1

安全提示:转义所有用户输入。阅读关于sql注入。 –

+0

是否在其他地方定义了$ TGS?这可能会导致Product_Id的nul值。这有什么问题 - 输出如何与预期不同?错误代码? - 也是SQL错误 - '$ TGS',$ QTYS应该是'$ TGS','$ QTYS' –

+0

您没有执行查询。如果你还没有使用密钥,使用array_combine有什么意义? – jah

回答

1

这种方式是不是真的很好的。如果文本框为空或者包含内容,它们将被张贴无关,而复选框仅在被选中时发布。这将导致数组的长度不同,array_combine将失败。

执行print_r($ _ POST),您将看到发布了哪些输入。

而这甚至不考虑这将造成的安全噩梦。

+0

如果我们不担心安全问题或错误处理,它会在输入正确时仍然运行? – cs91

+0

@ cs91问题是如果其中一个复选框没有被选中,它就不会被发送,然后你的array_combine将失败。 – jah

+0

@ cs91您需要检查array_combine的两个框才能失败,但是如果两个框都选中,它应该通过并创建sql。测试运行生成的查询以查看与数据库配合是否正确 – Sondre