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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
^^ Genau das mache ich doch in meinen queries (nur dass ich keinen AS Name vergebe)?! Und die Schleife ist dafür, dass ich das zweite query für jeden Wochentag durchführen kann ...
Er macht ja jetzt auch das richtige, allerdings hängt das eben in der übergeordneten foreach-Schleife drinnen, die bei 3 Datensätzen 3x durchläuft, und dadurch bekomme halt ich meine Zeile mit den SUM-Ergebnissen auch 3x ausgegeben. Jeweils über einem Datensatz.

Das "über" kommt daher, dass ich die eigentliche Ausgabeschleife unter dem geposteten Code-Schnipsel haben muss, weil dort ja $td[12] verwendet wird, das aber vorher noch durch $sum1 einen Wert erhalten muss.

Die for-Schleife mit den "$wochentag" ist jedenfalls nicht das Problem. Ich müsste es nur irgendwie schaffen, dass das 1x ausgeführt wird und nicht in der Anzahl der auszugebenden Datensätze. Und dann halt noch unter den Datensätzen und nicht darüber.
 
Zuletzt bearbeitet:
Das GROUP BY ist der entscheidende Unterschied.
Damit muss du nicht 7mal die Datenbank anquerien sondern nur einmal.
 
Zuletzt bearbeitet:
DB-Queries in Schleifen sind immer eine sehr gute Idee. Quasi ne Arbeitsbeschaffungsmaßname für Datenbanken.
 
Das GROUP BY ist der entscheidende Unterschied.
Damit muss du nicht 7mal die Datenbank anquerien sondern nur einmal.
Okay, aber das ändert ja an meinem jetzigen Problem nichts. Habe ich 3 Datensätze, kriege ich 3x meine Zeitberechnugszeile ausgegeben, völlig unabhängig von den 7 Wochentagen.
DAS müsste gelöst werden.

Das liegt an der übergeordneten foreach-Schleife, deren Durchlaufanzahl die Anzahl der auszugebenden Datensätze ist. Ich kann meinen Zeitberechnungscode aber nicht einfach außerhalb hinbasteln, was ich ja bis heute Morgen noch hatte, weil der dann bei veränderter Ausgabe nicht dynamisch neu berechnet wird.
 
Zuletzt bearbeitet:
Na, dann nimms doch einfach aus dem foreach raus. Stells davor oder danach oder sonstwohin.

Edit: Du musst ja auch nicht alles immer sobald es berechnet ist per echo ausgeben. Kannst ja auch Dinge einer Variable zuweisen und dann einmalig ausgeben.

PHP:
$test = '<p>Diese Variable enthält ein HTML-Fragment und darin Text, der beschreibt, was diese Variable enthält.</p>';
// Hier passieren viele Dinge
echo $test;
 
Zuletzt bearbeitet:
Na, dann nimms doch einfach aus dem foreach raus. Stells davor oder danach oder sonstwohin.
Das liegt an der übergeordneten foreach-Schleife, deren Durchlaufanzahl die Anzahl der auszugebenden Datensätze ist. Ich kann meinen Zeitberechnungscode aber nicht einfach außerhalb hinbasteln, was ich ja bis heute Morgen noch hatte, weil der dann bei veränderter Ausgabe nicht dynamisch neu berechnet wird.
.....
 
wenn die Summe x mal ausgegebn wird dann gib die Summe doch einfach nur aus wenn du im letzten Durchlauf bist...

if(letzterDurchlauf)
{
echo 'Summe';
}
 
^^ Das habe ich alles gestern selber schon probiert, aber so einfach klappt das nicht ...

BenRo's Idee würde im Code so ausschauen:
PHP:
                /**************/              
                $tmp = 0;
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                    $sum2 = mysqli_fetch_row($time_table2);
                    $tmp = $sum2[0];
                    $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>';
        if (!$sum2[0]) {
            echo '    <td style="border:none"></td>';
        } else {
            echo '    <td>'.$tmp.'</td>';
        }
        echo '  </tr>';
Ergebnis:

