2013-02-17 163 views
0

我有一個奇怪的小問題。PHP繼續導致無限循環

我正在寫一個腳本,將多行插入到MySQL數據庫,怪癖是他們的ID不一定是一個很好的整潔1,2,3集,因爲他們正在編輯。 continue語句必須跳過每一行,因爲它在PHP中超時。這在過去的幾個小時裏一直在努力。有任何想法嗎?

謝謝!

$items = $_POST['invItemQuantity']; 
$i = 1; 
while($i <= $items) { 
    if(!isset($_POST['item'.$i])) continue; 
     //assign posts to variables 
     $date = $_POST["item_date".$i]; 
     $description = $_POST["description".$i]; 
     $price = $_POST["price".$i]; 
     $ID = $_POST["item".$i]; 

     $que = "UPDATE invoice_items SET date='".$date."', description ='".$description."', price ='".$price."' WHERE item_ID=".$ID; 
     $test .= $que."<br>"; 
     $i++; 

} 
+1

考慮在這種情況下使用'for'語句而不是'while'。 'for($ i = 0; $ i <= $ items; $ i ++){...}'即使繼續執行也會增加; – 2013-02-17 01:48:36

回答

4
if(!isset($_POST['item'.$i])) continue; 

你忘了我遞增在這種情況下。修復它:

if(!isset($_POST['item'.$i])) { $i++; continue; } 
+0

好的。 「continue」下面的任何內容都不會運行。 – thordarson 2013-02-17 01:26:55

0

您對此的整個方法是非常奇怪的。我在你的表單中猜測你有item1,item2,item3等。相反,你應該有所有的項目[]來提交它作爲一個數組。對每個item_date,描述和價格都做同樣的事情。然後只需運行:

foreach($_POST['items'] as $i => $item) { 
    if(!empty($item)) { 
     $date = mysql_real_escape_string(trim($_POST['item_date'][$i])); 
     $description = mysql_real_escape_string(trim($_POST['description'][$i])); 
     $price = mysql_real_escape_string(trim($_POST['price'][$i])); 
     $ID = (int)$_POST['item'][$i]; 

     //UPDATE QUERY... 
    } 
} 

另一件事是你永遠不應該採取用戶輸入並直接將其輸入到數據庫中留下您敞開到SQL注入。你應該總是先使用mysql_real_escape_string(對於mysql)來逃避它。更好的是學習MySQLi或PDO。

你也可以看看filter_input,這是確保你的輸入是乾淨的好方法。你永遠不要相信用戶輸入,並且應該總是在可能的情況下根據合適的變量的白名單進行測試。

+0

我有divs包含項目,不一定item1,item2,item3。可能是項目23,項目34,項目16.我想要一種方式來遍歷所有數字,只更新那些張貼的。你能澄清你的意思是什麼項目[]?非常感謝。 – user2036607 2013-02-17 03:11:45

+0

當然,當你發佈數據時,我假設它使用了一個表單和輸入,因此你有名稱爲item1,item2等的輸入。你可以做的是通過改變輸入的名字將它們作爲一個數組提交給items []爲所有的投入。 $ _POST ['items']將會是你可以一個接一個經過的結果數組,並且該數組將只包含發佈的結果。 – Styphon 2013-02-17 10:46:01

+0

非常感謝,我現在就放棄它。 – user2036607 2013-02-18 08:12:19

1

由於無論什麼情況,您都需要遍歷所有項目字段,for循環可能會使忘記增量操作變得更容易。

$items = $_POST['invItemQuantity']; 
for($i=1; $i<=$items; $i++) 
{ 
    if(!isset($_POST['item'.$i])) continue; 

    // ... 
} 

你也可能要執行一些驗證「$ _ POST [‘invItemQuantity’]」你在你的代碼中使用它之前(例如驗證它包含了一些預期的範圍)。