Podwójna pętla przy wyciąganiu danych

0

Witam,
Mam tabele users w ktorej sa 2 przykladowe rekordy i tabele mailing w ktorej sa 2 przykladowe mailingi. Chce wyciagnac te rekordy i wstawic je do kolejnej tabeli(users_mailing) tak aby kazdy user mial przypisane do siebie wszystkie mailingi, np:
id_mailing, id_user
1 1
1 2
2 1
2 2

Napisany przeze mnie kod wykonuje sie tylko dla pierwszego mailinga, do tabeli users_mailing wstawia:
id_mailing, id_user
1 1
1 2

Oto mój kod:

$users = $conn->query("SELECT * FROM users");
$mailing = $conn->query("SELECT *  FROM mailing");

	while($row = $users->fetch_assoc()) {
		while($row2 = $mailing->fetch_assoc()) {
			
			$sql = "INSERT INTO mailing_list (mailing_id, users_id,token) VALUES (".$row["users_id"].", ".$row2["mailing_id"].", '".uniqid()."')";

			if ($conn->query($sql) === TRUE) {
				echo "<br>Uzupelniono tabele mailing_list dla ".$row["users_id"];
			}
			
			else {
				echo "Coś poszło nie tak.";
			}			
		}
}

Gdzie popełniam błąd? Jak można to napisać w inny sposób?

1

Dla INSERT nie rób metody query tylko exec - to może być przyczyną, tak na szybko patrząc. Po drugie lepiej używać prepared statement na PDO niż wstawiać parametry bezpośrednio.

0

Niestety po zmianie metod na exec() kod nadal wykonuje się tak samo. Może trzeba inaczej podejść do pętli? hmmm :/

0

Zamieniłem while na for:

$users = $conn->query("SELECT users_id FROM users");
$mailing = $conn->query("SELECT mailing_id FROM mailing");

 for($j=1; $row2 = $mailing->fetch_assoc(); $j++){	
	 for($i=1; $row = $users->fetch_assoc(); $i++){	
	
		$sql = "INSERT INTO mailing_list (mailing_id, users_id,token) VALUES (".$row2['mailing_id'].",".$row['users_id'].", '".uniqid()."')";

		$conn->exec($sql);
	}
}

I z tego co zauważyłem wykonuje się tylko ta wewnętrzna pętla. Wie ktoś może dlaczego?

0

@Marcin.Miga: no właśnie próbowałem te 2 zapytania połączyć przez UNION ale wyświetla mi tylko wyniki 1 zapytania z dwóch(zapytania stojącego przed UNION) :/

1

Nie przez UNION, tylko kartezjański...

$sql = $conn->query("SELECT users_id, mailing_id FROM users, mailing");
while($row = $sql->fetch_assoc())
{
...
}
0

@Marcin.Miga: Dziękuję bardzo! Dokładnie o takie coś chodziło!!! :)

0

ciekawe w jaki sposób były wykonywane te zapytania i czy ta metoda dopuszczała kilka resultsetów jednocześnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1