Unbenannt.PNG

Und bei dem Ansatz mit der letzten Schleifenrunder habe ich gestern gar keine Ausgabe für diese eine Zeile gekriegt, obwohl der Variableninhalt gestimmt hätte. Aber das schaue ich mir jetzt trotzdem nochmal an.

[EDIT]
Okay, jetzt hat's zur Abwechslung doch mal geklappt:
Code:
[COLOR=royalblue]$tmp1 = 0;       
        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) {
                [COLOR=royalblue]$tmp1++;     
                $tmp2 = count($row_collector[$taet_id]['data']);                $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] = ' ';
                    }
                }
                /**************/
                [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) {
                        $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                        $sum1 = mysqli_fetch_row($time_table1);
                        $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                        $sum2 = mysqli_fetch_row($time_table2);
                        [COLOR=darkorchid]$td[12] = $sum1[0];                        if (!$sum2[0]) {
                            echo '    <td style="border:none"></td>';
                        } else {
                            echo '    <td>'.$sum2[0].'</td>';
                        }
                    }
                    echo '  </tr>';
                [COLOR=royalblue]}                /**************/
                echo '  <tr>';
                [COLOR=darkorchid]for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }                echo '  </tr>';
            }
        }
Allerdings habe ich die eine Zeile immer noch über allen Datensätzen (also, nur über dem obersten). Jetzt nur noch einen Weg finden, wie ich sie darunter anhängen kann ...
Das Problem dafür sind die violetten Teile, die in der jetzigen Reihenfolge stattfinden müssen.

[EDIT2]
So, jetzt habe ich das komplett richtig. :)
PHP:
       $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) {
                    $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>';
                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) {
                        $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:
Damit bleibt jetzt vorerst nur noch eine einzige allerletzte Aufgabe, dann wäre das Projekt abgeschlossen.

Und zwar die Editier-Funktion, an der ich in den letzten Tagen wieder gearbeitet hatte ...
Der aktuelle Stand sieht wie folgt aus:

Unbenannt.PNG

Der Code dazu:
Code:
echo '<table>';
    if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $a = count($selected); // Anzahl der Zeilen
            
            $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;
                }
            }
             
            $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;
                }
            }
            
            for ($j = 0; $j < count($selected); $j++) {                          
                [COLOR=royalblue]$taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j]");
                $row_taetid1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                $init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id = $row_taetid1[0]");
                $row_taetid2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $taetigkeit) {
                    echo '<option value="'.$row_taetid1[0].'" selected>'.$row_taetid2[0].'</option>';
                }
                echo '</select></td>';
                
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$j]");
                $row_prodid1 = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                $init_prod = mysqli_query($mysqli, "SELECT produkt FROM produkte WHERE id = $row_prodid1[0]");
                $row_prodid2 = mysqli_fetch_row($init_prod); // produkt aus produkte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $product) {
                    echo '<option value="'.$row_prodid1[0].'" selected>'.$row_prodid2[0].'</option>';
                }
                echo '</select></td>';                
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$j]");
                $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>';
                
                [COLOR=royalblue]for ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
                    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = '".$selected[$j]."', datum = '".$i."';");
                    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
                    if (!$hours) {
                        echo "nope!<br>";
                    }
                    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
                }                echo '<td>'.$selected[$j].'</td><br>';
                            
                /*$update1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['poduct']."', beschreibung = '".$_POST['beschreibung']."', erstellt = '".$erstellt."' WHERE id = '".$selected[$j]."';");
                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];
                        $update2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit = '".$dauer."' WHERE taetprodid = '".$selected[$j]."' AND datum = '".$ts."';");
                    }
                }*/      
            }
        }
    }
    echo '</table>';
Die beiden Probleme damit sind, dass zwar beim Vorbelegen der Dropdowns das richtige Produkt bzw. die richtige Tätigkeit ausgewählt zu werden scheint, aber leider bestehen die gesamten Dropdowns nur aus diesem einen Produkt bzw. dieser einen Tätigkeit.
Und bei den Stunden jedes Tages kriege ich keine Ausgabe, was irgendwie schon am query scheitern dürfte, weil das "nope!" ausgegeben wird.

