Podwójna pętla przy wyciąganiu danych

Podwójna pętla przy wyciąganiu danych
T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
  • Postów: 108
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:

Kopiuj
$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?

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: 700m n.p.m.
  • Postów: 681
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.

T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
  • Postów: 108
0

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

T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
  • Postów: 108
0

Zamieniłem while na for:

Kopiuj
$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?

T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
  • Postów: 108
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) :/

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
1

Nie przez UNION, tylko kartezjański...

Kopiuj
$sql = $conn->query("SELECT users_id, mailing_id FROM users, mailing");
while($row = $sql->fetch_assoc())
{
...
}
T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
  • Postów: 108
0

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

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1801
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.