[Apache, phpmyadmin, html, PHP, ...] Datenbank mit webbasiertem Zugriff erstellen

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Ich verstehe nicht, warum du es dir in deinem Beispiel so kompliziert machst:

PHP:
$name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;
    $abfrage = "SELECT name FROM user";
    $ergebnis = mysqli_query($mysqli, $abfrage);
    $anzahl = mysqli_num_rows($ergebnis);
    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }
    for ($z = 1; $z < count($name); $z += 2) {
        echo '['.$z.'] = '.$name[$z].'<br>';
    }


Was spricht beispielsweise hiergegen:

PHP:
    $row_coll = array();

    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");

    while ($row = mysqli_fetch_assoc($user_table)) {
        $row_coll[$row['id']] = $row['name'];
    }
    
    foreach ($row_coll as $id => name) {
        echo '['.$id.'] = '.$name.'<br>';

        /* Falls in den Klammern nicht die id, sondern eine fortlaufende Nummer angezeigt werden soll,
            stattdessen so (und vor dem foreach $i= 0; setzen): */
        // echo '['.$i++.'] = '.$name.'<br>';
    }

    $anzahl = count($row_coll); // falls die Anzahl später für irgendwas benötigt wird

    /* Der Sinn aller weiteren Zwischenschritte blieb mir unklar */
 
^^ Also wenn ich deine Version richtig verstehe, kriegen wir am Ende beide ein array raus, das Namen und IDs beinhaltet. Bei uns beiden $row_coll, nur dass ich das eben noch an $name übertrage. Bis hier hin ist es ja auch noch nicht das wirkliche Problem ...

Worauf es jetzt ankäme, wäre, dass wir im großen $row_collector bei $td[0] immer (also für jede Schleifenrunde bzw. Anzahl der Datensätze) die zur in $td[11] gespeicherten Projekt-ID zugehörige User-ID mit der in $row_coll (bzw. bei mir $name) gespeicherten User-ID abgleichen und dann den zugehörigen Namen ausgeben.

Vereinfacht dargestellt ($row_collector):
td[0] ... hier kommt Username rein
td[11] ... Projekt-ID
1) Abfrage: $name[0], $name[2], etc. == $user_id des aktuell betrachteten Projekts (siehe query) ???
2) wenn ja z. B. bei $name[2] --> $td[0] = $name[3] (weil Name immer einen Index nach der zugehörigen ID gespeichert wird)

So funktioniert genau das eben beschriebene allerdings nicht:
Code:
/**************/ 
    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;
    $abfrage = "SELECT name FROM user";
    $ergebnis = mysqli_query($mysqli, $abfrage);
    $anzahl = mysqli_num_rows($ergebnis);
    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }
    for ($z = 1; $z < count($name); $z += 2) {
        echo 'name['.$z.'] = '.$name[$z].'<br>';
    } 
    /**************/   
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {     
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }        
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                /**************/
                [COLOR=royalblue]$user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                echo $user_id.'<br>';
                $res = mysqli_query($mysqli, $user_id);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $res) {
                        $td[0] = $name[$j+1];
                        echo "td[0] = ".$td[0];
                    }
                }                /**************/
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
Aus irgendeinem Grund scheint das query in der Schleife nicht zu funktionieren. Das echo zeigt folgendes:

Unbenannt.PNG

^^ Kann das sein, dass PHP mein $user_id automatisch zu einem array macht, wo dann all diese userids drinnenstecken, mein mysql_query ($res) mit dem array(?) aber nichts anfangen kann? :huh: Eine andere Erklärung finde ich nicht. Aber irgendwie so muss es scheitern?!
Oder wird das query immer durch das nachfolgende query überschrieben, am Ende nur jenes mit id=24 ausgeführt, und die gehört natürlich zu "test"? Dann würd's zwar funktionieren, aber halt semantisch nichts anderes machen können, als nur "test" zu liefern.
---------------

