Portal > Foren > PHP > PHP-Programmierung > SQL Abfrage klappt nicht mit mehr als einem Datensatz
Antwort
 
Themen-Optionen
Alt 28.03.2007, 20:53 Nach oben    #1
Jan
Erfahrener Benutzer
 
Benutzerbild von Jan
 
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 483
Standard SQL Abfrage klappt nicht mit mehr als einem Datensatz

Hallo, folgendes Skript klappt, bis auf das immer nur ein Datensatz gelesen wird, statt fünf.

Wo liegt der Fehler? Ist der Code zu verbessern? In Bezug auf die beiden Abfragen.
PHP-Code:
<?php
/**
Bringt alle aus den Klassenstufen 11,12 und 13 in die Gruppe 'Oberstufe' (15)
 */

define("IN_MYBB"1);
require_once 
"./global.php";

/**    Letzten User auswählen    */
if($_GET == '') { $lastid 0; } else { $lastid $_GET['lastid']; }

/**    Die Userfields auslesen    */
$query $db->query("SELECT * FROM ".TABLE_PREFIX."userfields WHERE ufid > '".$lastid."' ORDER BY ufid LIMIT 0,5");
while(
$userfields $db->fetch_array($query)) /**    Für jeden User ausführen    */
{

    
$lastid $userfields['ufid'];

    
/**    Abfrage der User Infos    */
    
$query $db->query("SELECT * FROM ".TABLE_PREFIX."users WHERE uid = '".$userfields['ufid']."'LIMIT 0,1");
    while(
$users $db->fetch_array($query)) /**    Für jeden User ausführen    */
    
{

        
$name $users['username'];

        
/**    Prüfen ob der User in der Klassenstufe 11,12 oder 13 ist    */
        
if(($userfields['fid5'] == '11') || ($userfields['fid5'] == '12') || ($userfields['fid5'] == '13'))
        {
            
/**    Prüfen ob der User alle Angaben gemacht hat    */
            
if(($userfields['fid7'] == '') || ($userfields['fid8'] == ''))
            {
                
$adresse 'no';
            }
            if((
$userfields['fid7'] == "UNBEKANNT") || ($userfields['fid8'] == "LEER"))
            {
                
$adresse 'no';
            }
            if((
$userfields['fid7'] == "BITTE EINGEBEN") || ($userfields['fid8'] == "BITTE EINGEBEN"))
            {
                
$adresse 'no';
            }
            if(
$userfields['ufid'] == "15")
            {
                
$adresse 'no';
            }
    
            
/**    Der User hat alle Angaben gemacht, bringen wir ihn nun in die Gruppe    */
            
if($adresse != 'no')
            {
                
$gruppe $users['additionalgroups']; /**    Seine alten Gruppen speichern    */
                
$test preg_split("/,/",$gruppe); /**    Seine Gruppen trennen    */
                
foreach($test as $i/**    Für jeden Gruppe prüfen    */
                
{
                    if (
$i == '15'/**    Ist der User schon in der Gruppe?    */
                    
{
                        
$stop 'stop';
                    }
                }
                
/**    der User ist nicht in der Gruppe, geben wir im die neue Gruppe dazu    */
                
if ($stop != 'stop')
                {
                    
$gruppe .= ',15';
                    
$otto = array('additionalgroups' => $gruppe);
                    
/**    Daten wieder in die Datenbank schreiben    */
                    
$db->update_query(TABLE_PREFIX."users"$otto'uid = '.$userfields['ufid']);
                    echo 
'Der User '.$users['username'].' wurde der Gruppe \'Oberstufe\' hinzugefügt';
                }
            }
        }
    }
print 
'Wir sind jetzt bei User '.$userfields['ufid'].' - '.$name;
}
    print(
'<hr /><br /><a href="gruppe.php?'.SID.'&amp;lastid='.$lastid.'">Weiter</a>');
?>
__________________
Jan
info.malte-gerth.de
=================================
Nutzt bitte lieber Jabber statt ICQ:
malte.gerth@jabber.cz
Jan ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.03.2007, 21:10 Nach oben    #2
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.203
Standard

select * from
Warum soll ich nicht SELECT * schreiben?
http://www.php-faq.de/q/q-sql-select.html

Dann ist es weiterhin sinnvoll sql-statements lesbarer zu schreiben:
Beispiel:
PHP-Code:
<?php
  $sql 
"SELECT
              `feldname`, `nocheinfeldname`, `undnochfeldname`
          FROM
              `tabellenname`
          WHERE
              `feldname` LIKE '%suchwort%'
            AND
              `nocheinfeldname` = 'wert'
          ORDER BY
              `undnochfeldname` ASC
          LIMIT
              0 , 30"
;
  
$result mysql_query($sql) or exit('<h2>Fehler</h2>sql-querry: '$sql.'<br />error: '.mysql_error());
  
// ...
?>
Darüber hinaus hast du einen Fehler im zweiten sql-string. Du hast hinter dem letzten ' und dem Limit kein Leerzeichen, was dir beim debugging aber sicherlich auch aufgefallen wäre
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.03.2007, 21:15 Nach oben    #3
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Passiert das denn immer mit deinen SQL-Abfragen?
PHP-Code:
<?php
while($users $db->fetch_array($query))
?>
Vielleicht liefert die $db->fetch_array() funktion dann einfach nur zu früh den false wert?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.03.2007, 22:23 Nach oben    #4
Benutzer
 
Benutzerbild von if('Miikku' == $Name)
 
Registriert seit: 28.03.2007
Ort: Dollern
Beiträge: 26
Standard

Ich würd' dir helfen, wenn ich verstehen würd', welche Datensetze von wo nicht gelesen werden! Da werden doch viele Datensätze eingelesen, oder bin ich jetzt doof?
Nur kurz, was den Programmierstyle angeht: man kann ein Kommentar am ende einer Zeile auch mit
PHP-Code:
//einleiten und außerdem genügt auch 
/*dieses,*/ //anstatt
/**diesem!*/ 
...

mfg
$Name = 'Miikku'; echo $Name;
if('Miikku' == $Name) ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.03.2007, 22:41 Nach oben    #5
Jan
Erfahrener Benutzer
 
Benutzerbild von Jan
 
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 483
Standard

@ Jann Hendrik
Okay, hab das Leerzeichen eingeführt.
Werde das Statement noch umschreiben. In Bezug auf "SELECT *" und auf lesbarkeit.

@ Chr!s
Warum sollte sie FALSE liefern?
Was soll immer passieren?

@ if('Miikku' == $Name)
Ich weiß
Aber durch diese Kommentare bekomm ich ein schönes Syntaxhighlighting (?)
Die hälfte der Kommentare ist auch nur für mich gewesen, damit ich den Sinn schnell erkennen kann.

Okay, Fehler gefunden.
Ich musste einfach einmal $query umbenennen. Er hat die Variable leider nicht überschrieben.
Jetzt geht es wie gewünscht.
__________________
Jan
info.malte-gerth.de
=================================
Nutzt bitte lieber Jabber statt ICQ:
malte.gerth@jabber.cz

Geändert von Jan (28.03.2007 um 23:14 Uhr).
Jan ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.03.2007, 23:14 Nach oben    #6
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Sollte $db->fetch_array nicht ein Array zurückliefern - schon nur daher, weil Du die Methode entsprechend benennst.

ED:

Sehe gerade, dass $_GET['lastid'] uU direkt in die querie eingebaut wird - sehr gefährlich! Mach vorher einen preg-check, zB ob der übermittelte Wert numerisch ist. Dasselbe bei allen anderen Userinputs, welche über GET, POST oder COOKIE kommen - dass globals off sind versteht sich von selbst.
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse


Geändert von dsxs (28.03.2007 um 23:18 Uhr).
dsxs ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.03.2007, 10:47 Nach oben    #7
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.203
Standard

Zitat:
Zitat von Jan Beitrag anzeigen
Aber durch diese Kommentare bekomm ich ein schönes Syntaxhighlighting (?)
auf diese 'Frage' ein klares: nein.
Warum auch?
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.03.2007, 10:52 Nach oben    #8
Martin Eisengardt
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Zitat:
Zitat von Jan Beitrag anzeigen
Okay, Fehler gefunden.
Ich musste einfach einmal $query umbenennen. Er hat die Variable leider nicht überschrieben.
Jetzt geht es wie gewünscht.
Richtig, aber denk über die Begründung noch einmal nach, damit du das richtig verstehst. Die ist ein wenig merkwürdig, wie du den Fehler begründest...

Ansonsten noch ein Ansatz zum Tuning: Bei solchen Konstrukten (Selektiere A und für jedes Ergebnis aus A führe Select B aus) empfiehlt sich ein Join. Ein Join ist im Grunde nichts anderes als die Mengenleere in Mathematik (glaube 3. Schuljahr oder so). Schau dir dazu das Tutorial deines Vertrauens an
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.03.2007, 15:20 Nach oben    #9
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Zitat:
Zitat von Jann Hendrik Beitrag anzeigen
Zitat:
Zitat von Jan Beitrag anzeigen
Aber durch diese Kommentare bekomm ich ein schönes Syntaxhighlighting (?)
auf diese 'Frage' ein klares: nein.
Warum auch?
Nun ja, manche Editoren unterscheiden zwischen /* und /**
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.03.2007, 16:47 Nach oben    #10
Jonas
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 239
Standard

Sollte sie ja auch.

Nur, kauf ich mir ein neues Haus, weil meins rot ist und ich es blau haben möchte? Nein, ich streiche es anders.

Soll heißen, wenn es aufs Aussehen ankommt, sollte man einfach mal die Optionen ändern.

Denn: /** leitet einen Dokumentations-Kommentar ein, zum Beispiel vor Klassen oder Funktionen, der mit PHPDoc oä. ausgelesen wird.

http://de.wikibooks.org/wiki/Website...Doc-Kommentare
http://www.ulf-wendel.de/schulung/core/kommentare.php
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL


Artemis ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.03.2007, 17:15 Nach oben    #11
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Jo, das is mir klar.

Aber wer ohne phpDoc arbeitet (ich nehm mal an, das ist hier der Fall), und wenn der Editor keine vernünftige Config anbietet, dann is das nun mal so

Freilich würd ich das auch umstellen
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.03.2007, 20:05 Nach oben    #12
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.203
Standard

okay... wieder was gelernt...
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zugriff auf Wert des vorhergenden Datensatzes in einer SQL Abfrage Jay Datenbanken 5 17.07.2006 15:25
Brauche hilfe bei einer SQL Abfrage philstrike Datenbanken 18 07.07.2006 09:15
MySQL: Abfrage aus zweiter Tabelle. Sebastian PHP-Programmierung 6 16.12.2005 00:01
Hilfe für SQL Abfrage Netty Datenbanken 1 19.05.2005 09:23
Abfrage über zwei Datenbanken Netty Datenbanken 1 19.05.2005 06:53


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:47 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44