0

大家好,我需要以下代码的帮助。

我正在建立一个客户管理系统。我在这里尝试的是更新 ORDERS 表的多行 => 一键提交多行。在此页面之前,我有另一个页面,我的表单中有输入:

<input type="text" name="qty[]" value="<?php echo $row["qty"]; ?>" />
<input type="text" name="desc[]" value="<?php echo $row["desc"]; ?>" />
<input type="text" name="price[]"value="<?php echo $row["price"]; ?>" />

提交表单后,它将转到下一页:

  <?php
    if(isset($_POST["submit"])){


        $qty    =  $_POST['qty'];
        $desc   = $_POST['desc'];
        $price  = $_POST['price'];
        $order  = $_POST['order'];
        $customer   = $_POST['customer'];

    $i = 0;
    $count = count($qty);

    for($i=0; $i < $count; $i++){
        $qty      = $qty[$i];
        $desc     = $desc[$i];
        $price    = $price[$i];


        $update = mysql_query("UPDATE `orders` SET `qty` = '".$qty."', `desc` = '".$desc."', `price` = '".$price."' WHERE `order_id` = '".$order."' ");
    }

?>

这段代码有时看起来像更新,而不是,当我更新多行时,我也收到此代码的此错误。

Notice: Uninitialized string offset: 1 in

请大家帮忙解决这个问题。

感谢艾迪

4

5 回答 5

1

您已经覆盖了变量,例如$qty.

尝试这个:

$qty    = $_POST['qty'];
$desc   = $_POST['desc'];
$price  = $_POST['price'];
$order  = $_POST['order'];
$customer   = $_POST['customer'];

$count = count($qty);

for($i = 0; $i < $count; $i++){
    $qty1      = $qty[$i];
    $desc1     = $desc[$i];
    $price1    = $price[$i];

    $update = mysql_query("UPDATE `orders` SET `qty` = '{$qty1}', `desc` = '{$desc1}', `price` = '{$price1}' WHERE `order_id` = '{$order}';");
}

** 我建议使用MySQLiPDO扩展而不是MySQL.

升级版:

您的$qty, $desc&$price可能有不同的长度。我建议你,像这样修改循环:

$sql = "UPDATE `orders` SET `qty` = '{$qty1}', `desc` = '{$desc1}', `price` = '{$price1}' WHERE `order_id` = '{$order}';";

$update = mysql_query($sql);

if(mysql_errno())echo PHP_EOL, mysql_error();

它可能会帮助您获取 MySQL 错误。

于 2013-04-15T10:12:25.227 回答
0

您不能确保所有三个数组都具有相同的长度。如果不插入价格或描述,则该项目不会随请求一起发送(浏览器仅发送非空值)。

您应该重新处理 HTML 输出并设置一个包含多个以键命名的列的数组,这样您只需要遍历一个数组,而不是三个。

一个例子是:

<input type="text" name="product[0][qty]" value="QTY_1" />
<input type="text" name="product[0][desc]" value="DESC_1" />
<input type="text" name="product[0][price]"value="PRICE_1" />

<input type="text" name="product[1][qty]" value="QTY_2" />
<input type="text" name="product[1][desc]" value="DESC_2" />
<input type="text" name="product[1][price]"value="PRICE_2" />

遍历 products 数组foreach并检查是否设置了列:

foreach( $_POST['product'] as $inputRow )
{
    if( !isset( $inputRow['qty'] ) || !isset( $inputRow['desc'] ) || !isset( $inputRow['price'] ) )
    {
        echo 'Some input is missing; can\'t store to database';
        continue;
    }

    /* insert to DB here, but please use prepared statement or at least escape the user inputs properly! */
}
于 2013-04-15T10:18:52.583 回答
0

检查值是否设置..并使用mysqli or PDO而不是mysql避免sql注入

for($i=0; $i < $count; $i++){

    $qty_val      = isset($qty[$i])?$qty[$i]:'';
    $desc_val     = isset($desc[$i])?$desc[$i]:'';
    $price_val    = isset($price[$i])?$price[$i]:'';


    $update = mysql_query("UPDATE `orders` SET `qty` = '".$qty_val."', `desc` = '".$desc_val."', `price` = '".$price_val."' WHERE `order_id` = '".$order."' ");
}
于 2013-04-15T10:08:30.977 回答
0

使用 foreach 而不是 for,但我们假设您的数组保持同步索引:

 foreach ($qty as $index => $quantity_entry){
    $update = mysql_query("UPDATE `orders` SET
              `qty` = '" . mysql_real_escape_string($quantity_entry) . "',
              `desc` = '" . mysql_real_escape_string($desc[$index]) . "',
              `price` = '" . mysql_real_escape_string($price[$index]) . "'
               WHERE `order_id` = '" . mysql_real_escape_string($order) . "' ");
}

这样你就不必担心不存在的索引...... PS:注意 mysql 转义 - 你永远不应该跳过!

于 2013-04-15T10:10:26.487 回答
0

您在每次迭代中都覆盖了 $qty、$desc 和 $price 变量,因此它们只会在第一个迭代中起作用

    $qty    =  $_POST['qty'];
    $desc   = $_POST['desc'];
    $price  = $_POST['price'];
    $order  = $_POST['order'];
    $customer   = $_POST['customer'];

$i = 0;
$count = count($qty);

for($i=0; $i < $count; $i++){
    $currentQty      = mysql_real_escape_string($qty[$i]);
    $currentDesc     = mysql_real_escape_string($desc[$i]);
    $currentPrice    = mysql_real_escape_string($price[$i]);


    $update = mysql_query("UPDATE `orders` SET `qty` = '".$currentQty."', `desc` = '".$currentDesc."', `price` = '".$currentPrice."' WHERE `order_id` = '".$order."' ");
}

无论如何,该代码中有很多错误。您应该在将条目发送到 mysql 之前对其进行过滤或转义,并且您的所有订单项目将具有相同的数量、说明和价格,因为您不断地使用相同的 order_id 覆盖数据。

于 2013-04-15T10:14:26.863 回答