Allerdings hätte ich jetzt erstmal vorgehabt, die Filterfunktionen fertig zu basteln und mich erst danach nochmal um die Namensausgabe zu kümmern. Sollten wir diese nämlich nicht schaffen, könnten wir die zur Not nochmal rausschmeißen und das Programm käme auch ohne aus. Das witzige ist nämlich, dass die Namen "intern" völlig korrekt gespeichert zu werden scheinen! Obwohl nämlich z. B. vor sämtlichen Einträgen "test" angezeigt wird, kann ich ganz normal nach "M.E..." filtern und er zeigt mir dann völlig korrekt nur jene Einträge an, die in der DB dem User M.E... zugeordnet sind (dann plötzlich auch mit dem richtigen Namen). Verrückte Welt.

Wenn du mir helfen willst, dann schau dir bitte mein Posting ganz unten auf der Vorseite an. Das wäre jetzt erstmal wichtiger als diese Namensgeschichte hier ...
 
Zuletzt bearbeitet:
Als Ergänzung zu Posting #720:

Wenn ich das nach-Tätigkeit-filtern-query nur um die Produkt-ID erweitere, dann erhalte ich schon nur noch einen korrekten Eintrag. (Selbes gilt für nach-Produkt-filtern)
PHP:
WHERE
    z.datum >= '".$wochenanfang."' AND z.datum <=  '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit =  '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id
Das Problem ist jetzt allerdings, dass es bei diesem einen Eintrag bleibt, selbst wenn es mehrere Einträge zu unterschiedlichen Produkten mit dieser Tätigkeit gibt.
Das Problem für alles ist einfach dieser sch*** $row_collector, der alles nur einmal speichern kann und nach Lust und Laune überschreibt, wenn noch was nachkommt ... :motz:

Wie soll ich es so je schaffen, mehrere korrekte Zeilen für irgendwas auszugeben???
Kann man den ganzen verdammten $row_collector in ne Schleife mit der Durchlaufanzahl entsprechend der Anzahl der auszugebenden Datensätze stecken? Aber dann käme wahrscheinlich wieder zig mal das gleiche?!

[EDIT]
Ich frage mich nur gerade, wieso klappt eine mehrfache Zeilenausgabe (mit unterschiedlichen Datensätzen) beim User-filtern?

Sieht irgendwer einen gravierenden Unterschied zwischen den WHEREs in folgenden beiden queries:
PHP:
if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus 
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id 
                                        ORDER BY
                                            z.datum ASC;");
    }
 
Zuletzt bearbeitet:
Code:
/**************/ 
    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;
    $abfrage = "SELECT name FROM user";
    $ergebnis = mysqli_query($mysqli, $abfrage);
    $anzahl = mysqli_num_rows($ergebnis);
    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }
    for ($z = 1; $z < count($name); $z += 2) {
        echo 'name['.$z.'] = '.$name[$z].'<br>';
    } 
    /**************/   
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {     
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }        
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                /**************/
                [COLOR=royalblue]$user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                echo $user_id.'<br>';
                $res = mysqli_query($mysqli, $user_id);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $res) {
                        $td[0] = $name[$j+1];
                        echo "td[0] = ".$td[0];
                    }
                }                /**************/
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }

Der Code funktioniert nicht, weil $res ein mysqli-result-objekt ist:
PHP: mysqli_result - Manual
Um eine Zeile daraus als assoziativen Array zu erhalten, kannst du mit mysql_fetch_assoc arbeiten.
 
^^ Das sollte dann wohl so ausschauen:
PHP:
$user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                echo $user_id.'<br>';
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[0] = $name[$j+1];
                        echo "td[0] = ".$td[0];
                    }
                }
Ändert aber gar nichts am Problem, es wird immer noch nur "test" in der Namen-Spalte ausgegeben.

[EDIT]
Ne, stimmt schon, es musste ['userid'] statt ['id'] heißen.
----------

Warum ist es bei User-filtern sehr wohl möglich, für den selben User mehrere Zeilen auszugeben wenn sich die übrigen Daten unterscheiden, für Tätigkeiten- und Produkte-filtern aber nicht?
 
Habe mir nun deinen Code auf der letzten Seite angesehen. Im Query fehlt folgendes:
AND u.id=pr.userid AND p.id = pr.produkt

Also so:

PHP:
$db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.ID AND u.id=pr.userid AND p.id = pr.produkt
                                        ORDER BY
                                            z.datum ASC;");
EDIT:

Zu deinem Problem aus #725:

PHP:
$user_id = "SELECT name FROM user,projekte WHERE user.id =projekte.userid AND projekte.id = '".$td[11]."';";
// echo $user_id.'<br>';
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
echo 'Der Username lautet: '.$row['name'];
 
