Fehler in der Verschachtelung ?
schubert
- php
0 ChrisB0 Vinzenz Mai0 schubert
Guten Abend,
folgendes soll gemacht werden.
ich habe eine gewisse Anzahl an postleitzahlen (191), jede postleitzahl hat sechs tarifnamen. Nun möchte ich automatisch mittels schleifen jeder plz sechs tarifnamen zuordnen wofür jeder tarifname eine einzelne Zeile bekommt und zwar in eine Tabelle namens plz_anb.
Also die plz 10115 bekommt genau so viele Zeilen wie es tarifname für diese gibt.
10115 tarif 1
10115 tarif 2
10115 tarif 3
usw
Das ganze soll jetzt mit 191 plz passieren, sodass ich am Ende des durchlaufs 191 * 6 Zeilen in plz_anb habe.
Momentan passiert das ganze nur mit der ersten plz, obwohl die Schleife 191 mal durchlaufen wird.
Ich hoffe der Fehler ist nicht zu trivial.
$put = mysql_query("select plz from plz where name='berlin'",$connect);
$puts = mysql_query("select tarifname from tarif where nr < 7",$connect);
while($in = mysql_fetch_assoc($put))
{
foreach($in as $value1)
while($ins = mysql_fetch_assoc($puts))
{
foreach($ins as $value2)
{
$gets = mysql_query("insert into plz_anb values('".$value1."','".$value2."')",$connect);
}
}
}
ich möchte eine Schleife schreiben die so oft durchlafen wird wie $put weiter Werte liefert. Was eigentlich auch klappt.
Wie Ihr sehen könnt lasse ich dann das Array $in mit foreach durchlaufen um an die tatsächlichen Werte zu kommen. Welche ich aber erst in der zweiten while schleife brauche. Hoffe das ist so der richtige Weg.
Als nächstes kommt wieder eine while schleife, Sie macht auch alles wunderbar, nur beim nächsten durchlauf der Haupschleife scheint die zweite while schleifen nicht mehr zu reagieren.
Wo könnten Fehler liegen???
mfg schubert;
Hi,
Als nächstes kommt wieder eine while schleife, Sie macht auch alles wunderbar, nur beim nächsten durchlauf der Haupschleife scheint die zweite while schleifen nicht mehr zu reagieren.
Natuerlich "reagiert" sie nicht mehr, weil du mit mysql_fetch_assoc "am Ende" der Datensaetze, die dir die Zweite Query geliefert hat, angekommen bist - diese Funktion also nachfolgend nur noch false liefert.
Entweder setzt du den "Ergebnis-Zeiger" fuer diese MySQL-Query nach jedem durchlaufen zurueck - das wuerde ich aber nicht empfehlen, weil du damit letztendlich x Mal die Daten vom MySQL-Server holen wuerdest.
Die Daten der zweiten Query erst mal in einem Array abzulegen, und dieses dann wiederholt mittels einer for(each)-Schleife zu durchlaufen, erschiene mir sinnvoller.
MfG ChrisB
Hallo
Die Daten der zweiten Query erst mal in einem Array abzulegen, und dieses dann wiederholt mittels einer for(each)-Schleife zu durchlaufen, erschiene mir sinnvoller.
Erst mal danke für die schnelle Antwort.
O.K. nun möchte ich die Daten in ein array packen, was mir nicht ganz gelingt.
$lut = 1;
while($ins = mysql_fetch_assoc($puts))
{
foreach($ins as $value3){
$tarife = array($lut => $value3);
$lut = $lut +1;}
}
möchte es gern automatisch in ein array laufen lassen da man nicht vorher weiss wieviele tarifnamen es gitb.
mfg schubert;
echo $begrüßung;
Entweder setzt du den "Ergebnis-Zeiger" fuer diese MySQL-Query nach jedem durchlaufen zurueck - das wuerde ich aber nicht empfehlen, weil du damit letztendlich x Mal die Daten vom MySQL-Server holen wuerdest.
Das passiert nicht, denn die Daten liegen seit dem Ausführen von mysql_query() bereits in einem Puffer beim Client. Ein mehrfaches Fetchen greift nur immer wieder auf diesen Puffer zu. Dieser Puffer ermöglicht es überhaupt erst, dass man sich in der Ergebnismenge beliebig bewegen kann.
Ohne diese Pufferung könnte man auch nicht die Querys so verschachtelt absetzen wie es im OP zu sehen ist. Ungepuffert kann pro Verbindung immer nur eine Abfrage ausgeführt werden. Diese muss zuerst leergefetcht werden bevor die nächste starten kann. Bei ungepufferten Querys werden die Daten beim Fetch direkt vom Server geholt, bei Verwendung des Puffers stattdessen aus ebenjenem. Siehe mysql_unbuffered_query().
echo "$verabschiedung $name";
Hallo,
Ich hoffe der Fehler ist nicht zu trivial.
$put = mysql_query("select plz from plz where name='berlin'",$connect);
$puts = mysql_query("select tarifname from tarif where nr < 7",$connect);
while($in = mysql_fetch_assoc($put))
{
foreach($in as $value1)
while($ins = mysql_fetch_assoc($puts))
{
foreach($ins as $value2)
{
$gets = mysql_query("insert into plz_anb values('".$value1."','".$value2."')",$connect);
Wo könnten Fehler liegen???
An dem völlig überflüssigen PHP-Geraffel, das tun soll, was eine einzige schnucklige SQL-Anweisung viel besser kann:
INSERT INTO
plz_anb
SELECT
plz.plz,
tarif.tarifname
FROM
plz, -- ja, ganz bewußt ein Cross-Join
tarif -- es soll ja jedem Datensatz aus
WHERE -- der Tabelle plz, der dem Kriterium
plz.name = 'berlin' -- passender Stadtname erfüllt,
AND -- jeder
tarif.nr < 7 -- gewünschte Tarif zugeordnet werden.
keine verschachtelten Schleifen mit SQL-Statements innerhalb der Schleifen :-)
siehe MySQL-Handbuch, INSERT ... SELECT-Syntax
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
ich hatte mir das fast gedacht dass das funktionieren müsste.
Danke dass du das bestätigt hast.
Aber wahrscheinlich werde ich die Eingaben über eine Maske laufen lassen, weil es schon eine Menge Eingaben werden um immer was dazu kommt.
Vielleicht muss mal jemand anderes die Eingabe übernehmen, da ist das etwas übersichtlicher für den jenigen.
Aber im Grunde hast du Recht.
mfg schubert;