:huh:

BTW, die Idee wäre: Erstmal den Code für diese dynamische Zeile zu haben, die Daten eines ausgewählten Datensatzes aus der DB holt und sich damit vorbelegt. Sobald das steht, wäre dann zu überlegen, wie und vor allem wo der Code in auswerten.php einzubauen ist. Mit etwas Glück brauchen wir etwa die Hälfte von dem gespoilerten Code hier dann am Ende gar nicht (nochmal), weil ja Teile davon schon in auswerten.php vorhanden sind.
 
Zuletzt bearbeitet:
wieso so kompliziert? erstell dir doch nen array mit 7 werten für die 7 tage. gibst du beim tabellen aufbau eine zeit aus, wird dieser zeitwert zum array-wert addiert und gut is. man muss nicht zwingend alles per db lösen ^^ grobe vorstellung:

Code:
sum = array();
for(i=0; i<7; i++) sum[ts[i]] = 0; // initialisieren mit 0, als key wird unser timestamp für den tag benutzt

// tabelle erstellen...
for each(tabellenzeile)
    // projekt-geblubber (tät, prod...)
    row_sum = 0;
    for each(tag-spalte mit dem ts gedingse) {
        if(zeit[ts] > 0) {
            echo <td>zeit[ts]</td>;
            sum[ts] += zeit[ts];
            row_sum += zeit[ts];
        }
    }
    echo <td>row_sum</td>;
}
// edit: die sum ausgabe vergessen ^^
for each(sum-spalte mit dem ts gedingse) {
    if(sum[ts] > 0) {
        echo <td>sum[ts]</td>;
    } else {
        echo leerzelle;
    }
}
und wie gesagt: SKIZZIERT ^^

btw: hab grad nich so derb zeit, daher bin ich so still. das bissl was ich hab, zogg ich grad ^^ und ben hilft ja gut aus :D
ich weis nich, wie ichs blinkend hinbekomm ^^ nimm doch nich immer alles so wörtlich >< stell dir vor, einer haut den spruch raus "schei** die wand an!" - ungut, wenn man sich das zu herzen nimmt oder? :P

foreach nahm ich in dem bsp (es ist schlicht ein algorythmusentwurf, es soll völlig losgelöst von irgendeiner sprache sein) einfach nur, weil es vom lesen her gut verständlich ist. for each (zeile) wird wohl bedeuten, dass ich hier IRGENDEINE schleife meine, die das folgende für jede zeile macht. nicht mehr, und nicht weniger.

und das ganze würde in deinem code dieser zeile entsprechen:
foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {

davor irgendwo (wenn ich mich nich irre noch vor die ganz äussere foreach für die tätigkeiten) solltest du ein array, dass die einzelnen summen annimmt und aufaddiert erstellen und mit 0 initialisieren. da ich den code nich auf die schnelle hatte, hatte ich gehofft, dass du mit ts (welche wir für die wochentage nehmen) was anfangen kannst und weist, was ich meine ^^ explizit hätte ich sowas hier gemeint:
Code:
$sum = array();
for ($i = 0; $i < 7; $i++) {
  $ts = $wochenanfang + ($i * 60 * 60 * 24);
  $sum[$ts] = 0;
}
dann eben rein in die schleife, dort wird dann irgendwann unser kram ausgegeben, bzw in das $td array geschrieben (hier hatte ich noch die variable $row_sum angelegt). hier eben zuerst das "projekt geblubber" (was uns hier nich interessiert) und danach die einzelnen tage. DAS hier:
Code:
                [COLOR=red]$row_sum = 0;                [COLOR=lime]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];
                        [COLOR=red]$sum[$ts] += $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                        $row_sum += $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];                    } else {
                        $td[$i+5] = ' ';
                    }
                }