Zuletzt bearbeitet:
^^ #725 hat sich schon erledigt, ging noch leichter als in deinem Vorschlag. :)

Ich schau mir jetzt deinen Tipp fürs query an ...

BTW: Bitte unbedingt meine Kommentare an den queries dran lassen! Ich habe 5 sehr ähnliche von den Dingern. So weiß ich selbst nur schwer, von welchem wir gerade reden.

[EDIT]
Unter der Annahme, dass du dich auf das Tätigkeit-filtern-query bezogen hast und das WHERE dann ausschaut wie folgt, das funktioniert nicht. Da kommt dann nur "keine Einträge gefunden".
PHP:
WHERE
    z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND u.id = pr.userid AND p.id = pr.produkt AND z.taetprodid = pr.id
^^ Die Filterung ist m. E. viel zu "scharf". Das müsste doch eher "gelockert" werden, damit wir mehr Einträge kriegen?!
 
Zuletzt bearbeitet:
Naja, die User-Id der User- und Projekttabellen müssen halt korrespondieren, ebenso die Produkt-IDs.

Je nachdem, wonach du filterst, brauchst du einen anderen Query.
 
^^ Nach meinem Verständnis darf die User-ID weder im WHERE des Tätigkeit-filtern-query, noch im WHERE des Produkt-filtern-query vorkommen. Es kann ja theoretisch Einträge von ein und dem selben Produkt (bzw. der selben Tätigkeit) geben, aber für mehrere verschiedene User. Wenn wir den User auch ins WHERE mitreinnnehmen, filtern wir schon zu scharf.

Ich hätte halt geglaubt, es würde (jetzt für Tätigkeiten) reichen, aus projekte die Tätigkeit-ID zu holen, aus tätigkeiten den Namen, und dann noch die taetprodid aus zeiten mit der id aus projekte abzugleichen. Das hätte nach meinem Verständnis sämtliche Einträge für die ausgewählte Tätigkeit liefern müssen ... aber diese Kriterien liefern leider nur den zeitlich aktuellsten Eintrag.

:huh:

Derzeit:
PHP:
} elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND p.id = '".$prodid."' AND pr.produkt = '".$prodid."' AND t.id = '".$taetid."' AND z.taetprodid = pr.id
                                        ORDER BY
                                            z.datum ASC;");
    }
 
^^ Nach meinem Verständnis darf die User-ID weder im WHERE des Tätigkeit-filtern-query, noch im WHERE des Produkt-filtern-query vorkommen. Es kann ja theoretisch Einträge von ein und dem selben Produkt (bzw. der selben Tätigkeit) geben, aber für mehrere verschiedene User. Wenn wir den User auch ins WHERE mitreinnnehmen, filtern wir schon zu scharf.

Es geht nicht darum, nach user-id zu filtern, sondern darum, dass die Spalte id in der Tabelle user dem Feld userid in der Tabelle Projekte entspricht.

EDIT: Ah, sorry, muss natürlich die Tabelle Zeiten und nicht die Tabelle Projekte sein, also z.userid

liefern leider nur den zeitlich aktuellsten Eintrag.
Hast du mal probiert, testweise die zeitliche Einschränkung z.datum >= ... AND z.datum <= ... wegzulassen?
Stehen in $taetid und $prodid jeweils die korrekten Werte?
 
Code:
WHERE
     z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND [COLOR=royalblue]u.id = z.userid AND z.taetprodid = pr.id
