Hilfe, Benötige Schleife in Schleife -> 2 Schleife funktioniert nicht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hilfe, Benötige Schleife in Schleife -> 2 Schleife funktioniert nicht

    Hallo,

    habe eine php Datei, die mir eine Excel liste zum Download gibt.
    Darin werden die diesjährigen Events(Datenbank1) und Mitgliederteilnahmeliste(Datenbank2) ausgeben, und angezeigt wer dabei ist und wer nicht.

    Bei der untersten Schleife wird mir nur die Teilnahme für ein Event ausgeben, statt für alle. Was mache ich mit dieser schleife Falsch?

    [COLOR=Gray]In der Datenbank der Mitglied-teilnahme gibt es eine Spalte mit der Event ID(Wegen der Zuordnung)[/COLOR]

    Komme nicht weiter, habe google bereits leergesucht.
    Danke im voraus!

    [COLOR=Sienna]Kein W3C-Validator -> Wird von Excel ausgelesen[/COLOR]

    PHP-Code:
    $mysqli = new mysqli($dbhost,$dbuser,$dbpass, $dbname);
    if (mysqli_connect_errno()) { printf("Keine Verbindung zur Datenbank!: %s\n", mysqli_connect_error()); exit(); }
    if (!$mysqli->set_charset("utf8")) { echo "Fehler beim Laden von UTF8 ". $mysqli->error; }

    $query_active = "SELECT 
                        * 
                    FROM 
                      `events` 
                    WHERE (month > $current_month 
                      AND year >= $current_year  
                      OR day >= $current_day)
                      AND (month = $current_month 
                      AND year >= $current_year  
                      OR year > $current_year)  
                      OR (month_show > $current_month 
                      AND year_show >= $current_year 
                      OR (day_show >= $current_day) 
                      AND month_show = $current_month 
                      AND year_show >= $current_year 
                      OR year_show > $current_year) 
                    ORDER BY year, month, day";  

    $query_all = "SELECT * FROM events ORDER BY year, month, day ASC";

    if ($status == "active") { 
        $result = $mysqli->query($query_active) or die($mysqli->error.__LINE__); 

    else if ($status=="all") { 
            $result = $mysqli->query($query_all) or die($mysqli->error.__LINE__); 
    }
    else { 
        $result = $mysqli->query($query_all) or die($mysqli->error.__LINE__); echo "Error! -» NEWS"; 
    }

    $result_useraktiv = $mysqli->query("SELECT * FROM Useraktiv") or die($mysqli->error.__LINE__);
    ?> 
     <tr class=xl671108 height=89 style='mso-height-source:userset;height:66.75pt'>
      <td height=89 class=xl691108 width=48 style='height:66.75pt;width:36pt'>ID</td>
      <td class=xl691108 width=157 style='width:118pt'>Mitglied</td>
    <?php
    $headerevent 
    "";
    $headeruser "";
    $status "";
    $usereintragfertig "";

    if(
    $result_useraktiv->num_rows 0) {
        
    $felder $mysqli->field_count;
        
    $mitglieder 2// Startposition Usereinträge WHERE event IN (".join(',',$id).")

        
    while ($mitglieder $felder) {
                
    $finfo $result_useraktiv->fetch_field_direct($mitglieder++);
                
    $user $finfo->name// Usernamen Array
        
                
    $headeruser .= "<tr class=xl711108 height=35 style='mso-height-source:userset;height:26.25pt'><td height=35 class=xl721108 width=48 style='height:26.25pt;width:36pt'>"
                
    .$mitglieder."</td><td class=xl721108 width=157 style='width:118pt'>".$user."</td>";
        
                while (
    $row $result->fetch_assoc()) {
                    
    $event stripslashes($row["event"]);
                    
    $headerevent .= "<td class=xl661108 width=96 style='width:72pt'>".$event."</td>";
                
                    
    $id $row['id'];
                
                    
    $result_user $mysqli->query("SELECT * FROM Useraktiv WHERE event = '$id'") or die($mysqli->error.__LINE__);
                
                        while (
    $usereintrag $result_user->fetch_assoc()) { // Usereinträge
                            
    if ($usereintrag[$user] == "0"
                            { 
                                
    $headeruser .= "<td class=xl701108 width=96 style='width:72pt'>x</td>";  // Usereinträge
                            
    }
                            elseif (
    $usereintrag[$user] == "1"
                            { 
                                
    $headeruser .= "<td class=xl701108 width=96 style='width:72pt'>+</td>"
                            }
                            elseif (
    $usereintrag[$user] == ""
                            { 
                                
    $headeruser .= "<td class=xl701108 width=96 style='width:72pt'>n/a</td>"
                            }
                    }
            }
    }
    Zuletzt geändert von Hyperxxx; 23.10.2014, 23:18.

  • #2
    Bitte formatier deinen Code so, dass man ihn lesen kann. Also nicht alles in einer Zeile.

    Danke
    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Nachtrag:
      Deine Bedingungen sind mit Sicherheit nicht sauber gekapselt. Da fehlen imho ein paar Klammern. Ein Schuss ins Blaue:
      PHP-Code:
      $query_active "SELECT 
                        * 
                      FROM 
                        `events` 
                      WHERE (month > 
      $current_month 
                        AND year >= 
      $current_year  
                        OR day >= 
      $current_day)
                        AND (month = 
      $current_month 
                        AND year >= 
      $current_year  
                        OR year > 
      $current_year)  
                        OR (month_show > 
      $current_month 
                        AND year_show >= 
      $current_year 
                        OR (day_show >= 
      $current_day
                        AND month_show = 
      $current_month 
                        AND year_show >= 
      $current_year 
                        OR year_show > 
      $current_year
                      ORDER BY year, month, day"

      Peter
      Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
      Meine Seite

      Kommentar


      • #4
        Du solltest Datenbankabfragen nicht mit der HTML-Ausgabe vermischen.

        Du solltest kein SELECT * verwenden, sondern _immer_ die Spalten im SELECT angeben, die du im Ergebnis erwartest.

        Du solltest keinen kaputten HTML-Code ausgeben (W3C-Validator).

        Du solltest nicht sinnlos die Funktion stripslashes() verwenden.

        Du solltest in Schleifen keine Datenbankabfragen ausführen.

        Und du solltest den Code so formatieren, dass man ihn auch vernünftig lesen kann.

        Bitte erstmal all diese Bedingungen erfüllen, ansonsten ist es sowieso sinnlos mit diesem Code zu arbeiten.

        Kommentar


        • #5
          Ich habe selten so schlechten Code gesehen. Die Datenbankstruktur ist "gelinde" gesagt "bescheiden".
          Code:
          $query_active = '
          -- this is an SQL comment, hence you can test the code as a PHP script and
          -- it will work, but you should remove these comments after copy + paste
          -- or you\'ll send large queries to your DB server, which in turn just
          -- ignores all these comments
          SELECT
              * -- despite some other recommendations, this is just fine, absolutely ok
                -- but it has to be admitted, that you should do that only, and only if
                --> you don\'t have tables with like 300 columns, because
                --> you didn\'t miss that class about data base normalization and
                --> you still remember the importance of effective indexing and hence
                --> you know what you are doing
          FROM
            `events` -- you could also use "ANSI quotes", but your mySQL server needs to
                     -- be properly configured to accept them as "events"
                     -- and you should use quotes always, yes, a l w a y s & everywhere
                     -- because quotes help you to find stupid mistakes early and
                     -- you can use column names like `SELECT`, `BETWEEN` and "DATE"
          WHERE
              -- `eventStart`>"' . date('Y-m-d H:i:S', $now) . '" -- worth trying :-)
              -- you could state that as > NOW(), but then the function NOW() gets called
              -- on every row to match because it is a non deterministic function
              -- `eventStart`>NOW() -- looks nice but it is a really bad idea!!!
              -- or you could write > FROM_UNIXTIME(\'.$mytimestamp.\'), which is a
              -- deterministic function and the result could be cached
              -- and yes, you should have a datetime or timestamp column for easy access
              -- or if you insist on using suboptimal queries, then go ahead and ask for
              (
                 `year`>' . (int) $current_year . ' -- any event in a future year
                  OR (
                      `year`=' . (int) $current_year . ' -- any event this year
                      AND (
                          `month`>' . (int) $current_month . '  -- but a future month
                          OR (
                              `month`=' . (int) $current_month . ' -- or this month
                              AND
                              `day`>=' . (int) $current_day . ' -- but a day we will see
                          )
                      )
                  )
              ) OR (
                 `year_show`>' . (int) $current_year . ' -- same for the other fields
                  OR (
                      `year_show`=' . (int) $current_year . '
                      AND (
                          `month_show`>' . (int) $current_month . '
                          OR (
                              `month_show`=' . (int) $current_month . '
                              AND
                              `day_show`>=' . (int) $current_day . '
                          )
                      )
                  )
              )
              -- timestamps provide access to past, present and future in just one go :-)
              -- and the queries you write are much easier to compose and to read and
              -- to understand (do your future self a favour and help make it readable)
          ORDER BY
                `year` ASC -- default sort order anyway, but this shall remind you of it
              , `month` ASC
              , `day` ASC
          ;
          ';
          und dann das
          Code:
          $result = $mysqli->query( ... );
          nur wird das Ergebnis dieser Datenbankabfrage NICHT genutzt. NICHT. Zumindest nicht in dem von Dir mitgesandten Auszug aus Deinem Quelltext.

          Gruß

          RB

          Kommentar


          • #6
            .....ich bin leider noch ein bisschen im Anfangsstadium, ich mach dies auch nicht beruflich etc. sondern bring mir php selbst bei. Ich werde den code dennoch schrittweise verbessern, und auch mehr ins object orientierte gehen.

            der Code funktioniert es wird auch für einen user die Teilnahme ausgeben nur fehlt mir da noch die schleife die für die restlichen user alles angibt.

            ich kann keinen Spaltennamen angeben da die Spaltennamen mit den usernamen(in der Teilnahme Datenbank) erstellt werden.(Beim anlegen von usern)


            Code:
             $result_user = $mysqli->query("SELECT * FROM Useraktiv WHERE event = '$id'") or die($mysqli->error.__LINE__);
                        
                                while ($usereintrag = $result_user->fetch_assoc()) { // Usereinträge
                                    if ($usereintrag[$user] == "0") 
                                    { 
                                        $headeruser .= "<td class=xl701108 width=96 style='width:72pt'>x</td>";  // Usereinträge
                                    }
                                    elseif ($usereintrag[$user] == "1") 
                                    { 
                                        $headeruser .= "<td class=xl701108 width=96 style='width:72pt'>+</td>"; 
                                    }
                                    elseif ($usereintrag[$user] == "") 
                                    { 
                                        $headeruser .= "<td class=xl701108 width=96 style='width:72pt'>n/a</td>"; 
                                    }

            Kommentar


            • #7
              Zitat von Hyperxxx Beitrag anzeigen
              ich kann keinen Spaltennamen angeben da die Spaltennamen mit den usernamen(in der Teilnahme Datenbank) erstellt werden.(Beim anlegen von usern)
              Dann ist dein Datenbank-Design kaputt. Die Spalten sollten sich zur Laufzeit nicht verändern.

              Stichwort: Datenbanknormalisierung

              Ein Programmierer muss immer wissen, welche Spalten es gibt.

              Kommentar


              • #8
                Danke für den hinweis, fand nur keine andere Lösung.

                wie erstelle ich dann am besten eine Tabelle wie folgt:
                User kommen durch erstellen hinzu, das selbe mit den Events.

                user = mitglied (werden nie die 100stk überschreiten)

                | | user1 | user2 | user3 |
                event1 | x | O | x |
                event2 | O | O | O |
                event3 | x | x | x |

                Kommentar


                • #9
                  user_id, event_id
                  1, 1
                  3, 1
                  1, 3
                  2, 3
                  3, 3

                  Kommentar

                  Lädt...
                  X