【问题标题】:Stop Form Values From Inserting Into MySQL Database Twice阻止表单值两次插入 MySQL 数据库
【发布时间】:2014-01-03 01:48:40
【问题描述】:

我有 form 在提交后将输入数据和文件位置插入 MySQL 数据库。该脚本成功保存了数据和文件,但它保存了所有内容两次。我知道这与在 for 语句中包含 foreach 语句有关,但我不知道如何重新安排或重写我的代码以使其完成我想要的。

我希望它做它现在正在做的事情,将数据插入数据库,但我希望它插入每个值一次。

<label>Length</label><input type="text" name="length[]" value="<?php echo   $sav['length']; ?>" size="2">
            <label>Width</label><input type="text" name="width[]" value="<?php echo $sav['width']; ?>" size="2">
            <label>Color</label><input type="text" name="color[]" value="<?php echo $sav['color']; ?>" size="4">
            <label>Quantity</label><input type="text" name="quantity[]" value="<?php echo $sav['quantity']; ?>" size="2">
            <label>Invoice Is Hidden</label><input type="hidden" name="invoice[]" value="<?php echo $invoice_no; ?>">
            <input type="hidden" name="price[]" value="<?php echo $sav['price']; ?>" />
            <input type="hidden" name="PaymentStatus[]" value="PAID">
            <input type="hidden" name="MAX_FILE_SIZE[]" value="2000000" />
            <input type="file" name="newImage[]">

PHP 脚本

我知道mysql_* 是已弃用的函数,应替换为MySQLiPDO 方法

<?php
require("addrow_info.php");

for($i=0;$i<count($_POST['length']);$i++) {
$newOrder = array(
    'length' => $_POST['length'][$i],
    'width' => $_POST['width'][$i],
    'color' => $_POST['color'][$i],
    'quantity' => $_POST['quantity'][$i],
    'price' => $_POST['price'][$i],
    'invoice' => $_POST['invoice'][$i],
    'paymentStatus' => $_POST['PaymentStatus'][$i],
    );

    // Opens a connection to a MySQL server
    $connection=mysql_connect ("localhost", $username, $password);
    if (!$connection) {
        die('Not connected : ' . mysql_error());
    }

    // Set the active MySQL database
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
        die ('Can\'t use db : ' . mysql_error());
    }

    foreach ($_FILES['newImage']['error'] as $key => $error) {
        if ($error == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES['newImage']['tmp_name'][$key];
            $imageName = $_FILES['newImage']['name'][$key];
            move_uploaded_file($tmp_name, "decalImages/newOrders/$imageName");

            $uploadDir = 'decalImages/newOrders/';

            // Insert new row with user data
            $query = "INSERT INTO orders (PaymentStatus, invoice_no, length, width, color,  quantity, price, imagePath, orderStatus ) VALUES ('".$newOrder['paymentStatus']."','".$newOrder['invoice']."','".$newOrder['length']."', '".$newOrder['width']."', '".$newOrder['color']."', '".$newOrder['quantity']."', '".$newOrder['price']."', '".$uploadDir."".$imageName."', 'PENDING')";

            $result = mysql_query($query);

            if (!$result) {
                die('Invalid query: ' . mysql_error());
                echo "$query";
                mysql_close();
            }
        }
    }
}


?>

如何修复我的代码,使其仅将值插入数据库一次?

【问题讨论】:

  • 你从哪里得到的 $_POST['length'] 值?
  • 查看您的网络服务器访问日志 - 脚本是否被调用了两次?如果有类似从 http 到 https 的重写,或者带有空的 src= 属性的 &lt;img&gt;,导致在 &lt;img&gt; 标记中使用相同的 URI,或者 CSS @987654332 的类似问题,通常会发生这种情况@。都很难发现,但很常见。
  • "除了它将所有内容保存两次" --- 这可能是因为您的查询在 foreach 循环内。试着把它拿出来,看看能不能解决问题。你在那个循环中也有很多东西。
  • 它没有被调用两次,因为我删除了将 $_FILES 保存到目录的代码部分,并且它保存了所有值一次。 @Rottingham 该值来自form
  • 我觉得这是你的循环之一。用一条记录转储循环和单元测试,然后以任一顺序缓慢添加循环和/或数据,或者如果仍然无法揭示问题,则同时添加。相信我,这是您的视图(表单)、您的数据模型或您的控制器……我完全怀疑它是数据库。

标签: php mysql sql database forms


【解决方案1】:

几个cmets有正确的想法。您正在循环遍历可以达到与记录数相同长度的文件数,因此您在查询中输入每个文件的单个记录,最多记录数,这样您最多可以最终总是输入 x^2 条记录。

尝试转储内部循环,并使用原始计数器作为位置标记,因为每个记录只有一个文件...您的下一个挑战是确保中间的 if 记录没有文件,但之后的文件,该文件被附加到正确的记录。这是为了磨合你的托盘:

$tmp_name = $_FILES['newImage']['tmp_name'][$i];
$imageName = $_FILES['newImage']['name'][$i];
move_uploaded_file($tmp_name, "decalImages/newOrders/$imageName");

$uploadDir = 'decalImages/newOrders/';

// Insert new row with user data
$query = "INSERT INTO orders (PaymentStatus, invoice_no, length, width, color, quantity, price, imagePath, orderStatus ) VALUES ('".$newOrder['paymentStatus']."','".$newOrder['invoice']."','".$newOrder['length']."', '".$newOrder['width']."', '".$newOrder['color']."', '".$newOrder['quantity']."', '".$newOrder['price']."', '".$uploadDir."".$imageName."', 'PENDING')";

$result = mysql_query($query);

if (!$result) {
die('Invalid query: ' . mysql_error());
echo "$query";
mysql_close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2015-11-26
    • 2014-06-21
    相关资源
    最近更新 更多