... liefert leider auch nur eine Zeile für den aktuellsten Eintrag zu einer bestimmten Tätigkeit. :(

Zeitliche Einschränkung wegzulassen habe ich noch nicht probiert, dürfte aber auch gar keine Relevanz haben, da alle meine Einträge in der DB in der selben Woche sind und ich eh immer diese Woche auswählen muss, um überhaupt was angezeigt zu kriegen. Da kann mir kein "ich-habe-vergessen,-die-richtige-Woche-auszuwählen"-Fehler passieren.

Ich check nochmal schnell die taetid und prodid, aber eigentlich müssten auch die stimmen, weil deren Werte ja direkt per $_POST von dem ausgewählten dropdown-Feld in meinen Code reingeholt werden:
PHP:
if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
Ich könnte aber zum Testen mal die taetid von einer mehrfach vorkommenden Tätigkeit in das query "hardcoden". Dann hätten wir taetid (bzw. prodid) auch noch definitv ausgeschlossen.

[EDIT]
taetid und prodid müssen stimmen. Der Hardcode-Test hat auch nicht mehr als eine Zeile geliefert, der Fehler liegt woanders ...
 
Zuletzt bearbeitet:
Ich bekomme durchaus mehrere Zeilen aus meiner Testdatenbank.
Kannst du deinen Gesamtcode nochmal posten/hochladen?
 
Reicht dir meine auswerten2.php, oder brauchst du mehr files? Dann bitte nochmal sagen. Meine DB kann ich dir allerdings schwer mitgeben, weil da logischerweise sämtliche Firmeninfos drinnen sind.
PHP:
 <?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND p.id = '".$prodid."' AND pr.produkt = '".$prodid."' AND t.id = '".$taetid."' AND z.taetprodid = pr.id
                                        ORDER BY
                                            z.datum ASC;");
    } if (isset($_POST['kombination'])) { // nach Kombination filtern
        $db_erg = mysqli_query($mysqli, "SELECT
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id = '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."' AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");              
    }
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
    
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="11" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>';
    echo '      <th>Mitarbeiter</th>
                <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>';
    echo '        <th>ID</th>';
    echo '    </tr>';

    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    $anzahl = mysqli_num_rows($user_table);
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }  
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {     
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }        
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[0] = $name[$j+1];
                    }
                }
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    
    echo '<br><input type="submit" style="height:24px; width:100px" name="filterTaet" value="Tätigkeit >"> ';    
    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten fehlgeschlagen.<br>".mysqli_error());
    if (mysqli_num_rows($res_t)) {
        while ($row_t = mysqli_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }
    }
    echo '<tr><td><select name="filter_taetigkeit">';
    foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
    echo '</select></td><br><br>';
        
    echo '<input type="submit" style="height:24px; width:100px" name="filterProd" value="Produkt >"> ';
    $products = array();
    $res_p = mysqli_query($mysqli, "SELECT * FROM produkte") or die ("Get Produkte fehlgeschlagen.<br>".mysqli_error());
    if (mysqli_num_rows($res_p)) {
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
    }
    echo '<td><select name="filter_product">';
    foreach ($products as $product) {
        echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
    }
    echo '</select></td><br><br>';
    
    echo '<input type="submit" style="height:24px; width:100px" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" style="height:24px; width:140px" name="kombination" value="^^ Kombination"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
BTW: Das erste, das letzte, und das Kombinationen-query funktionieren einwandfrei. Es geht wirklich nur um Tätigkeit-filtern und Produkt-filtern.
 
Zuletzt bearbeitet:
Du verwendest $prodid auch im Query "filterTaet" und $taetid auch im Query "filterProd". Ist das denn so richtig?
 
Ich weiß nicht, ob's "richtig" ist, aber ich kann dir was zeigen ...

Query filterTaet ohne $prodid:

ohne.PNG

Query filterTaet mit $prodid:

mit.PNG

(für die queries bei filterProd verhält es sich genau so)

Wie du siehst, kriege ich ohne die $prodid meine Einträge für die gesamte Produktpalette ausgegeben, nicht nur für jene Produkte, für die es tatsächlich DB-Einträge mit dieser Tätigkeit gibt. Ich weiß nicht, ob die $prodid verhindert, dass mir gegebenenfalls mehr als 1 korrekter Datensatz angezeigt wird, aber wenn ich die $prodid wieder rausschmeißen soll, wie verhindere ich dann die Sinnlosausgabe aus Bild 1?
 
So sähe z. B. der korrekte Query für "filterTaet" aus:
PHP:
$db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."'  AND z.taetprodid = pr.id AND z.userid=u.id AND p.id=pr.produkt
                                        ORDER BY
                                            z.datum ASC");


Funktioniert bei mir und filtert korrekt nach Tätigkeit.

Und hier der "filterProd":
PHP:
$db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                             z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid=u.id AND p.id=pr.produkt AND t.id=pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC");
 
^^ Ja, funktioniert jetzt bei mir auch, allerdings verstehe ich gerade nicht ganz, wieso das gestern bei mir nicht ging, wo ich deine Tipps selbst ausprobiert hatte.

