2013-02-17 133 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’]”你在你的代码中使用它之前(例如验证它包含了一些预期的范围)。