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

Wo sollte ich das vernünftig hinbasteln?
Naja prinzipiell ist ja folgendes möglich (ich habe keine Ahnung, ob das genau auf deine Situation passt, es tut mir Leid, aber dein Code ist mir zu kompliziert geworden, daher bleibe ich bei einem allgemeinen Beispiel):

Seite A:
<input type="hidden" value="2" name="foo">

Seite B:
if(isset($_POST['foo'])) print('<input type="hidden value="'.intval($_POST['foo']).'" name="foo">');

Seite C:
if(isset($_POST['foo'])) print('Hurra, foo wurde von Seite A bis hierher gebracht! Magie! In foo steht '.intval($_POST['foo']));
 
^^ Ne, das passt nicht wirklich auf mein Beispiel.

Das Problem bei mir ist, dass ein Datensatz in mehrere Tabellen geschrieben wird, weshalb das Eintragen nicht in einem Aufwaschen erledigt werden kann. Bei mir ist das ganze gesplittet und MITTENDRIN brauche ich die id der ersten "Hälfte des Datensatzes", um sie für die "zweite Hälfte" verwenden zu können.

(skizziert)
1) Aus der ganzen Eingabezeile (erste "Hälfte") --> INSERT Tätigkeit, Produkt und Beschreibung --> produkte
2) ermittle die (auto-increment) ID von genau diesem INSERT-query ^^
3) Aus der Eingabezeile (zweite "Hälfte") --> INSERT userid, taetprodid (= jetzt genau das aus 2) ), Zeit, Datum --> zeiten

^^ Dadurch ist jetzt 1 ganzer Datensatz in der DB gelandet.

Das Problem müsste jetzt sein, dass $taetprodid an der markierten Stelle nicht richtig eingesetzt wird bzw. leer ist, aber warum???
Code:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!($_SESSION['update'] == 1)) { 
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");             
            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }
                
            $taetprodid = mysqli_insert_id($mysqli);
            for ($b = 0; $b < 7; $b++) {               
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, [COLOR=royalblue]taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', [COLOR=royalblue]'$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $taetprodid AND datum = $ts;");
                }
            }
        }
    }
Wenn ein Eintrag in der DB noch nicht existiert, klappt das ja auch wunderbar. Aber wenn ein neuer Stundenwert einen alten ersetzen soll, dann landet dieser mit taetprodid=0 in zeiten und kann dadurch auch nicht richtg ausgelesen werden.

[EDIT]
Ja, hab's gerade durch echos überprüft: $taetprodid ist immer 0, wenn ich sie aus dem if rausnehme, in dem sie ihren Wert vom INSERT kriegt.
 
Zuletzt bearbeitet:
Ich glaube, die Editier-Funktion können wir vergessen?! Zum einen fällt mir nichts mehr ein, wie ich die jeweils korrekte ID noch in die unteren beiden $taetprodid reinkriegen soll, und zum anderen habe ich beim Testen gerade noch einen Fehler festgestellt: Es werden immer nur Veränderungen an der untersten editierbaren Zeile in die DB geschrieben, diejenigen darüber bleiben unverändert.

Dabei hätte ich gedacht, dass doch gerade diese for-Schleife bewirken sollte, dass alle Zeilen behandelt werden:
Code:
if (isset($_POST['confirm'])) {
       [COLOR=royalblue] for ($a = 1; $a <= $add; $a++) {            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!($_SESSION['update'] == 1)) {
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                $taetprodid = mysqli_insert_id($mysqli);
            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }
                
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $taetprodid AND datum = $ts;");
                }
            }
        }
    }
Auch da habe ich keinen Plan, wodurch das passieren könnte. 8h wären es (morgen) noch, aber ich bin mit meinem Latein am Ende ...
 
LOL!!!
Habe gerade in 2 Minuten die Lösung für die taetprodid gefunden:
Code:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!($_SESSION['update'] == 1)) {
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                [COLOR=royalblue]$_SESSION['taetprodid'] = mysqli_insert_id($mysqli);            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }
                
            for ($b = 0; $b < 7; $b++) {
                [COLOR=royalblue]$taetprodid = $_SESSION['taetprodid'];                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $taetprodid AND datum = $ts;");
                }
            }
        }
    }