Spielt die Reihenfolge der Angaben im WHERE eine Rolle? Also, ob ich einen Vergleich vor oder nach einem bestimmten anderen schreibe?
Bzw., spielt es eine Rolle, ob ich "z.userid = u.id" oder "u.id = z.userid" sage?

Das wäre der einzige Unterschied, der mir zu meinen Versuchen von gestern auffällt ...
Immerhin geht's jetzt.
------------

Eine weitere Idee, die für sinnvolle Filterfunktionen eigentlich noch ergänzt werden sollte, ist mir gestern noch gekommen: Wenn ich da jetzt wirklich mehrere Datensätze (Zeilen) für eine bestimmte Filterung ausgegeben kriege, dann wär's ja jetzt noch interessant, zu sehen (berechnen), wie viele Stunden sind insgesamt (über alle angezeigten Einträge hinweg) a) an einem Tag gemacht worde, b) in einer Woche gemacht worden? Dazu müsste man sich halt die entsprechenden Zeitdaten aus der DB holen (stecken vielleicht jetzt sogar schon in den queries drinnen und wir könnten die gleich weiterverwenden *überleg*), addieren, und dann unter der jeweiligen Spalte bzw. neben der jeweiligen Zeile ausgeben.
------------

^^ Bevor ich das allerdings angehen möchte, gäbe es noch ein vorerst letztes Problem zu lösen, das ich zwar schon die ganze Zeit mitschleppe aber bewusst nicht erwähnt habe, damit wir uns nicht bei Korrekturversuchen was zerschießen solange die queries nicht gestimmt haben.

Wenn ich von projektzeiterfassung.php weiter gehe zu auswerten2.php, also dahin, wo mir erstmal der gesamte DB-Inhalt angezeigt wird, und ich dann DORT (in auswerten2.php) auf die Pfeiltasten zum Vor- und Zurückschalten der Kalenderwochen klicke, springt er automatisch zur Eingabemaske in projektzeiterfassung.php zurück anstatt korrekterweise in auswerten2.php zu bleiben und mir dort eventuell "Keine Einträge gefunden" anzuzeigen.
Das Problem ist genau zu dem Zeitpunkt zum ersten Mal aufgetreten, als ich meine Filter-Buttons und Felder ins Programm bzw. den Code eingebaut habe (in auswerten2.php).

Meine Vermutung ist, dass der Fehler jetzt irgendwo in meiner "verunstalteten" index.php liegt:
Code:
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');

    if (isset($_POST['export']) and isset($_SESSION['name'])) {
        include('export.php');
    } else {
        include('html_header.php');

        if (!isset($_SESSION['name'])) {
            if (isset($_POST['btnRegForm']) or $section == "register") {
                include('registrieren.php');
            } else {
                include('login.html');
            }
        } else {
            if (isset($_POST['auswerten']) or $section == "output") {
                include('auswerten.php');
            } [COLOR=royalblue]elseif (isset($_POST['filterName']) or $section == "output_admin") { 
                include('auswerten2.php');
            } elseif (isset($_POST['filterTaet']) or $section == "output_admin") {
                include('auswerten2.php');
            } elseif (isset($_POST['filterProd']) or $section == "output_admin") {
                include('auswerten2.php');
            } elseif (isset($_POST['kombination']) or $section == "output_admin") { 
                include('auswerten2.php');
            } elseif (isset($_POST['auswertenall']) or $section == "output_admin") {
                include('auswerten2.php');
            } else {
                include('projektzeiterfassung.php');
            }
        }
    
        include('html_footer.php');
    }
Wobei's allerdings gewünscht wäre, dass er in auswerten2.php bleibt. Drum sehe ich jetzt den Fehler nicht, aber seit ich das alles eben so umgebaut bzw. erweitert habe, habe ich ihn.

