2013-05-31 96 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