PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten aus der DB lesen


Neo2003
10.09.2003, 14:54:26
Hallo,

steh irgendwie auf dem Schlauch!
Also hab eine Datenbank mit den Feldern:

Kuenstler
Titel
Homepage
Dateiname
Zeit
Zeit1
Zeit2
Zeit3

Die Verbindung zur DB steht.
Aber kann keine Daten auslesen.

Versuche es im Moment so:
$result = mysql_query("SELECT * FROM $db_table WHERE id = '2'");

Nur was muss ich machen, wenn ich z.B. den Wert aus der Spalte Kuenstler ausgeben möchte?

echo $Kuenstler;
??

Danke

-Neo-

Wenn ich echo $result; mache gibt er mir Resource id #2
aus. Was sollte mir das sagen?

chris17
10.09.2003, 15:28:23
Hi,

das kannst Du z.B. so machen

$result = mysql_query("SELECT * FROM $db_table WHERE id = '2'");
$Kuenstler = mysql_result($result, 0, "Kuenstler");
echo $Kuenstler;
//usw...

oder so...

$result = mysql_query("SELECT * FROM $db_table WHERE id = '2'");
while($row=mysql_fetch_array($result))
{
echo $row['Kuenstler']."<br>";
echo $row['Titel']."<br>";
//usw.
}



P.S.: Hat das mit den "verbleibenden Minuten" geklappt?

Neo2003
10.09.2003, 15:49:32
Hi,

ja super hab nu funzt das auch.
Da smit den verbleibenden Minuten hat auch geklappt!

Dankeschön!!!!!

Aber hab gleich die nächste Frage.
In meiner DB hab ich das Feld Zeit.
Darin steht die Zeit im Format 1500 für 15 Uhr.
Die aktuelle Uhrzeit lasse ich per PHP ermitteln und möchte jetzt den Eintrag aus der DB haben der z.b. 1600 am nächsten ist.

Wie muss die Abfrage lauten?


-Neo-

chris17
10.09.2003, 16:23:50
Hi,

probier das mal aus

$jetzt = date("Hi");
mysql_query("SELECT * FROM $db_table WHERE Zeit > '".$jetzt."' ORDER BY Zeit ASC LIMIT 1");

Grüsse

chris17

Neo2003
10.09.2003, 16:30:52
Hi,

das klappt schon super!
Aber wie mache ich es das er nicht nur Zeit sondern auch Zeit1, Zeit2 und Zeit3 vergleicht?
Und davon den am nächsten vorkommenden ausspuckt?

-Neo-

Neo2003
10.09.2003, 16:39:24
Hier noch mal meine DB.

http://www.free-lancer.org/ff/db_aufbau.gif

So und wenn es jetzt 1645 ist soll er mir halt Band1 ausgeben weil bei Band1 Zeit2 am nächsten dran ist.

So eine Abfrage brauche ich.

Die Abfrage von eben macht das nur bei Zeit nicht bei allen.

Hoffe man kann den DB Aufbau erkennen;)

-Neo-

chris17
10.09.2003, 17:55:42
Funktionieren tut's...

$jetzt = "1645";
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit > '".$jetzt."' ORDER BY Zeit ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit");
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit1 > '".$jetzt."' ORDER BY Zeit1 ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit1");
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit2 > '".$jetzt."' ORDER BY Zeit2 ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit2");
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit3 > '".$jetzt."' ORDER BY Zeit3 ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit3");

print_r($zeit);//Testausgabe
for($i = 0; $i < count($zeit); $i++)
{
if($zeit[$i] == "")
{
unset($zeit[$i]);
}
}
$zeit = array_values($zeit);
echo min($zeit);
Ob's elegant ist? :-)

Ob man das in einem Query erledigen kann?

Neo2003
11.09.2003, 10:39:21
Hi,

wenn ich das versuche bekomme ich immer

Array ( [0] => [1] => [2] => [3] => )

Ausgegeben.
Soll das so sein?
Wenn ja was muss ich damit machen um die einzelnen Werte des ensprechenden Eintrages auszugeben?

Wenn nein, was mache ich falsch?


-Neo-

MiH
11.09.2003, 11:04:15
dein aufbau der db ist schutte.
der bereich "zeit" ist immer "zeit" also gehört er in eine spalte.
eine weite möglichkeit wäre auch gleich das datum dazu zu speicher, damit nicht falsche datensätze ausgelesen werden.
also hier mein vorschlag

tabelle1:

id | kid | titel | timestamp
1 | 1 | test1 | 1064062800
2 | 2 | test2 | 1064064600

tabelle2:
kid | name
1 | Max Müller
2 | Max Schuster

abfrage:
select t2.name,t1.titel,from_unixtimestamp('%d.%m.%Y %H:%i',t1.timestamp) time from
tabelle1 t1 inner join tabelle2 t2 using(kid) where t1.timestamp > unix_timestamp(now()) limit 1;

chris17
11.09.2003, 11:09:11
Hi,

Du machst nix falsch.
Wenn das dabei rauskommt, -> Array ( [0] => [1] => [2] => [3] => ), dann gibt's kein gültiges Ergebnis.
-> Obacht, ich habe vor die Querys das @-Zeichen geschrieben!

In Deinem Bsp. würde das eintreten, wenn es 19:00 Uhr wäre. Dann spielt ja, laut Zeitplan, keine Band mehr. Dann bietet sich an den frühesten Termin vom nächsten Tag auszugeben.