Ich bin mir auch nicht so ganz sicher, ob ich nicht "im Übereifer" an zu vielen Stellen überprüfe, was gerade angeklickt wurde?! Zum einen eben in index.php, zum anderen aber eben auch vor den queries in auswerten2.php. Und in formular.php, das ja eigentlich für Buttons zuständig wäre, gar nicht.
Das normale auswerten.php (für normale Mitarbeiter, nicht Admin) funktioniert noch einwandfrei und der einzige Unterschied zu auswerten2.php sind eben die Filterfunktionen in letzterem ...
Code:
 <?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    [COLOR=royalblue]if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    [COLOR=royalblue]} elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt 
                                        ORDER BY
                                            z.datum ASC;");
    [COLOR=royalblue]} elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                             z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt AND t.id = pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC;");
    [COLOR=royalblue]} if (isset($_POST['kombination'])) { // nach Kombination filtern
        $db_erg = mysqli_query($mysqli, "SELECT
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id = '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."' AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
    [COLOR=royalblue]} elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");              
    }
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
    
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="11" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>';
    echo '      <th>Mitarbeiter</th>
                <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>';
    echo '        <th>ID</th>';
    echo '    </tr>';

    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    $anzahl = mysqli_num_rows($user_table);
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }  
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {     
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }        
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[0] = $name[$j+1];
                    }
                }
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    
    [COLOR=royalblue]echo '<br><input type="submit" style="height:24px; width:100px" name="filterTaet" value="Tätigkeit >"> ';    
    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten fehlgeschlagen.<br>".mysqli_error());
    if (mysqli_num_rows($res_t)) {
        while ($row_t = mysqli_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }
    }
    echo '<tr><td><select name="filter_taetigkeit">';
    foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
    echo '</select></td><br><br>';
        
    [COLOR=royalblue]echo '<input type="submit" style="height:24px; width:100px" name="filterProd" value="Produkt >"> ';    $products = array();
    $res_p = mysqli_query($mysqli, "SELECT * FROM produkte") or die ("Get Produkte fehlgeschlagen.<br>".mysqli_error());
    if (mysqli_num_rows($res_p)) {
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
    }
    echo '<td><select name="filter_product">';
    foreach ($products as $product) {
        echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
    }
    echo '</select></td><br><br>';
    
    [COLOR=royalblue]echo '<input type="submit" style="height:24px; width:100px" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" style="height:24px; width:140px" name="kombination" value="^^ Kombination"><br><br><br><br>';    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
 
Zuletzt bearbeitet:
Die Reihenfolge (ob ich "z.userid = u.id" oder "u.id = z.userid" sage) spielt hier keine Rolle. Vielleicht hattest du einfach nen Schreibfehler drin.

Für die Berechnung der Gesamtstundenzahl, verwende die SQL-Funktion SUM(). Wenn du "mysql SUM()" googelst findest du Erklärung und Beispiele.

Deine index.php ist allerdings verunstaltet. Wenn man sich das hier durch den Kopf gehen lässt:
ODER WENN (X der Fall ist ODER $section "output_admin" ist)
ODER WENN (Y der Fall ist ODER $section "output_admin" ist)
ODER WENN (Z der Fall ist ODER $section "output_admin" ist)
sollte eigentlich schnell klar werden, dass man das einfacher haben kann. Allgemein gilt: Wenn man den selben Code mehr als zweimal irgendwo hinschreiben oder hinkopieren muss, hat man fast sicher einen Denkfehler. Der Sinn von Programmierung ist ja gerade, Dinge zu automatisieren und zu vereinfachen.

Hier eine kürzere Fassung, die genau das gleiche tut wie oben (d. h. falls ein Fehler drin ist, ist der nach wie vor drin):
PHP:
<?php
     session_start();
     session_regenerate_id();
     include('config.php');
     include('formular.php');
     if (isset($_POST['export']) and isset($_SESSION['name'])) {
         include('export.php');
     } else {
         include('html_header.php');
         if (!isset($_SESSION['name'])) {
            if (isset($_POST['btnRegForm']) or $section == "register") {
                 include('registrieren.php');
            } else {
                 include('login.html');
            }
         } else {
             if (isset($_POST['auswerten']) or $section == "output") {
                 include('auswerten.php');
             } elseif ($section == "output_admin" or isset($_POST['filterName']) 
                      or isset($_POST['filterTaet']) or isset($_POST['filterProd'])
                      or isset($_POST['kombination']) or isset($_POST['auswertenall'])
                      ) {
                 include('auswerten2.php');
             } else {
                 include('projektzeiterfassung.php');
             }
         }
         include('html_footer.php');
     }
