äh, irgendwie versteh ich nicht was du da vorhast. was ist das ziel des ganzen?
zu allererst ein tip der es etwas schlanker und korrekter macht, aber noch nix mit der lösung deines problem zutun hat
du schreibst $e = empty($termin[$k]);
um dann im folgenden if zufragen ob $e == 1 ist also der index ohne inhalt ist
schreibe es bitte wiefolgt: if(empty($termin[$k])
denn empty gibt true (1) zurück und das kannst du direkt in den bedingungsblock setzen.
Die ganze forschleife mit if-abfrage ist total überflüssig. du möchtest damit ja nur verhindern das du keine bestehenden indizeis überschreibst
also den ganzen for-block raus und anstelle dessen einfach nur
$termin[]=$row->termin.$k;
schreiben. Damit wird bei jedem Durchlauf ein neuer index angelegt. in diesem Fall startet er bei 0 wenn er unbedingt,
wofür ich allerdings keinen beweggrund sehe, bei 1 starten soll, kannst du den index 0 vorbelegen beim anlegen deines array
oder durch ein ähnliches konstrukt wie du es schon hast so starten lassen:
if(empty($termin[1]){
$termin[1]=$row->termin;
}else{
$termin[]=$row->termin;
}
somit startet er mit index 1 und zählt dann automatisch hoch.
aber nun nochmal zu deinem eigentlichen problem. was genau soll das endergebnis sein und was macht createentry()
moment, hab das eben nochmal gelesen, seh ich das richtig das du in einem datensatz also einer tabellenzeile mehrere termine hast? wenn ja, wieso dieses? und du möchtest jetzt die einzelnen terminspalten durchlaufen und verwendest deshalb deine schleife?
wenn dem so ist wird es so nicht hinhauen. denn durch die verknüpfung die du machst sucht er bei der werteübergabe nur nach der spalte $row->termine und nicht wie du willst nach $row->termine1
um das hinzubekommen müsstest du es so schreiben:
$spalte = termin.$k;
$termin[$k]=$row->spalte;
um ein dynamisch generiertes attribut auszulesen benötigt er einen komplett fertigen bezeichner als string.
direkt beim ansprechen eines attributs das erst dynamisch zu generieren klappt nicht.
wenn es aber mit den 6 terminen pro datensatz so ist wie ich es oben beschrieben habe würde ich nochmal die dbstrucktur überdenken. denn was ist wenn du nur 2 termine hast oder mal 8 brauchst?
Ergebnis 1 bis 10 von 11
- 18.12.2010, 09:39 #1Ribston Pepping
Themenstarter
- Registriert
- 02.2009
- Ort
- Dortmund
- Alter
- 24
- Beiträge
- 295
[PHP&MYSQL] Daten aus Datenbank mit Schleife auslesen
Ich lese Daten aus einer mySQL Datenbank aus. Es sind Termine zu bestimmten Veranstaltungen. Ich habe etwas daran gearbeitet und habe ein Problem.
Die Funktion createentry() wird mit den entpsrechenden Daten gefüttert. Die Variable $termin soll als Array übergeben werden. Mit einem Testarray klappt alles prima. In meiner Datenbank sind die Termine aber als termin1, termin2, termin3,... gespeichert. Deshalb will ich sie mit einer Schleife in ein Array schreiben. Hier mal mein Code, wie ich es "per Hand gemacht habe":
Das habe ich jetzt geändert zu:Code:$termin[1]=$row->termin1; $termin[2]=$row->termin2; $termin[3]=$row->termin3; $termin[4]=$row->termin4; $termin[5]=$row->termin5; $termin[6]=$row->termin6;
Als Ausgabe erhalte ich aber folgendes:Code:$cname[] = array(); $termin[] = array(); $ergebnis = mysql_query("SELECT * FROM startseite"); while($row = mysql_fetch_object($ergebnis)) { $cname=$row->cname; $campl=$row->cnamel; $preis=$row->preis; for($k=1;$k<6;$k++){ $e=empty($termin[$k]); if($e == "1"){ echo $k; $termin[$k]=$row->termin.$k; } } $alter=$row->alter; createentry($cname,$campl,$termin,$status,$alter,$preis); $j++; }
Array
1
2
3
4
5
"Array" liegt wohl daran, dass das nullte Element ausgelesen wird, oder? Aber da sollten jetzt eigentlich die Werte wie "11.12" oder so stehen. Seht ihr einen Fehler, bzw. ist das Konzept nicht richtig?
- 18.12.2010, 10:16 #2Dülmener Rosenapfel
- Registriert
- 03.2007
- Ort
- Bad Bevensen aka der A**** der Heide
- Alter
- 34
- Beiträge
- 1.666
Geändert von das_micha (18.12.2010 um 10:33 Uhr)
Vollzeitfalschparker....
MacBook late '08 2,0 C2D - 4GB | iMac 27" i5 - 12GB | MacMini 1,83 C2D - 1GB | iPhone 3Gs weiß + iPad 32GB | ATV2
last but not least: good old iPod Shuffle 512MB*g*
- 18.12.2010, 10:31 #3Ribston Pepping
Themenstarter
- Registriert
- 02.2009
- Ort
- Dortmund
- Alter
- 24
- Beiträge
- 295
Ich habe eine Datenbank. In dieser stehen Veranstaltungen mit mehreren Terminen. Also etwa Veranstaltung 1 am 12.1 und 13.4, Veranstaltung 2 am 13.6 und 18.9,... und so weiter.
Diese werden via PHP auf einer Webseite ausgegeben.
createentry($cname,$campl,$termin,$status,$alter,$ preis); Erzeugt eine HTML Tabelle und bekommt Variablen als Parameter übergeben.
Zum Beispiel ist $cname der Name der Veranstaltung. $termin soll aber als Array übergeben werden, da zu einem $cname bis zu sechs
Termine existieren.
Das Problem besteht darin, die sechs Spalten aus meiner Datenbank (termin1,termin2,termin3,...) in ein Array $termin zu schreiben. Dann kann ich dieses übergeben und alles wird gut
- 18.12.2010, 10:35 #4Dülmener Rosenapfel
- Registriert
- 03.2007
- Ort
- Bad Bevensen aka der A**** der Heide
- Alter
- 34
- Beiträge
- 1.666
Vollzeitfalschparker....
MacBook late '08 2,0 C2D - 4GB | iMac 27" i5 - 12GB | MacMini 1,83 C2D - 1GB | iPhone 3Gs weiß + iPad 32GB | ATV2
last but not least: good old iPod Shuffle 512MB*g*
- 18.12.2010, 10:37 #5Ribston Pepping
Themenstarter
- Registriert
- 02.2009
- Ort
- Dortmund
- Alter
- 24
- Beiträge
- 295
Habe ich, wollte nur das Problem erläutern. Die Datenbank habe ich nicht erstellt, ich lese sie nur aus :/
BTW: Kann ich einen Datentyp Arrays in einer DB speichern?
--
EDIT: Ich hatte deinen Originalartikel gelesen, deshalb deine Lösung erst jetzt
- 18.12.2010, 10:40 #6Ribston Pepping
Themenstarter
- Registriert
- 02.2009
- Ort
- Dortmund
- Alter
- 24
- Beiträge
- 295
- 18.12.2010, 10:46 #7Dülmener Rosenapfel
- Registriert
- 03.2007
- Ort
- Bad Bevensen aka der A**** der Heide
- Alter
- 34
- Beiträge
- 1.666
kein problem, hab deine antwort auch erst gelesen als ich mit tippen fertig war

du meinst du willst eine spalte in der db als array deklarieren? ich glaub die möglichkeit bietet mysql nicht.
brauchst du aber auch nicht. du könntest die werte in einem feld zum beispiel mit trennzeichen angeben z.B.
01.01/02.01/03.01 usw und dann diesen string mit explode anhand des trennzeichens (/) in ein array zerlegen da kannst du dann soviele termine wie du willst reinballern.
Ändert aber dennoch nix an der "schlechten" datenbankstruktur. eigentlich arbeitet man in dem fall über verweise. bedeutet du baust dir eine zweite tabelle in der nur die termine drin stehen plus einer spalte in der die id der veranstaltung drinsteht und verknüpfst diese beim auslesen.
hat den vorteil das du durch ein entsprechendes query z.B. abgelaufene Termine garnicht mehr angezeigt bekommst.Vollzeitfalschparker....
MacBook late '08 2,0 C2D - 4GB | iMac 27" i5 - 12GB | MacMini 1,83 C2D - 1GB | iPhone 3Gs weiß + iPad 32GB | ATV2
last but not least: good old iPod Shuffle 512MB*g*
- 18.12.2010, 10:49 #8Ribston Pepping
Themenstarter
- Registriert
- 02.2009
- Ort
- Dortmund
- Alter
- 24
- Beiträge
- 295
Ja stimmt. Das kenn ich noch aus der Uni, aber das lag irgendwo vergraben. Da mussten wir uns immer übertrieben viel mit Zeigern in C++ herumschlagen. Ist ja so ähnlich... Es war ätzend! Und das als Nebenfächler :P
- 18.12.2010, 10:50 #9Dülmener Rosenapfel
- Registriert
- 03.2007
- Ort
- Bad Bevensen aka der A**** der Heide
- Alter
- 34
- Beiträge
- 1.666
ok, dann gehts ja noch. aber wo überprüfst du das? in der ausgabe? denn in deiner schleife prüfst du lediglich ob der index des arrays ohne wert ist.
hehe, nee ganz so dramatisch wie in c ist das nicht
in c greifst du ja auf speicherbereiche wie quasi arrays zu. bei der datenbank bestimmst du quasi alles durch dein query. aber man muss ja nicht mit kanonen auf spatzen schießen und wenn sonst alles läuft alles umzustricken kann nervig sein, grade wenn man noch nicht zu 100% mit vertraut ist. Vollzeitfalschparker....
MacBook late '08 2,0 C2D - 4GB | iMac 27" i5 - 12GB | MacMini 1,83 C2D - 1GB | iPhone 3Gs weiß + iPad 32GB | ATV2
last but not least: good old iPod Shuffle 512MB*g*
- 18.12.2010, 10:56 #10Ribston Pepping
Themenstarter
- Registriert
- 02.2009
- Ort
- Dortmund
- Alter
- 24
- Beiträge
- 295
Ja habe ich auch gerade noch gemerkt. Das werde ich noch implementieren. Ich denke ich werde es in der Schleife einbauen. Oder halt die DB umbauen.


Zitieren
