0

我有一个奇怪的小问题。

我正在编写一个将多行插入 MySQL DB 的脚本,奇怪的是它们的 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++; 

} 
4

3 回答 3

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

在这种情况下,您忘记增加 i 。将其修复为:

if(!isset($_POST['item'.$i])) { $i++; continue; }
于 2013-02-17T01:26:13.300 回答
1

由于无论如何您都需要遍历所有项目字段,因此 for 循环可能更容易不要忘记您的增量操作。

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

    // ...
}

您可能还想在代码中使用“$_POST['invItemQuantity']”之前对其进行一些验证(例如,验证它是否包含多个预期范围)。

于 2013-02-17T01:35:59.027 回答
0

你对此的整个方法很奇怪。我猜在你的表单中你有 item1、item2、item3 等。相反,你应该有 items[] 让它们作为数组提交。对每个 item_date、description 和 price 执行相同的操作。然后简单地运行:

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,这是确保您的输入干净的好方法。你永远不应该相信用户输入,如果可能的话,应该始终根据合适的变量白名单对其进行测试。

于 2013-02-17T01:35:51.000 回答