(Hmm... Ein paar Einrückungen haben sich beim Kopieren verschoben seltsam)

Ich werd mich jetzt nicht in das konkrete Problem einarbeiten, sieht kompliziert aus. Zur Fehlersuche empfehle ich einfach mal herauszufinden, was in $section steckt.
 
Das Problem ist geblieben. Er springt immer zu projektzeiterfassung.php sobald ich in auswerten2.php die Kalenderwochen durchzuschalten versuche ...

Ich hätte ja ursprünglich versucht, das Filter-Button-auswerten wie alle anderen Buttons auch in formular.php unterzubringen, aber ich kann ja dort keine queries und Ausgabe reinbasteln, die ich dann in auswerten2.php sehen will?! Und von formular.php aus auswerten2.php aufzurufen hätte auch nicht viel Sinn gemacht, weil ich dadurch wieder die index.php umgangen wäre.
Der Aufbau ist halt ne verzwickte Sache, jetzt mit den Filterfunktionen erst recht, aber ich wüsste nicht, wie ich das umbauen sollte. Ja, ich schau mir mal den Inhalt von $section an ...

[EDIT]
BenRo, du könntest mit deiner Vermutung richtig liegen.
PHP:
echo 'auswerten2.php = '.$section;
^^ in auswerten2.php ergibt "auswerten2.php = pze", eigentlich sollten wir aber "auswerten_admin" statt "pze" kriegen. Das hilft mir schon mal sehr weiter. Jetzt nur noch die Quelle des Fehlers finden.
 
Zuletzt bearbeitet:
Hm, in formular.php habe ich jetzt folgendes hinzugefügt, das offenbar gefehlt hatte:
PHP:
if (isset($_POST['filterName']) or isset($_POST['filterTaet']) or isset($_POST['filterProd']) or isset($_POST['kombination']) or isset($_POST['auswertenall']) or $section == "output_admin") { 
    $site_title = "Ausgabe (Admin)";
    $section = "output_admin";
    }
Jetzt kriege ich auch die richtige Ausgabe in auswerten2.php:

Unbenannt.PNG

Aber wenn ich jetzt versuche, in auswerten2.php die KWs durchzuschalten, dann kriege ich das:

2.PNG

Und die Fehlermeldung kann nur durch ein fehlerhaftes query in auswerten2.php zustande kommen:
Code:
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM 
                                            zeiten AS z, 
                                            projekte AS pr, 
                                            user AS u, 
                                            taetigkeiten AS t, 
                                            produkte AS p 
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id 
                                        ORDER BY 
                                            z.datum ASC;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                             pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $db_erg = mysqli_query($mysqli, "SELECT
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                             z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt AND t.id = pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC;");
    } if (isset($_POST['kombination'])) { // nach Kombination filtern
        $db_erg = mysqli_query($mysqli, "SELECT
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit,
                                            p.produkt AS Produkt,
                                            t.id AS tID,
                                            p.id AS pID,
                                            pr.beschreibung AS Beschreibung,
                                            u.name AS User,
                                            z.zeit AS Zeit,
                                            z.datum AS Datum
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id = '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."' AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $db_erg = mysqli_query($mysqli, "SELECT 
                                            pr.id AS prID,
                                            t.taetigkeit AS Taetigkeit, 
                                            p.produkt AS Produkt, 
                                            t.id AS tID, 
                                            p.id AS pID, 
                                            pr.beschreibung AS Beschreibung, 
                                            u.name AS User, 
                                            z.zeit AS Zeit, 
                                            z.datum AS Datum 
                                        FROM
                                            zeiten AS z,
                                            projekte AS pr,
                                            user AS u,
                                            taetigkeiten AS t,
                                            produkte AS p
                                        WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");              
    }
    [COLOR=royalblue]if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
Fragt sich nur, wodurch das jetzt wieder passiert. Einmal funktioniert's definitiv, wenn ich von projektzeiterfassung.php zum ersten Mal nach auswerten2.php komme. Aber sobald ich dann die KW vor- oder zurückschalten will, müsste er ja nach meinem Verständnis das query, das den gesamten DB-Inhalt ausliest, nochmal durchführen und auswerten2.php dann mit aktualisierten Daten nochmal aufbauen?! Aber daran scheitert es dann ...

:huh:
 
Zurück