Array ( [0] => [1] => [2] => [3] => )
-> das Array sieht in "echt" so aus: $zeit = array("","","","");
Hat also 4 Indizes, das sind die Ergebnisse der 4 Querys.

print_r ist saupraktisch um Array zu Testzwecken ausgeben zu lassen.

Grüsse

chris17

@MiH, immer wieder eine Freude Deine Querys zu sehen :-)

Neo2003
11.09.2003, 15:06:49
So,

sieht jetzt so aus:

Array ( [0] => 1700 [1] => 1530 [2] => [3] => )

Kommt ja auch hin, 1530 wäre der nächste Termin.
Aber wie gebe ich den jetzt aus?

-Neo-

chris17
11.09.2003, 15:14:46
Hi,

hatte ich doch schon geschrieben...
for($i = 0; $i < count($zeit); $i++)// Die Schleife um leere Array-Felder zu löschen.
{
if($zeit[$i] == "")
{
unset($zeit[$i]);
}
}
$zeit = array_values($zeit);// Das Array neu "zusammensetzen"
// Und der kleinste Wert ist der gesuchte -> min()
echo min($zeit);// Hier ist die Ausgabe!

Gruss

Neo2003
11.09.2003, 15:17:40
Hi,

funzt nicht.

Sollte ja dann eigentlich was ausgegeben werden.
Array ( [0] => 1700 [1] => 1530 [2] => [3] => ) XXX

Demnach ist $zeit[0] und $zeit[1] gefüllt
Da wo die XXX sind sollte das stehen was mit echo min($zeit); ausgegeben werden soll.

Ist aber nix.

-Neo-

chris17
11.09.2003, 15:28:04
Upps,

mein Fehler, hab quasi das Array abgesägt auf dem wir sitzen :-)
Jetzt sollte es gehen.

$zeit = array("1700","1530","","");// Zum Testen...

$zeit_temp = $zeit;

for($i = 0; $i < count($zeit); $i++)
{
if($zeit_temp[$i] == "")
{
unset($zeit_temp[$i]);
}
}


$zeit = array_values($zeit_temp);
echo min($zeit);

Neo2003
11.09.2003, 15:35:11
Hi,

okay das funzt. Gibt mir jetzt 1530 aus.
So wie das sein soll.

Jetzt muss ich doch nur noch eine Abfrage machen und mir die Daten aus der DB ziehen die zu der Zeit passen oder?

-Neo-

Neo2003
11.09.2003, 15:38:31
So z.B.:

$result = @mysql_query("SELECT * FROM $tb_table WHERE Zeit > '".min($zeit)."' OR Zeit1 > '".min($zeit)."' OR Zeit2 > '".min($zeit)."' OR Zeit3 > '".min($zeit)."'");


Und so das ausgeben:


echo $result[Kuenstler];


Kann man das so machen?

-Neo-

Habe es so mal versucht.
Bekomme zwar keinen Fehler, aber auch keine Ergebnisse...

MiH
11.09.2003, 15:52:34
nein kannst du nicht. da der query schrott ist und deine dbstruktur noch viel schlimmer.

Neo2003
11.09.2003, 15:54:44
Wie kann ich es denn?
Muss ja irgendwie jetzt die Daten bekommen können.

Entweder muss ich sonst eine DB machen in der für jede Zeit ein kmplett neuer Eintrag pro Film gemacht wird oder es so machen wie jetzt. Anders wüsste ich das im Moment nicht.

-Neo-

Neo2003
11.09.2003, 16:00:43
Hab den query jetzt so:


$result = mysql_query("SELECT * FROM $db_table WHERE Zeit > $Suche OR Zeit1 > $Suche OR Zeit2 > $Suche OR Zeit3 > $Suche");


Bekomme als Ausgabe Resource id #6.
Was auch immer mir das sagen soll.

-Neo-

chris17
11.09.2003, 16:52:01
Hi,

was der MiH sagt stimmt schon, die Struktur sollte/"könnte" man verbessern.

Wegen der zur Zeit dazugehörenden Band, hab' ich das mal probiert...

$jetzt = "1705";
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit > '".$jetzt."' ORDER BY Zeit ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit");
$band[] = @mysql_result($res, 0, "Kuenstler");
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit1 > '".$jetzt."' ORDER BY Zeit1 ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit1");
$band[] = @mysql_result($res, 0, "Kuenstler");
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit2 > '".$jetzt."' ORDER BY Zeit2 ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit2");
$band[] = @mysql_result($res, 0, "Kuenstler");
$res = mysql_query("SELECT * FROM kuenstler WHERE Zeit3 > '".$jetzt."' ORDER BY Zeit3 ASC LIMIT 1");
$zeit[] = @mysql_result($res, 0, "Zeit3");
$band[] = @mysql_result($res, 0, "Kuenstler");

for($i = 0; $i < count($zeit); $i++)
{
if($zeit_temp[$i] == "")
{
unset($zeit_temp[$i]);
unset($band[$i]);
}
}

$zeit = array_values($zeit_temp);
$band = array_values($band);
echo $band[0]." - ".$zeit[0]; // Das min() brauchst Du nicht, wenn Du die Zeiten, sowie jetzt, immer schön aufsteigend in die Datenbank schreibst. Der kleinste Wert hat dann den Index [0]

Wenn es Deine Zwecke erfüllt ist gut, nur was passiert wenn Du mal 6,7 oder 8 Zeiten pro Band hast? usw.

Überdenke lieber jetzt Deine Datenbank-Struktur, als später...

Grüsse

chris17