rot markiert die ergänzungen, die ich meinte. grün markiert ist im übrigen die entsprechung zu "for each(tag-spalte mit dem ts gedingse) {" ;) du siehst, obwohl ich for each schrieb, meinte ich einfach nur eine schleife, die sich um die werte der tage kümmert. eben eine irgendwie geartete schleife die was mit unserem $ts zu schaffen hat.

am ende wird dann noch besagte row_sum ausgegeben. ich hatte bei dem algorythmus natürlich nicht beachtet, dass wir werterfassung und ausgabe getrennt hatten ^^ aber gemeint wäre das hier gewesen:
Code:
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                [COLOR=red]echo '    <td>'.$row_sum.'</td>';                echo '  </tr>';
also halt ganz normal wie immer das gelumbe ausgeben und am ende die summe für die zeile. und dann mit dem edit meinte ich eben, dass NACH der normalen tabellen malerei (also alle db-ausgelesenen spalten wurden gebaut) nochmal die eine zeile mit den tages-summen ausgegeben wird. sonen code hattest doch glaube sogar schon oder? *nachgugg* ahja, das hier (dein blau markiertes):
Code:
        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_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum = mysqli_fetch_row($time_table);
            if (!$sum[0]) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum[0].'</td>';
            }
        }
        echo '  </tr>';
würde nach meiner idee halt so aussehen:
Code:
        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 ([COLOR=red]$i = 0; $i < 7; $i++) {
            [COLOR=red]$ts = $wochenanfang + ($i * 60 * 60 * 24);            if ($sum[$ts] == 0) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum[$ts].'</td>';
            }
        }
        echo '  </tr>';
fertig ^^ das wäre meine idee auf die schnelle gewesen. aber im bett später kam mir auch in etwa der selbe gedanke, den ben wohl ansprach. also es doch mittels db-anfrage zu machen. da hab ich grad einen verdacht...

das hier im blau markierten war deine anfrage für die summe der zeiten der wochentage, wenn ichs richtig seh:
$time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
um deine ausgabe zu generieren, nutzt du aber so einen von großen anfrage-strings. mit sehr viel mehr bedingungen im WHERE teil ;) wenn die nicht zueinander passen, dann können natürlich auch die ergebnisse nicht zueinander passen. zum bsp deine mitarbeiter-abfrage (der erste große dingens im code) müsste für die summe dann so aussehen:
$time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."' AND userid = '".$userid."';");
wenn der part fehlt, kann die db natürlich nich die richtigen daten zusammen suchen. ich weis jetz nich, ob du die variable $userid hast, wenn nich, müsstest du wieder über 2 tabellen abfragen, oder sie (also die variable $userid) dort mit auslesen (und erstellen), wo du $user erstellst (wenn es dort geht, sollte eigentlich). ansonsten könnte es auch so aussehen:
$time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten AS z, user AS u WHERE z.datum = '".$wochentag."' AND u.user = '".$user."' AND z.userid = u.id;");

so könnt es funktionieren. für die anderen fälle bräuchtest du dann natürlich auch wieder andere (anders bedingte) summen-abfragen.
 
Okay, jetzt ist klar, was du meintest. Übrigens hatte ich mich noch gewundert, warum du "for each" schreibst, und da es sich ja nur um Pseudocode handelte, nahm ich an, dass das "schlampigkeitshalber" war, du aber ne foreach-Schleife gemeint hattest ... ;)

Jedenfalls, wie du in #768 im EDIT2 siehst, konnte ich das selbst noch lösen. Jetzt ginge es nur mehr um das Editieren von Einträgen --> #769
 
wenn ich lange texte schreibe, hast du das gefälligst vorherzusehen mit einer glaskugel vom letzten weihnachtsbaum und nichts zu machen! :motz: ^^

editieren... das wird sicher auch nich so leicht :/
 
^^ Ich stell's mir gar nicht kompliziert vor. Zuerst mal "irgendwo" (bei mir derzeit in formular.php, wo eben der Button abgefragt wird) einfach nur eine dynamisch vorbelegte Zeile basteln. Und dann im zweiten Schritt diese in projektzeiterfassung.php einfügen, sodass die gegebenenfalls am Anfang der Eingabemaske als erste Zeile erscheint. Der Editier-Button muss halt dann dafür sorgen, dass aus auswerten.php zurück zu projektzeiterfassung.php gesprungen wird.

