首页 > 解决方案 > 如何在 foreach 查询中插入第二个 foreach 查询?

问题描述

我正在尝试在我在 Faker 的帮助下创建的 ipromapp 数据库(mysql)中使用 php 插入随机数据 - 我使用 composer 导入了该数据库(它工作正常)。

我建立了连接 - 它正在工作。

$connection = mysqli_connect('localhost','root','root', 'ipromapp');

创建了类 Bank 和一个方法 randomize() - 在里面我有这个不能完全正常工作的代码。它创建了 5 个用户(因此第一个查询工作正常) - 我在另一个 foreach 中进行的第二个查询(我需要随机数量的事务,所以我不能使用第一个 foreach 的范围 - 1 到 5)。

我已经正确索引并创建了与表的user_idtransaction表到id(主键)的关系user(ss: http: //prntscr.com/mdxfs1

我尝试编辑查询,更改第二个 foreach 的范围 - 我有一些小的“灯泡”时刻,但我很难将它们转换为代码。

    function randomize()
    {
        // accessing variables outside the function
        global $faker, $connection;
        $insertNum = 0;
        // deleting users so that we have only 5 we want
        $connection->query("TRUNCATE TABLE `users`");
        $connection->query("TRUNCATE TABLE `transactions`");


        // adding 5 people into the users db
        foreach (range(1,5) as $x){
            $body = $faker->firstName($gender = null) . ' ' . $faker->lastName;
            $connection->query("
                INSERT INTO users (name, birth_date)
                VALUES ('{$body}', '{$faker->date($format = 'Y-m-d', $max = '-10 years')}')
            ");
            printf ("New Record has id %d.\n", $connection->insert_id);

            // random number of transactions

            $randomNum = rand(20,40);
            $insertNum += $randomNum;
            printf ( "Random number is %d.<br>", $randomNum);
            // adding random number of transactions from past 6 months
            foreach (range(1, $insertNum) as $y) {
                $connection->query("
INSERT INTO transactions (user_id, date, deposit, withdraw)
VALUES ('{$connection->insert_id}','{$faker->date( $format = 'Y-m-d', $max  = 'now')}', '{$faker->randomDigit}', '{$faker->randomDigit}')
                    ");
            }
        }
    }

我预计查询会从每个用户产生 20-40 个事务。我认为与id有关?查询仅生成 1 - 所以有些东西正在工作,但我猜查询或逻辑不正确 - 如果有人能指出我的问题,如果他看到任何特别的东西?

运行 php 文件后来自 phpMyAdmin 输出的 SS:// 在浏览器中输出(我使用 MAMP 并且刚刚运行 localhost) http://prntscr.com/mdxe4l

// 5 个生成的用户 http://prntscr.com/mdxee9

// 出于某种原因,我第一次运行脚本时,它会为第一个 ID http://prntscr.com/mdxgc3生成 2

标签: phpmysqlforeach

解决方案


在您的第二个foreach循环中,您$connection->insert_id用于获取用户的 ID,但发生的情况是,在第一个循环之后,它正在获取刚刚插入的该事务的 ID,并且可能会引发未显示的错误。

您可以做的是在循环之前将用户的 ID 分配给一个变量:

$userId = $connection->insert_id;
foreach (range(1, $insertNum) as $y) {
    $connection->query("
INSERT INTO transactions (user_id, date, deposit, withdraw)
VALUES ('{$userId}','{$faker->date( $format = 'Y-m-d', $max  = 'now')}', '{$faker->randomDigit}', '{$faker->randomDigit}')
        ");
}

推荐阅读