【问题标题】:Duplicate sets of records in MySQL table on INSERT INTO using foreach loop使用foreach循环在INSERT INTO上的MySQL表中重复记录集
【发布时间】:2018-07-06 19:11:13
【问题描述】:

我无法弄清楚为什么 foreach 循环的迭代次数超过了元素的计数。

该函数传递两个关联数组:表单数据和特许经营数据。表单数据元素被转换为变量。我想遍历特许经营数组(未知长度)并为每个唯一特许经营 ID 插入表单数据。每条记录将包含相同的表单数据(来自用户),但特许经营商 ID、特许经营商 ID 和特许经营名称字段的数据不同。

发生的情况是,如果选择了一个特许经营权,则会插入两条相同的记录。如果两个,则总共插入四个(两个的重复集)。但是,如果选择了三个,它将插入九行(三个选项中的三组)。这,尽管数组计数为 3。

我修改了无数次代码都没有成功。

函数如下:

public static function setLeadData($franchises, $formData)
{

    $first_name    = $formData[0]['value'];
    $last_name     = $formData[1]['value'];
    $telephone     = $formData[2]['value'];
    $email         = $formData[3]['value'];
    $zipcode       = $formData[4]['value'];
    $networth      = $formData[5]['value'];
    $liquidcapital = $formData[6]['value'];
    $message       = $formData[7]['value'];

    try
    {
        $db = static::getDB();

        $sql = "INSERT INTO leads_franchises SET
                franchise_id    = :franchise_id,
                franchisor_id   = :franchisor_id,
                franchise_name  = :franchise_name,
                first_name      = :first_name,
                last_name       = :last_name,
                telephone       = :telephone,
                email           = :email,
                zipcode         = :zipcode,
                networth        = :networth,
                liquidcapital   = :liquidcapital,
                message         = :message";
        $stmt = $db->prepare($sql);

        foreach($franchises as $franchise)
        {
            $parameters = [
                ':franchise_id'   => $franchise['franchise_id'],
                ':franchisor_id'  => $franchise['franchisor_id'],
                ':franchise_name' => $franchise['franchise_name'],
                ':first_name'     => $first_name,
                ':last_name'      => $last_name,
                ':telephone'      => $telephone,
                ':email'          => $email,
                ':zipcode'        => $zipcode,
                ':networth'       => $networth,
                ':liquidcapital'  => $liquidcapital,
                ':message'        => $message
            ];

            $result = $stmt->execute($parameters);
        }

        return $result;
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
        exit();
    }
}

这是具有三个选择的特许经营权[]:

[0] => Array
    (
        [franchise_id] => 2
        [franchisor_id] => 3
        [franchise_name] => Franchise One
        [logo] => image2.jpg
        [logo_thumb] => thumb_image2.jpg
        [min_capital] => 200000
        [description] => description
        [website] => example2.com
        [inquiry_email] => info@gmail.com
        [created_at] => 2018-01-17 13:05:51
        [updated_at] => 2018-01-25 17:09:51
    )

[1] => Array
    (
        [franchise_id] => 3
        [franchisor_id] => 3
        [franchise_name] => Franchise Two
        [logo] => image3.jpg
        [logo_thumb] => thumb_image3.jpg
        [min_capital] => 100000
        [description] => description
        [website] => example3.com
        [inquiry_email] => info@gmail.com
        [created_at] => 2018-01-21 18:03:39
        [updated_at] => 2018-01-25 17:10:02
    )

[2] => Array
    (
        [franchise_id] => 4
        [franchisor_id] => 3
        [franchise_name] => Franchise Three
        [logo] => image4.jpg
        [logo_thumb] => thumb_image4.jpg
        [min_capital] => 100000
        [description] => description
        [website] => example4.com
        [inquiry_email] => info@gmail.com
        [created_at] => 2018-01-25 10:25:52
        [updated_at] => 2018-01-25 17:58:08
    )

如果有人能在代码或方法中看到我的错误,我将不胜感激。

【问题讨论】:

  • 会的。谢谢!
  • @tyro 不幸的是,我无法解释此链接中的代码并将其应用于我的情况。希望有更直接的方法。

标签: php mysql arrays foreach


【解决方案1】:

添加:

 $stmt->reset();

在这一行之后循环结束:

$result = $stmt->execute($parameters);

【讨论】:

  • 尝试将此作为循环中的第一行 $stmt = $db->prepare($sql);如果它不起作用,请尝试使用 close() 而不是 reset。
  • 谢谢!将$stmt = $db->prepare($sql); 带入foreach 循环会产生相同的重复。在 foreach 循环闭合花括号之前使用 $stmt->reset();$stmt->close(); 引发错误。
  • 引发 500 内部错误 jquery-3.2.1.min.js:4 POST http://localhost/contact-franchisor 500 (Internal Server Error。我将结果回显到 console.log,因为它以 Ajax 请求开始。我现在正在测试没有占位符的插入,将所有内容都放在 foreach 循环中。它抛出了一个错误,这似乎是不可能的,所以我正在寻找错误。
【解决方案2】:

我无法从问题中看出 OP 是在询问 500 错误还是重复行。如果是重复行,我必须问“franchisor_id 是您主键的唯一组成部分,还是您有可能包含其他字段(例如 franchisor_id)的复合主键?”。如果是 500 错误,我会说远离“INSERT INTO tablename SET”。我不知道您使用的是什么版本的 MySQL,但“SET”更适合 UPDATE 语句。 INSERT 应该有“INSERT INTO tablename (col1, col2, col3) VALUES (int_1, 'char2' 'varchar3') 或类似的东西。你需要使用'?'值的占位符或绑定一些变量以使用。请参阅https://www.w3schools.com/php/php_mysql_prepared_statements.asp

【讨论】:

  • 答案是here。错误出现在 Ajax 请求中。问题的更新部分中的有用链接对此进行了解释。
  • 哦。你没有发布 Ajax 部分(或者我没有看到它),所以这会很有帮助。
猜你喜欢
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 2018-11-27
相关资源
最近更新 更多