Und ich bin ja auch nicht mehr weit weg. Bei den Dropdowns habe ich einen Indexfehler in irgendeinem Array (das wirst du bei "deinen" foreach-Schleifen eher sehen als ich, wo der liegt), und bei Zeiten mag er das query aus irgendeinem Grund nicht. Wobei sich da taetprodid und datum im WHERE spießen dürften. Nehme ich eines von beiden raus, kriege ich sofort wieder Werte, wenn auch nicht die richtigen bzw. nicht an der richtigen Stelle ...
 
Zuletzt bearbeitet:
Ich habe wieder mal ein foreach-Problem (:ugly:), aber zuvor kurz zum Stand: Es geht nur noch um die Editier-Funktion, und dafür habe ich noch genau 6 Tage (inkl. heute).

So, nachdem ich bei meinem letzten Versuch "gegen die Wand geknallt" bin und mir nichts mehr eingefallen ist, was ich noch probieren könnte, habe ich mir heute gedacht, ich probiere mal, in einem kleinen test-file einfach nur ein simples Dropdown zu basteln und darin zu versuchen, ein bestimmtes Element als vorbeleg-Wert auszuwählen. Hat soweit auch super geklappt:
PHP:
<?php
    echo 'Dropdown<br><br>';
    
    $content = array("BMW", "Mercedes", "Audi");
    
    echo '<select>';
    for ($i = 0; $i < count($content); $i++) {
        if ($content[$i] == $content[1]) {
            echo '<option value="'.$content[$i].'" selected>'.$content[$i].'</option>';
        } else {
            echo '<option value="'.$content[$i].'">'.$content[$i].'</option>';
        }
    }
    echo '</select>';
Unbenannt.png

