kostenloser Webspace werbefrei: lima-city


Problem beim verketteten(?) Abfragen von MySQL Tabellen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    bergewoelfe

    bergewoelfe hat kostenlosen Webspace.

    Hallo Profis,

    ich bin neu in PHP und MySQL, deshalb ist vermutlich mein Problem, das ich habe auch trivial, trotzdem wäre es schön, wenn ihr mir helfen könntet. Ich bin gerade dabei einen Ergebnisdienst für unseren Tischfußballverein zu bauen

    Ich habe drei Tabellen:

    +Spieler
    -Beinhaltet die Namen aller Spieler
    +Eintrag
    -Hier werden alle Spielergebnisse gespeichert
    +Hausliga
    -Die Tabelle, in der alle Ergebnisse ausgewertet abgelegt werden.

    Nun möchte ich die Spielernamen aus der Tabelle Spieler abrufen, die Punkte für jeden einzelnen errechnen lassen und diese dann in die Tabelle Hausliga schreiben lassen.

    Wenn ich diesen Code jedoch ausführen lasse, bekomme ich zwei Fehlermeldungen:
    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /data/multiserv/users/589801/projects/2052548/www/logindex.php on line 47

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /data/multiserv/users/589801/projects/2052548/www/logindex.php on line 43



    $abfrage = "SELECT spieler FROM Spieler";
    $ergebnis = mysql_query($abfrage);
    while($spieler = mysql_fetch_object($ergebnis)) //Zeile 43
    {
    $abfrage = "SELECT SUM(punkte) WHERE spieler= '".$spieler->spieler."' as gespunkte FROM Eintrag";
    $ergebnis = mysql_query($abfrage);
    $punkte = mysql_fetch_object($ergebnis); //Zeile 47
    $aendern = "UPDATE Hausliga Set
    punkte = '".$punkte->gespunkte."'
    WHERE name = '".$spieler->spieler."'";
    $update = mysql_query($aendern);
    }

    Ich weiß, dass das Thema Redundanz immer ganz groß geschrieben wird und ich mit der Dopplung der Spielernamen dagegen verstoße. Aber das dürfte doch nicht Ursache für mein Problem sein oder?


    Danke schon mal für eure Antworten :)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo bergewoelfe,

    kann es sein, dass die Abfrage fehlschlägt und daher $ergebnis == FALSE ist?
    Versuche mal folgendes:
    $ergebnis = mysql_query($abfrage);
    if (!$ergebnis) {
        die('MySQL Fehler: ' . mysql_error());
    }
    Was mir noch aufgefallen ist: In den Abfragen fangen die Tabellenname mit Großbuchstaben an. Es kann sein, dass Du den Name daher in Backticks setzen musst sofern die Tabellenamen wirklich mit Großbuchstaben beginnen:
    SELECT spieler FROM `Spieler`
    und
    UPDATE `Hausliga` SET ...

  4. Autor dieses Themas

    bergewoelfe

    bergewoelfe hat kostenlosen Webspace.

    Das habe ich jetzt ausprobiert. Zuerst meinte er die Syntax wäre falsch. Nachdem ich das geändert hatte trug er dennoch nichts in die Tabelle Hausliga ein, gab aber auch keinen Fehler aus. Mit den Hochkommata habe ich auch ausprobiert. Da hat sich aber auch nichts zum positiven entwickelt....

    Hoffe ihr könnt mir nochmal weiterhelfen...:)
  5. Hallo bergewoelfe,

    kannst Du vielleicht mal kurz angeben, wie die Tabellen genau aussehen? Oder vielleicht sogar die CREATE TABLE Statements?
    Wichtig währe der genaue Tabellenname und der genaue Spalten-/Feldname (Groß-/Kleinschreibung beachten).
    In etwa so (oder soweit wie Du halt kommst):
    Tabelle: Spieler
    id SERIAL PRIMARY KEY
    spieler TEXT NOT NULL
    ...

    Edit: Die Punkteabfrage muss so aussehen:
    SELECT SUM(punkte) AS gespunkte WHERE spieler= '".$spieler->spieler."'  FROM Eintrag
    und beim UPDATE kannst Du eigentlich auf die Hochkommata bei 'punkte' verzichten, da es sich um ein Zahl und nicht um Text handelt:
    $aendern = "UPDATE Hausliga SET punkte = ".$punkte->gespunkte." WHERE name = '".$spieler->spieler."'";



    Beitrag zuletzt geändert: 3.5.2012 23:18:51 von darkpandemic
  6. probiere es mal so. wenn 'ERROR' rot zu sehen ist, dann ist es noch immer schlimm :o(
    <?php
    
    error_reporting(E_ALL | E_STRICT);
    
    $abfrage1 = "SELECT spieler
    FROM Spieler";
    if(!$ergebnis1 = mysql_query($abfrage1)) {err(__LINE__);}
    
    while($spieler = mysql_fetch_object($ergebnis1)) { //Zeile nn
    
      $abfrage2  = <<< EOT
    SELECT SUM(punkte) gespunkte
    FROM Eintrag
      WHERE spieler= '{$spieler->spieler}'
    EOT;
      if(!$ergebnis2 = mysql_query($abfrage2)) {err(__LINE__);}
    
      $punkte = mysql_fetch_object($ergebnis2); //Zeile nn+9
    
      $aendern = <<< EOT
    UPDATE Hausliga
    SET punkte={$punkte->gespunkte}
      WHERE name='{$spieler->spieler}'
    EOT;
      if(!$update = mysql_query($aendern)) {err(__LINE__);}
    
    }
    exit('kein fehler ist aufgetreten');
    
    function err($line) {
      exit('<p style="color:#f00;font-weight:bold;">ERROR:</p><pre>'.print_r(array(mysql_errno(), mysql_error()), true));
    }

    vorschlag: strukturiere deine queries immer so
    SELECT ...
    FROM ...
    WHERE ...
    ...
    auch dann wenn's ganz einfach ist, weil dann kommt keine blöde aussage wie 'syntax fehler in zeile 1 ...'.

    bemerkungen:
    1. error_reporting ist immens wichtig für die entwicklung. (es gibt leute, die fehlermeldungen mit @ unterdrücken. geselle dich nicht zu dieser gruppe. wenn du keinen fehler mehr hast kannst es auskommentieren);
    2. du überschreibst in der while schleife deine schleifenwariable '$ergebnis' (so habe ich $ergebnis2 engeführt);
    3. @darkpandemic
    SELECT SUM(punkte) AS gespunkte WHERE spieler= '".$spieler->spieler."'  FROM Eintrag
    ist noch immer inkorrekt;
    4. richtig gemacht brauchst du das ganze brimborium von
    ...'". $bls . "' ...
    übrhaupt nicht (hochkomma setzung). erhöht die lesbarkeit ;)

    ==== EDIT:
    in der eile ist es ausgeblieben, sehe dir mal auch das an: SELECT ... FOR UPDATE

    Beitrag zuletzt geändert: 4.5.2012 13:47:53 von hemiolos
  7. Autor dieses Themas

    bergewoelfe

    bergewoelfe hat kostenlosen Webspace.

    Oh man ja :D Ich sagte ja, der Fehler sei total dämlich.... Danke schön :)
    Aber uaf das mit der fehlerhaften Syntax wäre ich nicht gekommen, hättest du es nicht gesagt. Jetzt funktioniert alles und ich bin glücklich :)
    Das mit der Unsicherheit der UPDATE Funktion schau ich mir nachher mal genauer an.
    Und danke auch für die Tipps :)
    Und auch darkpandemic hat mich weiter gebracht. Hatte nämlich die Spalte Punkte als VARCHAR deklariert, weil er bei INT immer aufgerundet hat, anstatt FLOAT zu nehmen :)

    Also nochmal danke schön euch beiden für die Mühe :)

  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!