Damit klappt das ganze Editieren wunderbar ... für 1 Zeile. Jetzt muss ich es nur mehr schaffen, dass mehrere Zeilen editierbar sind. Irgendwo muss da echt noch ein kleiner Fehler in einer Schleife sein?!

[EDIT]
Habe den Fehler schon gefunden: $add (Schleifenrundenlimit) ist immer 1. Jetzt noch rausfinden, warum ...

Die Ursache dafür muss wohl hierin liegen:
PHP:
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $_SESSION['update'] = 1;

            for ($a = 1; $a <= count($selected); $a++) {    
                $b = $a-1;    
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$b];");
                $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                    
                $_SESSION['prid'] = $selected[$b];
                echo '<td>'.$selected[$b].'</td><br>';
            }
        }
    }
      
    for ($a = count($selected)+1; $a <= $add+count($selected); $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</option>';
        }
        echo '</select></td>';

        echo '<td><input name="beschreibung'.$a.'" type="text" size="50" maxlength="250"></td>';

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
        }
    }
 
also, ihr habt ja gestern fleissig geschrieben, und ich weis nich mehr, ob ich alles gelesen hatte. aber wegen der editiererei... du kannst dich noch an das missverständnis erinnern? für mich wurde dieses "projekt" (wie wirs getauft haben) eindeutig durch tätigkeit und produkt identifiziert. also diese kombination, machte ein projekt aus. und: mehrere user knnen am selben projekt arbeiten. dann half ich dir, mit diesem "wissen" im hintergrund, die db-struktur zu bauen. das resultat ist nun eben, dass das nich so leicht änderbar ist ^^

es gäbe eine möglichkeit, das recht schmerzfrei zu ändern. also es klingt erstmal schmerzfrei ^^ du müsstest die user-id aus der zeiten tabelle in die projekt-tabelle überführen. die zeiten würden immernoch per projekt-id verknüpft, aber um den user der zeite herauszufinden, müsste man nun eben über die projekttabelle gehen. wie gesagt: das umzubauen in der db ist nicht allzuschwer. es ließe sich sicher auch was schreiben, dass die id's korrekt transferiert. aber im code selber seh ich nen riesen aufwand. da müssten sämtliche (zumindest sehr viele) queries umgebastelt werden, der row_collector müsste angepasst werden, beim speichern neuer daten müsste man anpassen... ist machbar, aber ob das fehlerfrei in den 8h klappt? ^^

aber, andere betrachtung:
wozu alles editierbar machen? folgendes bsp: ich baue ein jahr lang an nem haus. nach diesem jahr entscheide ich mich - ach nö, das war ein motorrad, dass ich aufgebaut hab? also entweder hab ich dran gearbeitet, oder nich ^^ und: auch andere haben ein haus gebaut (ihr eigenes haus, aufgrund des missverständnisses aber, wird alles nur als "hausbau" und nicht "mein hausbau" geführt) - haben die urplötzlich dann alle motorräder gebaut, nur weils einer verwechselt hat? ^^

was könnte man nun also machen?
- auf die schnelle die projektdaten nicht editierbar machen. nur die zeiten können angepasst werden. schnellste lösung, denk ich mal
- die projektdaten nur editierbar machen, wenn es noch keine zeiten dafür gibt.
- die projektdaten nur durch den admin editierbar machen
- oder: zeiten so editierbar machen, dass man sie einem anderen projekt anhängen kann. das kann ein weiterer button sein, der jede zeit der zeile mit ner checkbox versieht und am ende eine selectbox mit den projekten zur verfügung stellt. dann wird für alle angehakten die proj-id geändert. dann kann man ein neues projekt erstellen und die zeiten dorthin schieben.
 
Also im Moment ist es so, dass jeder User seine eigenen Einträge editieren kann (können sollte).

Worin liegt der Sinn, jetzt entweder nur die Projektdaten oder nur die Zeiten editierbar zu machen? Was, wenn ich mich bei einer Zeit vertippt habe, aber nur Tätigkeiten und Produkte ändern kann?