^^ Und nachdem ich das eigentlich simple Prinzip durchschaut hatte, wollte ich genau das dann auch in meinem großen Projekt umsetzen. Sollte dort dann (jetzt mal nur für die Tätigkeiten) so aussehen:
PHP:
$taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j]");
$row_taet1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
$init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id = $row_taet1[0]");
$row_taet2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
echo '<tr><td><select name="taetigkeit'.$a.'">';
foreach ($taetigkeiten as $taetigkeit) { 
    if ($taetigkeit == $row_taet2[0]) {
       echo '<option value="'.$taetigkeit['id'].'" selected>'.$taetigkeit['taetigkeit'].'</option>';
    } else {
       echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
}
echo '</select></td>';
Unbenannt.png

^^ Funktioniert nicht, es bleibt einfach das erste Element ausgewählt. Wenn ich mir nun testweise den Inhalt von $row_taet2[0] ausgeben lasse, ist da allerdings völlig korrekt der Name der zum Editieren selektierten Tätigkeit drinnen. So weit, so gut.

Dann hapert's allerdings. Meine if-Abfrage in der Schleife dürfte so nicht stimmen?! Aber ich kenne mich halt bei dem foreach-Zeugs nicht so recht aus, was genau da jetzt in "$taetigkeiten" steckt, und was in "$taetigkeit" ... :huh:
Ersteres ist das gesamte Feld, letzteres das für jede Schleifenrunde jeweilige Element, hätte ich mir gedacht?!
Was ich vorhabe, dürfte ja schon nach dem Mini-Beispiel von oben ersichtlich sein: Im if soll der Name der ausgewählten Tätigkeit mit sämtlichen anderen Tätigkeits-Namen aus dem Feld verglichen werden, bis es eine Übereinstimmung gibt. Mit ner for-Schleife wüsste ich sofort, wie das umzusetzen wäre, aber bei dem foreach-Zeugs???

Ich habe btw schon probiert, das in ne for-Schleife umzuschreiben, aber dann passt wieder bei den ganzen Indexen in den echos nichts, die ja auf die foreach ausgelegt sind ... *seufz*

[EDIT]
So klappt's auch nicht:
PHP:
if ($taetigkeit['taetigkeit'] == $row_taet2[0]) {
[EDIT2]
Das "witzig" ist ja, in meinem kleinen test-file würd's schon so funktionieren:
PHP:
<?php
    echo 'Dropdown<br><br>';
    
    $content = array("BMW", "Mercedes", "Audi");
    
    echo '<select>';
    /*for ($i = 0; $i < count($content); $i++) {
        if ($content[$i] == $content[1]) {
            echo '<option value="'.$content[$i].'" selected>'.$content[$i].'</option>';
        } else {
            echo '<option value="'.$content[$i].'">'.$content[$i].'</option>';
        }
    }*/
    foreach ($content as $con) {
        if ($con == $content[1]) {
            echo '<option value="'.$con.'" selected>'.$con.'</option>';
        } else {
            echo '<option value="'.$con.'">'.$con.'</option>';
        }
    }
    echo '</select>';
^^ Liefert auch wieder "Mercedes" als vorselektiertes Element. Warum klappt das selbe Prinzip also in meinem großen Projekt nicht???
 
Zuletzt bearbeitet:
geh doch bei sowas über den key. also eben nicht foreach ($content as $con) { sondern foreach ($content as $key => $con) {. dann kannste auch sehr schön in der if nach dem key fragen: if ($key == 1) { - fertig. und du wirst eh den key benötigen, da er bei deinen tätigkeiten die id aus der db sein sollte. die einzelnen options sollten dann nämlich schlauer weise SO aussehen: echo '<option value="'.$key.'" selected>'.$con.'</option>'; (bzw eben ohne selected).


edit: bissl weiterführend... anstelle von $con könntest du bspw auch $content[$key] schreiben. was auch sehr nützlich is (hier in dem bsp glaube nich so), wenn du mehrere arrays mit selber key-struktur aber anderen werten hast (zum bsp eine zeile hat immer den "key" der zeilennummer. bsp: echo '<tr><td><select name="taetigkeit'.$a.'">'; das ding da meine ich. das wäre für tätigkeit, produkt usw usf immer gleich), dann kannst du ein array davon in der schleife durchiterieren, aber alle anderen arrays ebenso korrekt auslesen. als bsp:
Code:
// 3 arrays mit den selben keys
$a = array(0 => 'mercedes', 1 => 'bmw', 2 => 'audi');
$b = array(0 => 'e500', 1 => '3er', 2 => 'A6');
$c = array(0 => 'sli', 1 => '5er', 2 => 'A1');

// jetzt alles nebeneinander ausgeben, dabei nur EINE schleife nutzen:
foreach($a as $key => $content)
  echo $content.' | '.$b[$key].' | '.$c[$key].'<br>';
 
Zuletzt bearbeitet:
Okay, so kommen wir dem ganzen schon sehr nahe ...
PHP:
$taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j]");
$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['taetigkeit'].'</option>';
    } else {
       echo '<option value="'.$key.'">'.$taetigkeit['taetigkeit'].'</option>';
    }
}
echo '</select></td>';
Lediglich eines durchschaue ich noch nicht:

Unbenannt.png

^^ Das ist zwar jetzt durch die Zensur schwer zu erkennen, aber $key ist offenbar immer 1 Index zu hoch. Jedenfalls erhalte ich jetzt immer die eine Tätigkeit nach der gewünschten als die vorselektierte. Fangen im Bsp am Screenshot halt blöderweise beide mit Pr... an, aber es sollte die VOR der blau markierten sein.

[EDIT]
Ich glaube, ich hab's schon durchschaut. $key sind die Feldindexe, die bekanntlich bei 0 beginnen. Die IDs unserer Tätigkeiten beginnen in der DB aber von 1 weg hoch zu zählen. Daher entspricht $key=0 also $id=1.

Und somit muss es wie folgt ausschauen:
PHP:
if ($key == $row_taet[0]-1) {
Damit kriege ich jetzt sowohl bei den Tätigkeiten als auch bei den Produkten die jeweils richtige vorselektiert. :)
------------

Womit jetzt nur noch die Zeiten blieben. So funktioniert's bei denen jedenfalls NICHT:
PHP:
for ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
                    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = $selected[$j], datum = $i;");
                    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
                    if (!$hours) {
                        echo "nope!<br>";
                    }
                    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
                }
^^ Da kommt keine Ausgabe.
 
Zuletzt bearbeitet:
die frage hierbei wäre: wie baust du dein $teatigkeiten array auf? das müsste (skizziert :P) in etwa so aussehen:
Code:
select * from tätigkeiten;
$teatigkeiten = array();
while(row...)
  $teatigkeiten[$row['id']] = $row['name'];

dann verhaspelst du dich auch nicht mit nem array-index (der ohne besondere angaben bei ner 0 beginnt) und ner db-id (die bei 1 beginnt). zudemm muss das eh synchron sein. wenn in der db an 3. stelle die id 5 steht (weil schon was gelöscht wurde), dann muss das auch im array so passen. da muss dann auch der 3. index (key) die 5 sein, und nicht die 3 (oder gar 2).
 
^^ Siehe mein EDIT. ;)

