• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

[PHP] [PHP&MYSQL] Daten aus Datenbank mit Schleife auslesen

Alecco

Transparent von Croncels
Registriert
17.02.09
Beiträge
306
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":

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;

Das habe ich jetzt geändert zu:

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++;
  }

Als Ausgabe erhalte ich aber folgendes:

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?
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
ä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?
 
Zuletzt bearbeitet:

Alecco

Transparent von Croncels
Registriert
17.02.09
Beiträge
306
äh, irgendwie versteh ich nicht was du da vorhast. was ist das ziel des ganzen?

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.

aber nun nochmal zu deinem eigentlichen problem. was genau soll das endergebnis sein und was macht createentry()
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 :)
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
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 :)


ließ dir nochmal durch was ich oben grade noch hinzugefügt habe. da steht zum einen die lösung deines problems zum anderen aber auch noch ein hinweis darauf das die struktur deiner db "ineffizient" scheint.
 

Alecco

Transparent von Croncels
Registriert
17.02.09
Beiträge
306
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 ;)
 

Alecco

Transparent von Croncels
Registriert
17.02.09
Beiträge
306
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?

Mehr als 6 werden es nicht. Falls es z.B. nur 2 sind: Daher überprüfe ich doch mit empty, ob überhaupt Einträge existieren.
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
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 ;)

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.
 

Alecco

Transparent von Croncels
Registriert
17.02.09
Beiträge
306
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
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
Mehr als 6 werden es nicht. Falls es z.B. nur 2 sind: Daher überprüfe ich doch mit empty, ob überhaupt Einträge existieren.
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.

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

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.
 

Alecco

Transparent von Croncels
Registriert
17.02.09
Beiträge
306
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.
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
um deine so bestehende abfrage aber mal gradezurücken würde ich es so schreiben:

$ergebnis = mysql_query("SELECT * FROM startseite");
while($row = mysql_fetch_object($ergebnis))
{
$cname=$row->cname;
$campl=$row->cnamel;
$preis=$row->preis;
$alter=$row->alter;

$termin[] = array();
for($k=1;$k<6;$k++){
$index = "termin".$k;
if(empty($row->$index)){
$termin[]=$row->index;
}
}

createentry($cname,$campl,$termin,$status,$alter,$preis);
}


und die ausgabe des arrays machst du dann in deiner createantry-ausgabe so:

foreach($termin AS $value){
echo $value;
}




damit werden dir alle indiezies des arrays ausgegeben egal wieviele termine im array stehen