Alles umbauen kommt jedenfalls nicht mehr infrage, das ginge sich niemals mehr aus in den letzten paar Stunden. Da würden wir nur 1000 Fehler reinbringen und am Ende würde gar nichts mehr gehen. Am liebsten wär's mir immer noch, einfach eine ganze Zeile editierbar zu schaffen. Im Moment kämpfe ich damit, in $add den richtigen Wert zu übertragen, damit das Editieren für mehrere Zeilen klappt. Und dann habe ich rausgefunden, dass das Übertragen der taetprodid über eine SESSION-Variable nur 1x funktioniert, danach wird die Variable anscheinend gelöscht und ist erst wieder leer. Was dann wieder zu 0 in der DB führt.

[EDIT]
Das echo $add hier liefert mir auf jeden Fall den richtigen Wert, bei 2 Zeilen bspw. 2:
Code:
if (isset($_POST['confirm'])) {
       [COLOR=royalblue] echo 'add = '.$add;        for ($a = 1; $a <= [COLOR=royalblue]$add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!($_SESSION['update'] == 1)) {
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                $_SESSION['taetprodid'] = mysqli_insert_id($mysqli);
            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }
                
            for ($b = 0; $b < 7; $b++) {
                $taetprodid = $_SESSION['taetprodid'];
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $taetprodid AND datum = $ts;");
                }
            }
        }
    }
Warum ist dann aber nur 1 Zeile korrekt editierbar?
 
Zuletzt bearbeitet:
Worin liegt der Sinn, jetzt entweder nur die Projektdaten oder nur die Zeiten editierbar zu machen? Was, wenn ich mich bei einer Zeit vertippt habe, aber nur Tätigkeiten und Produkte ändern kann?
deswegen hab ich geschrieben: zeiten ändern sollte kein ding sein. aber die projektdaten (also tätigkeit und produkt) müssen im jetzigen stand eigentlich unverändert bleiben. und dass der umbau nich in frage kommt, hab ich ja selbst gesagt ;) aber, optionen wollt ich dennoch mal aufführen.
 
Zeiten ändern ist aber gerade das große Problem!!! Projektdaten ändern funktioniert einwandfrei ...

Ich kriege ja die verdammte taetprodid nicht ins zeiten-query rein!

[EDIT]
Ich behaupte jetzt mal ganz vorsichtig nach ersten Tests, dass sich so zumindest mal 1 ganze Zeile korrekt editieren lässt:
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!($_SESSION['update'] == 1)) {
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                $_SESSION['prid'] = mysqli_insert_id($mysqli);
            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }  
            
            for ($b = 0; $b < 7; $b++) {
                $taetprodid =  $_SESSION['prid'];      
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;");
                }
            }
        }
    }
Wenn ich jetzt noch rauskriegen würde, wie das auch bei mehreren Zeilen funktioniert, und das dann immer noch fehlerfrei läuft, hätten wir's. Aber SESSIONs sind leider wenig vorhersehbar. Kann sein, dass das ganze schon wieder nicht mehr geht, wenn ich das Programm neustarte oder sonst was mache.

[EDIT2]
Ja, scheint jetzt wirklich zumindest für 1 ganze Zeile (Projektdaten UND Zeiten) einwandfrei zu funktionieren. :)

$add kriegt auch den richtigen Wert, woran scheitert es dann also bei mehr als 1 Zeile?
 
Zuletzt bearbeitet:
^^ Bitte konkreter. Was genau soll das bezwecken? Wissen wir überhaupt, wodurch genau das Problem (nicht mehr als 1 Zeile editierbar) wirklich verursacht wird?

Übrigens hätte ich was ähnliches schon auf folgende Weise probiert gehabt, hat aber nur Blödsinn verursacht: "$taetprodid = $_SESSION['prid'].$a"
----------

Mein Auftraggeber hat sich das ganze gerade angeschaut, und er meint, wenn sich eine einzelne ausgewählte Zeile ganz korrekt editieren lässt (was jetzt eh der Fall ist), dann würde ihm das schon passen. Dafür habe ich beim Testen was anderes unschönes festgestellt, bei dem ich dachte, dass wir das schon gelöst hätten:

In auswerten2.php stimmt die sum-Zeile, die direkt unter der Tabelle aller Datensätze angezeigt wird, eben nur bei ALLEN Datensätzen. Filtere ich nach irgendwas, werden trotzdem für jeden Wochentag die Summen ALLER Einträge angezeigt.
Code:
$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'];
        } 
        $tmp1 = 0;       
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[2] = $row_collector[$taet_id]['taet'];
            $tmp1++;
            $tmp2 = count($row_collector);
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';                                  
            }
        } 
        [COLOR=royalblue]if ($tmp1 == $tmp2) {
            echo '  <tr>';
            echo '    <td>∑</td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Zeilen
                $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                $sum2 = mysqli_fetch_row($time_table2);
                if (!$sum2[0]) {
                    echo '    <td style="border:none"></td>';
                } else {
                    echo '    <td>'.$sum2[0].'</td>';
                }
            }        [COLOR=royalblue]    echo '  </tr>';
        }       
    }
1.PNG 2.PNG

^^ DAS wollen wir schon noch gelöst haben ...

[EDIT]
Wenn ich taetprodid ins WHERE des blauen querys mitreinnnehme und den blauen Code überhaupt rauf in die foreach Schleife reinbastle, dann kriege ich nach jeder Datensatz-Zeile eine Stunden-Zeile für genau diesen Datensatz. Da müsste man die Werte irgendwie addieren und dann aber nur als eine Gesamtzeile ausgeben lassen.

[EDIT2]
Ich versteh's auch irgendwie gerade nicht, wieso wir hier überhaupt ein Problem haben. Eigentlich müsste dieser Teil ...
PHP:
$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[2] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';
            }          
        } 
        echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Zeilen
            $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum2 = mysqli_fetch_row($time_table2);
            if (!$sum2[0]) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum2[0].'</td>';
            }
        }
        echo '  </tr>';
... doch ohnehin bei jedem neuen Seitenaufbau (was ja durch Filtern passiert) neu berechnet und mit den entsprechenden Daten befüllt werden?! Und der Code macht ja für diese Berechnung der Zeiten aller Tage auch das richtige. Er holt sich nur nicht die Daten gefilterter Datenstätze, sondern bleibt bei der Zeitberechnung bei den Daten ALLER Datensätze, wie sie auf der Vorseite (also vor dem Filtern) angezeigt werden.

???
 
Zuletzt bearbeitet:
^^ Bitte konkreter.
wie, konkreter? ^^

- du hast schon zig inputfelder gebaut, wie das geht, sollte also klar sein.
- du steuerst deine mehrzeiligen inputs über input-namen mit nem $a (also einer zahl am namen angehängt) hinten dran. mein "als name projID_$a" spielte genau darauf an. dachte, das wäre klar.
- nem inputfeld den type hidden statt text zu geben sollte auch nicht schwer sein
- den wert der projekt-id hast du auch irgendwo, das weisst du auf anhieb besser wie ich
- und wo das teil hingehört, sollte auch klar sein. an und für sich isses auch völlig wurscht, WO das teil is. es ist nicht sichtbar und durch namen und nummer eindeutig zu identifizieren.

und was es bringt? du bearbeitest doch die ganzen formularfelder irgendwo. zeile für zeile (für jedes $a). so greiffst du dann einfach aus diesem hiddenfeld die aktuelle id ab und kannst sie verwenden?
 
Ich habe die Fehlerursache schon gefunden, warum immer nur eine Zeile geupdatet wird:
Code:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!($_SESSION['update'] == 1)) {
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                $_SESSION['prid'] = mysqli_insert_id($mysqli);
            } else {
            	[COLOR="#4169e1"]echo 'prid = '.$_SESSION['prid'].'<br>';                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }  
            
            for ($b = 0; $b < 7; $b++) {
            	$taetprodid =  $_SESSION['prid'];      
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                	mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $taetprodid AND datum = $ts;");
                }
            }
        }
    }
^^ An der blau markierten Stelle kriegt er bei mehreren ausgewählten Einträgen für alle nur die selbe ID rein. Und dann update er eben nur den Eintrag, zu dem die ID gehört. An allen anderen Stellen im Code kriegt er allerdings witzigerweise alle unterschiedlichen korrekten IDs rein.