Weiter geht's mit den Zeiten ...

Siehst du den Fehler?
Eigentlich erscheint mir das subjektiv ganz korrekt: Ich habe ne Schleife, die für jeden einzelnen Wochentag die Zeit und das Datum aus der DB holt, wo die taetprodid zum Index des Projektes passt und der timestamp dem aktuellen Wochentag entspricht. Datum verwende ich dann weiter, um dem input-Feld den richtigen Namen* geben zu können, und die Zeit natürlich, um ausgegeben zu werden.
(* bei dem Teil bin ich mir allerdings nicht ganz sicher)
 
Zuletzt bearbeitet:
wegen deinem edit und den row... -1. das ist halt nur die halbe wahrheit.
"wenn in der db an 3. stelle die id 5 steht (weil schon was gelöscht wurde), dann muss das auch im array so passen."

du musst dein array mit den indexen aus der db als keys erstellen. was anderes bringt nur blödsinn hervor.


edit: btw, hast du das wieder in nem seperaten file?
 
So einfach wie von dir "skizziert", klappt das aber leider nicht:
PHP:
$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;
       $teatigkeiten[$row_t['id']] = $row_t['name'];
    }
}
@ edit
Ne, ist alles in formular.php
PHP:
echo '<table>';
    if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $a = count($selected); // Anzahl der Zeilen
            
            $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;
                    $teatigkeiten[$row_t['id']] = $row_t['name'];
                }
            }
             
            $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;
                }
            }
            
            for ($j = 0; $j < count($selected); $j++) {                                        
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j];");
                $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]-1) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit['taetigkeit'].'</option>';
                    } else {
                        echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
                    }
                }
                echo '</select></td>';
                
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$j];");
                $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]-1) {
                        echo '<option value="'.$key.'" selected>'.$product['produkt'].'</option>';
                    } else {
                        echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
                    }
                }
                echo '</select></td>';
                
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$j];");
                $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 ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
                    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = $selected[$j], datum = $i;");
                    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
                    if (!$hours) {
                        echo "nope!<br>";
                    }
                    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
                }
                echo '<td>'.$selected[$j].'</td><br>';
                            
                /*$update1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['poduct']."', beschreibung = '".$_POST['beschreibung']."', erstellt = '".$erstellt."' WHERE id = '".$selected[$j]."';");
                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];
                        $update2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit = '".$dauer."' WHERE taetprodid = '".$selected[$j]."' AND datum = '".$ts."';");
                    }
                }*/      
            }
        }
    }
    echo '</table>';
Aber wir werden uns nachher beim Integrieren in projetzeiterfassung.php eine ganze Menge von dem Code sparen können, weil vieles davon in letztgenanntem File schon vorhanden ist.
 
Zuletzt bearbeitet:
Zurück