PHP MySql更新多行

时间:2013-04-15 10:04:42

标签: php mysql arrays

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

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

<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

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

由于 来自艾迪

5 个答案:

答案 0 :(得分: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

<强> UPD:

可能有$qty$desc&amp; $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错误。

答案 1 :(得分: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."' ");
}

答案 2 :(得分: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转义 - 你永远不应该跳过它!

答案 3 :(得分: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."' ");
}
$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不断覆盖数据。

答案 4 :(得分: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" />

使用foreach迭代products数组并另外检查列是否已设置:

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! */
}