Schleifenproblem
am 20.06.2005 02:44:53 von thetwin
Hallo,
ich habe ein Problem mit meinen Schleifen.
Ich frage meine Datenbank mit zwei Schleifen
ab das Ergebniss ist aber alles andere als das
was es werden sollte...
Die Tabelle:
blog
|-------------------|-------------------|------------------- |-------------------|
| ID | nickname | msg | titel |
|-------------------|-------------------|------------------- |-------------------|
es befinden sich 4 Datensätze für USER1 in der Tabelle
die Abfrage:
$sql = "SELECT * FROM blog WHERE nickname LIKE 'USER1'";
$res = mysql_query($sql, $connect);
while($zeile = mysql_fetch_row($res))
{
for($i = 0; $i < mysql_num_fields($res); i++)
{
echo $zeile[$i] . "
";
}
}
das Problem:
Wenn ich diese Anfrage jetzt durchführe werden
1. nur die Ersten drei statt alle vier ausgegeben
2. die Datensetze die ausgegeben werden werden gleich 6fach ausgegeben
Was läuft falsch? Ich habe es jetzt mehrfach überprüft,
aber es funktionier immer noch nicht richtig :(
Ich denke was ich erreichen will ist klar?!
Ich möchte alle zu diesem User gehörenden Datensätze
ausgeben lassen.
Wenn jmd. eine Fehler findet oder einen Verbesserungsvorschlag
hat, immer raus damit.
Danke Sandro
Re: Schleifenproblem
am 20.06.2005 07:04:16 von Fabian Schladitz
Sandro Paetzold schrieb:
> Ich frage meine Datenbank mit zwei Schleifen
> ab das Ergebniss ist aber alles andere als das
> was es werden sollte...
>=20
> Die Tabelle:
> blog
>=20
> |-------------------|-------------------|------------------- |----------=
---------|
> | ID | nickname | msg | titel |
> |-------------------|-------------------|------------------- |----------=
---------|
> es befinden sich 4 Datensätze für USER1 in der Tabelle
>=20
> die Abfrage:
> $sql =3D "SELECT * FROM blog WHERE nickname LIKE 'USER1'";
16.14. Warum soll ich nicht SELECT * schreiben?
http://www.php-faq.de/q/q-sql-select.html
Wozu das LIKE, wenn du kein % im Statement hast? Nutze doch bitte:
SELECT titel, msg, nickname FROM blog WHERE nickname =3D 'USER1'
> $res =3D mysql_query($sql, $connect);
if($res ===3D false) {
echo 'Keine Einträge für diesen User.';
}
while($zeile =3D mysql_fetch_assoc($row)){
echo $zeile['titel'] . ' (von ' . $zeile['nickname'] . '
' .=20
$zeile['msg'] . '
';
}
>=20
> das Problem:
> Wenn ich diese Anfrage jetzt durchführe werden
> 1. nur die Ersten drei statt alle vier ausgegeben
Hast du in der Datenbank verifiziert, dass es vier Einträge sind und de=
r=20
String im "nickname"-Feld gleich ist?
> 2. die Datensetze die ausgegeben werden werden gleich 6fach ausgegeben
Sehr merkwürdig. Wird die SQL-Abfrage u.U. mehrfach ausgeführt?
--=20
HTH,
Fabian
Re: Schleifenproblem
am 20.06.2005 13:19:52 von dev-null-use-reply-adress
Fabian Schladitz schrieb:
> Sandro Paetzold schrieb:
>> $res = mysql_query($sql, $connect);
> if($res === false) {
> echo 'Keine Einträge für diesen User.';
> }
http://de.php.net/manual/en/function.mysql-query.php
/----------------------------------------------------------- ------
| For SELECT, SHOW, DESCRIBE or EXPLAIN statements, mysql_query()
| returns a resource on success, or FALSE on error.
|
| Use mysql_num_rows() to find out how many rows were returned for
| a SELECT statement
\----------------------------------------------------------- ------
meinjanur ;-)
Gruß, JPM
Re: Schleifenproblem
am 20.06.2005 14:55:11 von thetwin
> >> $res = mysql_query($sql, $connect);
>
> > if($res === false) {
> > echo 'Keine Einträge für diesen User.';
> > }
>
> http://de.php.net/manual/en/function.mysql-query.php
> /----------------------------------------------------------- ------
> | For SELECT, SHOW, DESCRIBE or EXPLAIN statements, mysql_query()
> | returns a resource on success, or FALSE on error.
> |
> | Use mysql_num_rows() to find out how many rows were returned for
> | a SELECT statement
> \----------------------------------------------------------- ------
[...]
Wozu eine Fehlerabfrage?
Es wird immer 100%ig mindestens 1 Eintrag pro User
vorhanden sein!
MfG
Re: Schleifenproblem
am 20.06.2005 15:12:45 von thetwin
[...]
> 16.14. Warum soll ich nicht SELECT * schreiben?
> http://www.php-faq.de/q/q-sql-select.html
Hab' ich gelesen und Du hast recht.
> Wozu das LIKE, wenn du kein % im Statement hast? Nutze doch bitte:
>
> SELECT titel, msg, nickname FROM blog WHERE nickname = 'USER1'
Kein Ahnung, das LIKE ist einfach Angewohnheit geworden! Da es
aber keinerlei Probleme damit gibt werde ich es wohl oder übel
weiternutzen.
> > $res = mysql_query($sql, $connect);
> if($res === false) {
> echo 'Keine Einträge für diesen User.';
> }
> while($zeile = mysql_fetch_assoc($row)){
> echo $zeile['titel'] . ' (von ' . $zeile['nickname'] . '
' .
> $zeile['msg'] . '
';
> }
Dieses bsp. funktioniert bei mir nicht!
> Hast du in der Datenbank verifiziert, dass es vier Einträge sind und der
> String im "nickname"-Feld gleich ist?
Hä? Wie? das sag ich doch im SQL Befehl?!
> Sehr merkwürdig. Wird die SQL-Abfrage u.U. mehrfach ausgeführt?
Ja es wurde mehrfach ausgeführt!
Und zwar in der for() Schleife! Genauso oft wie spalten
vorhanden waren! Der Fehler ist also behoben!
Es bleibt aber dabei das es nur 3 statt 4 Ergbnisse sind.
Sandro
Re: Schleifenproblem
am 20.06.2005 15:15:54 von Niels Braczek
Sandro Paetzold schrieb:
> Wozu eine Fehlerabfrage?
> Es wird immer 100%ig mindestens 1 Eintrag pro User
> vorhanden sein!
Nichts ist 100%ig. Der MySQL-Server könnte in der Zwischenzeit down
sein. Dein Username könnte falsch/verstümmelt sein. Oder sonst
irgendetwas, das du übersehen hast.
MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´
Re: Schleifenproblem
am 20.06.2005 15:24:09 von thetwin
[...]
> Nichts ist 100%ig. Der MySQL-Server könnte in der Zwischenzeit down
> sein. Dein Username könnte falsch/verstümmelt sein. Oder sonst
> irgendetwas, das du übersehen hast.
Ok, ok.
Da ich (denk ich mal) noch nicht die selbe Erfahrung habe wie viele
hier werdet Ihr mit ziemlich großer Wahrscheinlichkeit recht haben.
Also Fehlerabfrage ist drin.
Sandro
Re: Schleifenproblem
am 20.06.2005 15:45:09 von dev-null-use-reply-adress
Sandro Paetzold schrieb:
> [...]
>> Nichts ist 100%ig. Der MySQL-Server könnte in der Zwischenzeit down
>> sein. Dein Username könnte falsch/verstümmelt sein. Oder sonst
>> irgendetwas, das du übersehen hast.
>
> Ok, ok.
> Da ich (denk ich mal) noch nicht die selbe Erfahrung habe wie viele
> hier werdet Ihr mit ziemlich großer Wahrscheinlichkeit recht haben.
> Also Fehlerabfrage ist drin.
Du hast aber meinen Einwand an Fabian schon verstanden?
Also, wenn mysql_query() false zurückliefert, dann ist
die Abfrage fehlgeschlagen. Warum, erzählt Dir ggf.
mysql_error().
Es heißt aber keineswegs, daß die Abfrage keine Datensätze
lieferte. Das stellst mit mysql_num_rows() fest.
Gruß, JPM
Re: Schleifenproblem
am 20.06.2005 15:50:15 von thetwin
[...]
> Du hast aber meinen Einwand an Fabian schon verstanden?
>
> Also, wenn mysql_query() false zurückliefert, dann ist
> die Abfrage fehlgeschlagen. Warum, erzählt Dir ggf.
> mysql_error().
> Es heißt aber keineswegs, daß die Abfrage keine Datensätze
> lieferte. Das stellst mit mysql_num_rows() fest.
Jup, ich lasse jetzt Prüfen ob Datensätze für diesen User vorhanden
sind. Sollte die Abfrage fehlgeschlagen sein ist es false und wenn
er noch keine Einträge gemacht hat bekomme ich ebenfalls false
zurück!
LG
Sandro
Re: Schleifenproblem
am 20.06.2005 16:52:38 von Jens Riedel
Sandro Paetzold wrote:
>>Wozu das LIKE, wenn du kein % im Statement hast? Nutze doch bitte:
>>
>>SELECT titel, msg, nickname FROM blog WHERE nickname = 'USER1'
>
>
> Kein Ahnung, das LIKE ist einfach Angewohnheit geworden! Da es
> aber keinerlei Probleme damit gibt werde ich es wohl oder übel
> weiternutzen.
Entschuldige, aber was soll das denn? Nur weil dir dieser schlechte Stil
bislang noch keine Probleme gemacht hat, willst du ihn in Zukunft
beibehalten?
*kopfschüttelnd*
Jens
Re: Schleifenproblem
am 20.06.2005 17:49:02 von thetwin
[...]
> Entschuldige, aber was soll das denn? Nur weil dir dieser schlechte Stil
> bislang noch keine Probleme gemacht hat, willst du ihn in Zukunft
> beibehalten?
Ja klar oder stellt das für Dich ein größeres Problem dar?
Ich versteh'nicht so ganz was Ihr an dem LIKE so schlimm
findet?!
Sandro
Re: Schleifenproblem(Lösung)
am 20.06.2005 18:43:51 von Sandro Paetzold
Ich hab das Problem jetzt wie folgt gelöst/umgangen.
$sql = "SELECT nickname, titel, msg FROM blog WHERE nickname =
'$dbnick[0]'";
$res = mysql_query($sql, $connect);
$num = mysql_num_rows($res);
$i = 0;
if($num == '0')
{
echo $dbnick[0] . " hat noch keine Einträge verfasst.";
}
else
{
while($i <= $num)
{
$zeile = mysql_fetch_row($res);
echo $zeile[0] . ", " . $zeile[1] . ", " . $zeile[2] .
"
";
$i++;
}
}
LG
Sandro
Re: Schleifenproblem
am 20.06.2005 20:16:46 von Matthias Esken
On Sun, 20 Jun 2005 15:49:2 GMT, Sandro Paetzold wrote:
> Ja klar oder stellt das für Dich ein größeres Problem dar?
> Ich versteh'nicht so ganz was Ihr an dem LIKE so schlimm
> findet?!
Die Geschwindigkeit.
Gruß,
Matthias
Re: Schleifenproblem
am 21.06.2005 08:54:43 von Jens Riedel
Sandro Paetzold wrote:
> Ja klar oder stellt das für Dich ein größeres Problem dar?
Für mich? Überhaupt nicht, da ich deine Programme ja nicht nutze... ;-)
> Ich versteh'nicht so ganz was Ihr an dem LIKE so schlimm
> findet?!
Es verschwendet Zeit. Und ich finde lediglich deine Aussage "es hat
immer funktioniert, darum mache ich es wohl oder übel weiter so" etwas
seltsam. Wenn man was dazulernt (in diesem Fall, dass "=" manchmal
besser ist), sollte man das doch nutzen, oder?
Gruß,
Jens
Re: Schleifenproblem(Lösung)
am 21.06.2005 12:03:44 von Christian Schmelzer
Sandro Paetzold wrote:
> Ich hab das Problem jetzt wie folgt gelöst/umgangen.
>
>
> $sql = "SELECT nickname, titel, msg FROM blog WHERE nickname =
> '$dbnick[0]'";
> $res = mysql_query($sql, $connect);
> $num = mysql_num_rows($res);
> $i = 0;
> if($num == '0')
> {
> echo $dbnick[0] . " hat noch keine Einträge verfasst.";
> }
> else
> {
> while($i <= $num)
> {
> $zeile = mysql_fetch_row($res);
> echo $zeile[0] . ", " . $zeile[1] . ", " . $zeile[2] .
> "
";
> $i++;
> }
> }
>
> LG
> Sandro
Hallo,
am Programmierstil könntest du dann noch etwas tun. Spontan fallen mir zwei
Punkte auf:
1. if($num == '0')
Warum vergleichst du eine Zahl mit einem String? Funktioniert in PHP, wird
sich performancetechnisch nicht auswirken, ist aber trotzdem unschön.
2. Lieber mysql_fetch_array statt mysql_fetch_row nutzen. mysql_fetch_array
ist beim Lesen des Codes wesentlich übersichtlicher, da man hier mit
Spaltennamen arbeiten kann.
Christian
Re: Schleifenproblem(Lösung)
am 21.06.2005 15:57:38 von Hartmut Holzgraefe
Christian Schmelzer wrote:
> 2. Lieber mysql_fetch_array statt mysql_fetch_row nutzen. mysql_fetch_a=
rray
> ist beim Lesen des Codes wesentlich übersichtlicher, da man hier mit
> Spaltennamen arbeiten kann.
du meinst vermutlich mysql_fetch_assoc(), mysql_fetch_array() liefert
ja zunächst mal beides (Spaltennamen *und* -nummern als Index).
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
Re: Schleifenproblem(Lösung)
am 21.06.2005 16:07:01 von thetwin
[...]
> Hallo,
> am Programmierstil könntest du dann noch etwas tun. Spontan fallen mir zwei
> Punkte auf:
> 1. if($num == '0')
> Warum vergleichst du eine Zahl mit einem String? Funktioniert in PHP, wird
> sich performancetechnisch nicht auswirken, ist aber trotzdem unschön.
> 2. Lieber mysql_fetch_array statt mysql_fetch_row nutzen. mysql_fetch_array
> ist beim Lesen des Codes wesentlich übersichtlicher, da man hier mit
> Spaltennamen arbeiten kann.
Zu 1. Wusste nicht das das *verkehrt* ist, aber wenn ich drüber nachdneke
hast Du schon recht das es Logischer wäre ein Int mit einer Zahl zu vergleichen!
Zu 2. Das ist spitze! Danke für die Info :)
Sandro
Re: Schleifenproblem
am 21.06.2005 16:09:13 von thetwin
[...]
> Es verschwendet Zeit. Und ich finde lediglich deine Aussage "es hat
> immer funktioniert, darum mache ich es wohl oder übel weiter so" etwas
> seltsam. Wenn man was dazulernt (in diesem Fall, dass "=" manchmal
> besser ist), sollte man das doch nutzen, oder?
Ja, aber nur wenn es dafür gute Gründe gibt!
Und zugegeben die Geschwindigkeit ist ein guter Grund!
Aber das wusste ich zu dem Zeitpunkt meiner Aussage
noch nicht!
Sandro
Re: Schleifenproblem(Lösung)
am 21.06.2005 16:10:31 von thetwin
[...]
> du meinst vermutlich mysql_fetch_assoc(), mysql_fetch_array() liefert
> ja zunächst mal beides (Spaltennamen *und* -nummern als Index).
Also mysql_fetch_assoc() statt mysql_fetch_array?!
Sandro
Re: Schleifenproblem(Lösung)
am 21.06.2005 16:16:41 von Felix Holdener
thetwin@arcor.de (Sandro Paetzold) wrote in news:42b81fd6$0$15424$9b4e6d93
@newsread2.arcor-online.net:
> [...]
>> du meinst vermutlich mysql_fetch_assoc(), mysql_fetch_array() liefert
>> ja zunächst mal beides (Spaltennamen *und* -nummern als Index).
>
> Also mysql_fetch_assoc() statt mysql_fetch_array?!
Lies doch im Manual selber nach, was bei den beiden Funktionen steht, und
deine Frage(n) erübrigt sich! Die Tipps hier sind genau so gedacht: Man
gibt dir einen Schubs in die richtige Richtung, dann schaust du selber
nach, was eine Funktion genau macht und wie du sie genau einsetzen musst.
Felix
Re: Schleifenproblem(Lösung)
am 22.06.2005 02:32:15 von thetwin
[...]
> Lies doch im Manual selber nach, was bei den beiden Funktionen steht, und
> deine Frage(n) erübrigt sich! Die Tipps hier sind genau so gedacht: Man
> gibt dir einen Schubs in die richtige Richtung, dann schaust du selber
> nach, was eine Funktion genau macht und wie du sie genau einsetzen musst.
Danke, das habe ich schon gemacht!