Muss ich mir also was für diese eine Stelle überlegen. Aber noch sehe ich das "warum" nicht. Warum's nur an dieser einen Stelle nicht klappt ...

Und dann wäre noch das, dass er die Zeiten-Zeile in der Ausgabe nicht neu berechnet.
 
Falls es noch wen interessiert: Ich hab's geschafft, dass man jetzt beliebig viele ausgewählte Einträge (und zwar die gesamten Daten jedes Eintrags ;)) editieren kann. Der Fehler war wirklich, dass für alle Einträge nur die ID des letztgewählten Eintrages an formular.php übertragen worden ist. Die Lösung war daher auch ganz simpel: Einfach aus der $_SESSION['prid']-Variable ein Array machen und die IDs der Einträge, die ja richtig ermittelt wurden, nacheinander reinschreiben, und dann eben nacheinander wieder auslesen. Dann werden sie nicht überschrieben, wie eben zuvor beim Speichern in einer normalen ($_SESSION-)Variable.

projektzeiterfassung.php:
Code:
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $_SESSION['update'] = 1;

            for ($a = 1; $a <= count($selected); $a++) {    
                $b = $a-1;    
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$b];");
                $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                    
                [COLOR=royalblue]$_SESSION['prid'][B][$a-1][/B] = $selected[$b];                echo '<td>'.$selected[$b].'</td><br>';
                $add = $a;
            }
        }
    }
formular.php:
Code:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            [COLOR=royalblue]$prid = $_SESSION['prid'][B][$a-1][/B];            
            if (!($_SESSION['update'] == 1)) {
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                [COLOR=royalblue]$_SESSION['insert_id'] = mysqli_insert_id($mysqli);            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".[COLOR=royalblue]$prid."';");
            }  
            
            [COLOR=royalblue]if (isset($_SESSION['prid'][B][$a-1][/B])) {
                   $taetprodid = $prid;
            } else {
                $taetprodid = $_SESSION['insert_id'];
            }            for ($b = 0; $b < 7; $b++) {                   
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = '".[COLOR=royalblue]$taetprodid."' AND datum = $ts;");
                }
            }
        }
    }
Damit schaue ich jetzt nur noch, dass ich heute oder morgen noch eine sich der Ausgabe entsprechend neu berechnende Gesamtstunden-pro-Tag-Zeile in auswerten2.php hinkriege, dann kriegt die Firma noch ein kleines Update nachgereicht, und das ganze Programm funktioniert, wie es soll. :)
Code:
$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[2] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';
            }          
        } 
        [COLOR=darkorchid]if (isset($_POST['auswertenall'])) { [COLOR=seagreen]// ATM Zeiten-Zeile wegen sonstiger nicht-neu-Berechnung nur bei "alle" anzeigen            echo '  <tr>';
            echo '    <td>∑</td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { 
                $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                $sum2 = mysqli_fetch_row($time_table2);
                if (!$sum2[0]) {
                    echo '    <td style="border:none"></td>';
                } else {
                    echo '    <td>'.$sum2[0].'</td>';
                }
            }
            echo '  </tr>';
        }    }
 
Zuletzt bearbeitet:
Yesss! Habe das auch noch hingekriegt. War tricky, aber jetzt wird auch die Stundenanzahl pro Tag für jede mögliche Ausgabe neu (und korrekt) berechnet ... ;)
Code:
foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[2] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = $td[0];");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';    
                /*************/
                [COLOR=royalblue]for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Zeilen
                    $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = $wochentag AND taetprodid = $td[0];");
                    $sum2 = mysqli_fetch_row($time_table2);
                    $day[$wochentag]+=$sum2[0];
                }
                echo '  </tr>';
            }          
        }
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            echo '    <td>'.$day[$wochentag].'</td>';
        }
Damit läuft jetzt das ganze Programm genau so, wie's soll. Ich gehe jetzt noch testen und optimieren. Thx again an BenRo und DarkMo für die Hilfe in der zweiten Projektphase! :daumen:

Unbenannt.PNG
 
Zuletzt bearbeitet:
Zum Glück hat das Trauerspiel doch noch ein Ende gefunden.
Was hat das gesamte Projekt denn letztendlich gekostet?
 
Zurück