Вложенные циклы while для извлечения данных БД в php

#php #database #api #soap

Вопрос:

 $sql = "SELECT * FROM mytable";
$Source = $conn->query($sql);
$Target= $Tconn->query($sql);
if ($Source->num_rows > 0) {
 while($s_row = $Source->fetch_assoc()) {
     while($t_row= $Target->fetch_assoc()) {
        echo $s_row["id"]."<br>";
        echo $t_row["id"]."<br>";
        }
    }
    } 
 

Привет,
Я пытаюсь воспроизвести данные таблицы базы данных с 2 разных серверов, используя вложенный цикл while. Я смог подключиться и повторить данные, но результат оказался не таким, как я ожидал. В приведенном выше коде вы можете видеть, что существует 2 цикла while, поэтому для каждого значения первого цикла while должен быть выполнен второй цикл while. Предположим, что $s_row имеет значения [1,2], а $t_row имеет значения [10,20], тогда вывод должен быть
1
10
1
20
2
10
2
20
но в настоящее время я получаю вывод в виде
1
10 1
20. Это означает, что второй цикл while не принимает значение второй строки первого цикла.

Кто-нибудь может мне в этом помочь, спасибо.

Комментарии:

1. Вы пытались запустить каждый while цикл отдельно, чтобы проверить, действительно ли значения [1,2] и [10,20] такие, какими вы их ожидаете? Может s_row быть, значения не [1,2], а просто [1].

Ответ №1:

Как только вы дойдете до конца $Target , все будущие вызовы для извлечения вернутся false , поэтому внутренние циклы не будут выполняться.

Вам нужно вернуться к началу результатов, чтобы обработать их снова.

 if ($Source->num_rows > 0) {
    while($s_row = $Source->fetch_assoc()) {
        $Target->data_seek(0);
        while($t_row= $Target->fetch_assoc()) {
            echo $s_row["id"]."<br>";
            echo $t_row["id"]."<br>";
        }
    }
} 
 

Если не возвращается слишком много данных, было бы более эффективно поместить результаты в список и обработать их.

 if ($Source->num_rows > 0) {
    $Target_data = $Target->fetch_all(MYSQL_ASSOC);
    while($s_row = $Source->fetch_assoc()) {
        foreach ($Target_data as $t_row) {
            echo $s_row["id"]."<br>";
            echo $t_row["id"]."<br>";
        }
    }
} 
 

Комментарии:

1. Спасибо, первое решение работает на меня. со вторым решением программа не попадает в цикл. У меня есть около 30 тысяч записей, которые должны пройти через вышеупомянутый процесс. Является ли решение одним из лучших для такого большого объема данных?

2. Является ли второе решение причиной ошибки из-за количества записей? Тогда первое решение-это путь, по которому нужно идти.

3. Спасибо вам за помощь.