Как вставить второй запрос foreach внутри запроса foreach?

Я пытаюсь вставить случайные данные с помощью php в базу данных ipromapp, которую я создал (mysql) с помощью Faker, которую я импортировал с помощью композитора (он работает нормально).

Установил соединение - работает.

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

создал класс Bank и метод randomize() - внутри у меня есть этот код, который работает не совсем корректно. Он создает 5 пользователей (поэтому первый запрос работает правильно) - второй запрос, который я сделал внутри другого foreach (мне нужно случайное количество транзакций, поэтому я не могу использовать диапазон от первого foreach - от 1 до 5).

Я правильно проиндексировал и создал связь с user_id из таблицы transaction в 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 - так что-то работает, но я предполагаю, что запрос или логика неверны - если кто-то может указать мне на проблему, если он видел что-то конкретное?

SS из вывода phpMyAdmin после запуска файла php: // вывод в браузере (я использую MAMP и только что запустил localhost) http://prntscr.com/mdxe4l

// 5 сгенерированных пользователей http://prntscr.com/mdxee9

// По какой-то причине, когда я запускаю скрипт в первый раз, он генерирует 2 для первого идентификатора http://prntscr.com/mdxgc3

Вы можете попробовать повторить каждый оператор SQL и убедиться, что они хорошо выглядят и работают при ручном запуске.

Dan 29.01.2019 22:06

Хм хорошая идея на самом деле! Первоначально я хотел отладить код и просмотреть его построчно, но у меня возникли проблемы с установкой/настройкой xdebug...

Pr0metheus 29.01.2019 22:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во втором цикле foreach вы используете $connection->insert_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}')
        ");
}

превосходно! Я приветствую вас! Спасибо за помощь дружище :)

Pr0metheus 29.01.2019 21:47

Другие вопросы по теме