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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
ich war gestern mit der $now variable für das autologout per timeout auch versucht, den länger zu machen :P
$now__really_now__yeah_this_now oder sowas wars :fresse:
 
Bitte eines nach dem anderen ... bleiben wir erstmal beim Datum.

Also der Code schaut jetzt so aus:
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."");
    
            $eintragen1 = 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);
        
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($a * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];                              
                    $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                }
            }
        }
    }
Aber in der DB landet immer noch kein Datum, nur "0". :(
(datum ist bei mir in der DB übrigens INT(20), falls das was zur Sache tut)

BTW: Ich schreibe die Codes im Notepad++. Eclipse ginge für php auch, aber da bin ich erst gestern draufgekommen.
 
ok, wollt grad was anderes schreiben, aber ich glaub ich habs. bei der ts-berechnung MUSS das b bleiben. b steht ja für die wochentage und für die bauen wir den timestamp. also änder mal bei der berechnung das a wieder in b und schau obs funktioklappt.
 
Ja, jetzt kriege ich auch diese lange Zahl in die DB geschrieben. :)

Allerdings habe ich gerade was ungutes festgestellt: Durch irgendetwas (vermutlich irgendein Button-Klick, abgesehen von "Bestätigen") wird bei jeder Eingabe die jeweils vorherige (allerdings mit der nicht-vorhandenen userid=0) auch in die DB geschrieben, selsbt wenn ich index.php reloade und mich neu einlogge. Fast so, als wäre die in einem "Cache" gespeichert.

Zur Verdeutlichung:

1.JPG 2.JPG

Vor deinem Posting hatte ich noch a statt b im Code und hab's mit einer Zeile (Beschreibung war "deee") getestet. Nach deinem Posting habe ich den Code geändert, musste mich aber auch neu einloggen, da die 5 Minuten schon vergangen waren. Den alten DB Eintrag hatte ich gelöscht.
So, dann neuen gemacht (Beschreibung ist "ddd") ... und was sehe ich in der DB --> der alte wurde von irgendwoher mitgenommen und auch wieder reingeschrieben.

:huh:

BTW: Die Ausgabe funktioniert jetzt einwandfrei, wo das mit datum passt. ENDLICH! ;)

[EDIT]
Vergiss den Fehler, ist eh schon wieder nicht reproduzierbar. Ergo bringt auch eine Suche danach nichts.

Als nächstes wäre jetzt noch das Durchschalten der KWs in der Ausgabe zu richten. Aber das nehme ich mir erst morgen in der Arbeit vor. Ist ja eh schon wieder in wenigen Stunden. Wahnsinn, wie die Zeit vergeht ...
 
Zuletzt bearbeitet:
gute frage, weis ich echt nich, wieso weshalb warum :/ kannst du nochmal deinen jetzigen stand zippen? dann kann ich ggf schonmal schauen, ob ich das mit dem "seite sichern" unkompliziert reinbekomm. hab zwar keine echte hoffnung, dass das irgendwas an diesem "caching" ändert, aber nuja. vllt find ichs nebenher ^^
 
Hier nochmal die Version von gestern Abend, die nun wirklich sehr gut funktioniert (bis eben auf das Durchschalten der KWs in auswertung.php/auswertung2.php), auch hier in der Firma: Anhang anzeigen db.7z

Sofern beim weiteren Testen keine Fehler/Probleme mehr auftauchen, wäre nur noch folgendes zu machen:
- Das mit den KWs richten
- Den "Excel" Export so anpassen, dass nicht die ganzen IDs exportiert werden, sondern die Klarnamen.

^^ Und wenn wir das bis FR (oder allerspätestens SO) schaffen, wären wir perfekt in der Zeit, und ich hätte dann Anfang nächster Woche noch ein bisschen Spielraum, um das Design hier und da noch etwas mehr an meine Vorstellung anzupassen. :)
----------

Ich nehme mir jetzt erstmal selbst die KWs vor ...

PS: Wie im Vorposting gesagt, den dort genannten Fehler kannst du vergessen, ist nicht reproduzierbar.

[EDIT]
Was mich noch interessieren würde: Meinst du, unser Session-System hält dem Fall stand, dass sich mehrere MAs gleichzeitig und unabhängig voneinander auf der Website einloggen und ihre Daten eintragen wollen? Das wäre nämlich ein zu erwartendes Anwendungs-Szenario.

[EDIT2 zum PS]
Gerade wieder den Fehler erlebt. Aber ich krieg's nicht raus, ob ich den durch irgendwas bestimmtes auslöse. Bis jetzt kommt mir das sehr zufällig vor, eben nicht reproduzierbar. :huh:
 
Zuletzt bearbeitet:
wegen dem edit: ich gehe stark davon aus, dafür wurde der krams ja gebaut ^^ mehr als ne session starten geht ja von unserer seite nich. wie der die session id's vergibt usw...


jut, wegen der "section" geschichte, hier mal meine umbauten bisher:
config.php:
Code:
<?php
    //...    
    function logout() {
        [B][COLOR=blue]session_unset();[/B]
        session_destroy();
    }
    
    $protokoll = '';
    [B][COLOR=blue]$section = 'login';[/B]
    $site_title = 'Login';
    
    // ...

    if (isset($_SESSION['ip'])) {
        if ($_SESSION['ip'] == $ipadresse) {
            if ($timeout >= ($now[0] - $_SESSION['last_on'])) {
                $user = $_SESSION['name'];
                $userid = $_SESSION['id'];
                $rechte = $_SESSION['rechte'];
                $_SESSION['last_on'] = $now[0];  // aktualisiere zeit

                $site_title = 'Projektzeiterfassung';
                [COLOR=blue][B]$section = 'pze';[/B]            } else {
                logout();
[B][COLOR=blue]                $section = 'login';
                $site_title = 'Login';[/B]
                $protokoll .= "- Die Sitzung wurde aufgrund eines Timeouts unterbrochen (zu lange keine Aktion durchgeführt). Bitte loggen Sie sich erneut ein.<br>";
            }
        } else {
            logout();
[B][COLOR=blue]            $section = 'login';
            $site_title = 'Login';[/B]            $protokoll .= "- Die Sitzung wurde aufgrund eines IP-Wechsels unterbrochen. Bitte loggen Sie sich erneut ein.<br>";
        }
    }
    // ...
sitenote: bei unserer logout funke habsch gesehn, dass es ne unset session funke gibt. meine version mit dem = array() sollte aber wohl auch praktikabel sein. so siehts aber (sofern es funzt) irgendwie "offizieller" aus xD
joa, dann eben hauptsächlich die section variable eingeführt, die unseren get-parameter beinhaltet (habs erstmal mittels get gelöst) und die auch beim einloggen (fortsetzen einer session wohl eher) mitbedacht (sowie beim autologout alles wieder auf default schmeißen).

als nächstes müssen wir die auch anwenden -> html_header.php:
Code:
// ...
echo '      <form action="index.php[COLOR=blue][B]?section='.$section.'[/B]" method="post">';
// ...

uuuund auswerten ^^ -> formular.php:
Code:
    // ...
    // seiten-titel und section bestimmen
    [COLOR=blue][B]if (isset($_GET['section'])) {
        $section = $_GET['section'];
    }[/B]    if (isset($_POST['btnRegForm'])[B][COLOR=blue] or $section == "register"[/B]) {
        $site_title = "Registrieren";
        [COLOR=blue][B]$section = "register";[/B]    }
    if (isset($_POST['auswerten'])[B][COLOR=blue] or $section == "output"[/B]) {
        $site_title = "Ausgabe";
        [COLOR=blue][B]$section = "output";[/B]    }
    if (isset($_POST['auswertenadmin'])[B][COLOR=blue] or $section == "output_admin"[/B]) {
        $site_title = "Ausgabe (Admin)";
        [COLOR=blue][B]$section = "output_admin";[/B]    }
    [B][COLOR=blue]if (isset($_POST['btnRegCancel'])) {
        $site_title = "Login";
        $section = "login";
    }
    if (isset($_POST['btnOutputCancel'])) {
        $site_title = "Projektzeiterfassung";
        $section = "pze";
    }[/B]

    // ...

    if (isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'");
        $row = mysqli_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            $_SESSION['ip'] = $ipadresse;
            $_SESSION['last_on'] = $now[0];
            
            $user = $username;
            $userid = $row->id;
            $rechte = $row->rechte;

            $site_title = 'Projektzeiterfassung';
            [COLOR=blue][B]$section = 'pze';[/B]        } else {
            $protokoll .= '- Benutzername und/oder Passwort waren falsch oder nicht registriert.<br>';
        }
    }
    // ...
hier auch beim login gleich dingenskirchen setzen.

eventuell hast du es bemerkt: am ende hab ich noch 2 neue buttons mit aufgenommen: btnRegCancel existierte schon in der reggen-form, der name war bisher aber unnötig. jetzt muss man den aber auch mit beachten, damit man wieder ordentlich zum login kommt. genauso hab ich die "zurück" buttons in auswerten und auswerten2 mit nem namen belegt:
Code:
// ...
echo '<br><input type="submit" value="Einträge editieren" [COLOR=blue][B]name="btnOutputCancel"[/B]>Zurück zur Eingabe ...</div><br>';
// ...
ist identisch in beiden.


und dann schlussendlich müssen wir unseren wichensteller noch aktualisieren -> index.php:
Code:
<?php
    session_start();
    [B][COLOR=blue]session_regenerate_id();[/B]

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

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm'])[COLOR=blue][B] or $section == "register"[/B]) {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten'])[COLOR=blue][B] or $section == "output"[/B]) {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin'])[COLOR=blue][B] or $section == "output_admin"[/B]) {
            include('auswerten2.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    include('html_footer.php');
und da ich mich damit irgendwie sicherer fühle, hab ich dieses ominöse session_regenerate_id(); auch mit reingenommen ^^

nun bleibt nur zu hoffen, dass das auch alles so funzt. btw: wenn du in pze die kw änderst, wird das in auswerten usw gleich mitübernommen. hoffe, das is ok so, sonst müssen wir mal schauen ^^


aso, fast vergessen: in auswerten2.php haste ja den usernamen, den du übergibst. allerdings prüfst du dann (ganz oben im code) nur, ob das feld gesetzt ist, nicht aber, ob es inhalt hat. und ob die db dir irgendein ergebnisliefert, prüfste auch nicht *glaub*
 
^^ Scheint zu funktionieren. BTW habe ich ein bisschen an der Optik gedreht (Anhang anzeigen db.7z).

Eines ist mir noch eingefallen: Wir haben ja in der Ausgabe den "Editieren" Button. Wenn man drauf klickt, landet man wieder beim Eingabeformular. Dort sollten jetzt aber die ursprünglich eingegebenen Werte angezeigt werden. Tessa's Tipp waren da vorbelegte Felder.
Meine Idee zur Umsetzung wäre jetzt, a) die Felder anhand der Werte aus der DB für die jeweilige Zeile vorzubelegen (irgendwie so: if (isset($_POST('btnOutputCancel') { ))) und dann b) in einer Bedingung UPDATE statt INSERT zu sagen wenn wieder "Bestätigen" gedrückt wird. Wie genau, muss ich mir jetzt überlegen ...
 
Ich entschuldige mich übrigens das ich mich derzeit nicht beteilige, aber momentan habe ich ne Azubine hier und somit deutlich mehr Arbeit als normal x-D. Da finde ich einfach keine Zeit.
 
Puh, ist das ne zähe Angelegenheit ...
--------

Um mir im Gesamtcode nichts zu ruinieren, versuche ich, das erstmal in einem unabhängigen File "vorbeleg.php" zu erstellen:
PHP:
<?php    
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, DATABASE);
    if ($mysqli->connect_errno) {
        echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }

    echo '<table>';

    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<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 failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_p))
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
    
    //$queryid = mysqli_insert_id();
    $taetid = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id=128");
    $row_taetid = mysqli_fetch_row($taetid);    
    $prodid = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id=128");
    $row_prodid = mysqli_fetch_row($prodid);
    $beschid = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id=128");
    $row_beschid = mysqli_fetch_row($beschid);
      
    for ($a = 1; $a <= 2; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
        }
        echo '</select></td>';

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

        echo '<td><input name="beschreibung'.$a.'" value="'.$row_beschid[0].'" 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>';
        }
    } 
    echo '</table><br>';
Die Werte aus der DB holen, ist ja kein Problem (auch wenn ich mir noch überlegen muss, wie ich die Klarnamen anstatt der IDs kriege).

Wie ich die id hinter den WHEREs dynamisch machen soll, weiß ich noch nicht so ganz, aber die Idee wäre, diese irgendwie nach dem INSERT in formular.php mit "$queryid = mysqli_insert_id();" abzufragen und dann in meinen drei querys einzusetzen.
In der for-Schleife habe ich erstmal notgedrungen $add durch "2" ersetzt, weil ja $add in dem unabhängigen File unbekannt ist. Das sollte aber später, bei der Integration des Codes ins Gesamtprojekt, kein Problem mehr sein?!

Das nächste wäre dann: Wo soll ich meine ermittelten IDs einsetzen? Hier z. B. ...
PHP:
echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
... hätte ich es in beiden [ ] versucht, erfolglos. :huh:

Lediglich das hier funktioniert bis jetzt super:
PHP:
echo '<td><input name="beschreibung'.$a.'" value="'.$row_beschid[0].'" type="text" size="50" maxlength="250"></td>';
Und wie ich das mit den Stunden machen soll, v. a. wenn da mehrere zu einem Eintrag gehören, muss ich mir auch erst noch überlegen. Irgendwo in der unteren Schleife dann?!
 
wegen deiner trennung in eingabe und ausgabe ist das nich so ohne (falls überhaupt möglich). folgendes bsp, wie das von tessa gemeint war:
PHP:
<?php
  echo '<form action="self.php" method="post">';  // also ruft halt sich selbst auf ^^
  echo '<input type="text" name="myInput"';
  if(isset($_POST['myInput'])) echo ' value="'.$_POST['myInput'].'"';  // hierrauf kommts an. ist nen post-wert für das feld gesetzt, gib ihn als defaultvalue an
  echo '>';
  echo '<input type="submit" value="send">';
  echo '</form>'
?>
was bei dir also durchaus ohne probleme geht: im fehlerfalle die daten wieder anzeigen lassen. was gespeichert is, ist gespeichert. das brauch man nich wieder anzeigen. wird bei dir halt etwas haariger, da du ja mehrere zeilen hast. mein vorgehen wäre allgemein so:
- eine weitere globale hinzufügen (also in config.php), die zum bsp $form_ok heißt und true ist.
- bei registrieren und login ist das noch simpel. im fehlerfalle wird form_ok auf false gesetzt und der eben eingebene username wieder automatisch eingetragen (pw soll er selber neu eintragen).
- bei deinem pze... da wirds wie gesagt happiger. hier würde ich ein array erstellen (beim confirm button abarbeiten), dass für jede eingabezeile wieder ein array enthält mit den dortigen daten. ach mensch, ich hab da so schöne ideen, das ist aber gleich wieder kompliziert ^^ also mal die simple variante: immer, wenn eine eingabezeile nen fehler enthält, wird eine array-"zeile" angelegt

das array würde ich so aufbauen:
PHP:
    if (isset($_POST['confirm'])) {
        $errors = array();
        for ($a = 1; $a <= $add; $a++) {
            [STRIKE]$stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");[/STRIKE] // das kannste eigentlich löschen

            $index = count($errors);
            $errors[$index] = array();
            // form-check
            if(!isset($_POST['taetigkeit'.$a]) or $_POST['taetigkeit'.$a] == 0) {
                $form_ok = false;
                $errors[$index]['t'] = $_POST['taetigkeit'.$a];
            }
            if(!isset($_POST['produkt'.$a]) or $_POST['produkt'.$a] == 0) {
                $form_ok = false;
                $errors[$index]['p'] = $_POST['produkt'.$a];
            }
            // alles weitere sind keine pflicht-angaben

            // eintragen
            if($form_ok) {
                $eintragen1 = 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);
        
                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];                              
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
                // wenn alles ok, war, brauchen wir die "fehlerzeile" nicht
                unset($error[$index]);
            } else {
                // sollte die form doch fehler enthalten haben, speicher den rest auch (egal ob leer oder angegeben)
                if(isset($_POST['beschreibung'.$a])) $errors[$index]['b'] = $_POST['beschreibung'.$a];
                $errors[$index]['d'] = array(); // d wie days ^^
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    if(isset($_POST[$ts.'_'.$a])) $errors[$index]['d'][$b] = $_POST[$ts.'_'.$a];
                }
            }
        }
        // am ende noch add so manipulieren, dass wir genug platz haben, um unsere "fehlerzeilen" einzutragen
        $add = count($error);
    }
dann kannst du beim erstellen deiner eingabe-felder zeilen schön dieses fehler-array auswerten und die werte über den value-parameter deiner input/select-felder wieder setzen. also bei den selects müsstest du halt vergleichen, ob die id (in der option-value gespeichert) mit der in error[...][t] gespeicherten id übereinstimmt und dann ein selected="selected" anhängen (also auch wieder im option-tag).


das hier ist jetzt rein optional:
meine fortführende idee wäre gewesen, noch zu vermerken, WELCHES feld dabei nen fehler geschmissen hatte. dabei müsste man die einzelnen werte nochmal unterteilen in nen weiteres array. also statt error[...][t] = value müsste man dann bspw error[...][t][val] = valueund error[...][t][err] = true speichern. hierbei müsste man aber eben auch zwingend das ganze vor dem check auf richtigkeit mit false belegen. das wären geringe unterschiede zum code eben:
Code:
    if (isset($_POST['confirm'])) {
        $errors = array();
        for ($a = 1; $a <= $add; $a++) {
             [STRIKE]$stunden = array("montag".$a."", "dienstag".$a."",  "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."",  "sonntag".$a."");[/STRIKE] // das kannste eigentlich löschen

            $index = count($errors);
            $errors[$index] = array();
            // form-check
[B][COLOR=blue]            $errors[$index]['t'] = array();
            $errors[$index]['t']['val'] = $_POST['taetigkeit'.$a];
            $errors[$index]['t']['err'] = false;[/B]            if(!isset($_POST['taetigkeit'.$a]) or $_POST['taetigkeit'.$a] == 0) {
                $form_ok = false;
[B][COLOR=blue]                $errors[$index]['t']['val'] = $_POST['taetigkeit'.$a];
                $errors[$index]['t']['err'] = true;[/B]            }
[COLOR=blue][B]            $errors[$index]['p'] = array();
            $errors[$index]['p']['val'] = $_POST['produkt'.$a];
            $errors[$index]['p']['err'] = false;
[/B]            if(!isset($_POST['produkt'.$a]) or $_POST['produkt'.$a] == 0) {
                $form_ok = false;
[COLOR=blue][B]                $errors[$index]['p']['val'] = $_POST['produkt'.$a];
                $errors[$index]['p']['err'] = true;
[/B]            }
            // alles weitere sind keine pflicht-angaben

            // eintragen
            if($form_ok) {
                 $eintragen1 = 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);
        
                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];                              
                         $eintragen2 = mysqli_query($mysqli, "INSERT INTO  zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid',  '$taetprodid', '$dauer', '$ts')");
                    }
                }
                // wenn alles ok, war, brauchen wir die "fehlerzeile" nicht
                unset($error[$index]);
            } else {
                // sollte die form doch fehler enthalten haben, speicher den rest auch (egal ob leer oder angegeben)
[COLOR=blue][B]                if(isset($_POST['beschreibung'.$a])) {
                    $errors[$index]['b'] = array();
                    $errors[$index]['b']['val'] = $_POST['beschreibung'.$a];
                    $errors[$index]['b']['err'] = false;
                }
[/B]                $errors[$index]['d'] = array(); // d wie days ^^
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
[B][COLOR=blue]                    if(isset($_POST[$ts.'_'.$a])) {
                        $errors[$index]['d'][$b] = array();
                        $errors[$index]['d'][$b]['val'] = $_POST[$ts.'_'.$a];
                        $errors[$index]['d'][$b]['err'] = false;
                    }[/B]                }
            }
        }
        // am ende noch add so manipulieren, dass wir genug platz haben, um unsere "fehlerzeilen" einzutragen
        $add = count($error);
    }
wozu das alles? nuja, nun könntest du 2 verschiedene input klassen in css anlegen. eine normale und eine for den errorfalle (das selbe wie normal, nur mit roter schriftfarbe bspw). ist der err-wert true, bekommt das input feld die fehlerklasse, sonst die normale. da sieht man dann gleich, welcher wert falsch war. weiterhin könnte man per js noch was tüdeln. dann müsstest du allerdings noch ne id an deine inputs anhängen (da du aber ja eh eindeutige namen für die dinger hast (und keine arrays), eignen die sich vorzüglich auch als id ^^ (in dem falle also direkt von vorteil deine umsetzung)). als auslöse-event des js würde ich dann onclick probieren. nope: onfocus Event ^^ onfocus ist das, was ich meine. das js-funktiönchen (dem wir die id auch gleich nochmal mitgeben - haste also den selben kram dann 3mal da drin stehn xD name, id, funktionsparameter ^^) macht dann nix weiter, als die css-klasse zur normalen zu wechseln. sobald man also ins fehlerfeld klickt um zu berichtigen, wird die schrift wieder schwarz ^^

gut, ginge auch einfacher. man pfeifft auf verschiedene klassen, gibt im fehlerfalle nen style="color:#f33" oder so an (also eben ne rote textfarbe) und greift dann per js direkt auf dieses style-attribut wieder zu und ändert es um in #000.

wie gesagt, wäre ne optional aufhübschung ^^





edit:
fast vergessen: wegen dem hier
// hierrauf kommts an. ist nen post-wert für das feld gesetzt, gib ihn als defaultvalue an
ist es ein problem, dass "später" nochmal anzuzeigen. wüsst auch garnich wozu. also du speicherst krams, wechselst zur ausgabe, wieder zurück zur eingabe - und joa, da isses natürlich dan geschehen um deine post-werte. die sind längst weg ^^
 
Zuletzt bearbeitet:
POST Werte kann man m.E. mit PHP-Only als POST nur durchschleifen wenn man Sie auf jeder "Seite" über ein Formular zwischenpuffert.

Ich würde daher Vorschlagen ein Objekt z.B. (Post_Werte) anzulegen, welches die Nutzereingaben nach dem Absenden aufnimmt. Dieses kannst du dann mit serialize in einer einzelnen $_SESSION['post_werte'] ablegen und hast somit auf jeder neuen Seite zugriff auf die Daten.
 
@ DarkMo
Sorry, aber bei deinem Ansatz komme ich gar nicht mit. Ehrlich gesagt k. A. wovon du redest. Fehlerfall? Was denn für Fehler bitte?

Der User gibt einfach irgendwas ein (okay, wenn er bei Beschreibung z. B. "sfdgfgasdf" statt nem deutschen Satz eingibt, könnte man das zwar als "Fehler" sehen, aber das ist sein Kaffee) und genau das soll ihm bei "Editieren" wieder angezeigt werden. Dann kann er es ändern und per UPDATE wird's bei weiterem "Bestätigen" in der DB überschrieben. Mehr soll das gar nicht sein.
Dein Ansatz klingt, soweit ich das auch nur ansatzweise mitgekriegt habe, nach zehn mal mehr ... Ich weiß nicht, was genau du bezwecken willst.

Jedenfalls habe ich mir gedacht, ich schaue erstmal, dass ich es schaffe, eine Zeile hinzukriegen, die mit Werten eines bestehenden DB-Eintrags vorbelegt ist. Dann könnte ich mir überlegen, wie konkret ich das dann in den bestehenden Code einbauen könnte. Wenn ich dabei über POST was verlieren sollte, lässt sich das doch immer noch mit SESSION erhalten?!

^^ Mein Problem ist jedenfalls gerade, dass ich scheinbar nicht durchschaue, wofür die Indexe im zweiten Code in meinem Vorposting stehen ... Ich dachte, dass ich über diese Indexe eine Tätigkeit bzw. ein Produkt zur Belegung in einem Feld auswählen kann?!

[EDIT]
Hier mein aktuellster Versuch:
PHP:
<?php    
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, DATABASE);
    if ($mysqli->connect_errno) {
        echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    echo '<table>';

    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<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 failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_p))
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
    
    //$queryid = mysqli_insert_id();
    $taetid = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id=132");
    $row_taetid = mysqli_fetch_row($taetid);    
    $prodid = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id=132");
    $row_prodid = mysqli_fetch_row($prodid);
    $beschid = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id=132");
    $row_beschid = mysqli_fetch_row($beschid);
    
    $stunden = array();
    $res_stunden = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE taetprodid=132");
    if (mysqli_num_rows($res_stunden)) 
        while ($res_stunden = mysqli_fetch_assoc($res_stunden)) {
            $stunden[count($stunden)] = $res_stunden;
        }
      
    for ($a = 1; $a <= 1; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
        }
        echo '</select></td>';

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

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

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            if (isset($stunden[$ts])) {
                echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$stunden.'" maxlength="6" size="4"></td>';
            } else {
                echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
            }
        }
    } 
    echo '</table><br>';
^^ Die Zeit lese ich scheinbar noch falsch aus und bei Tätigkeiten und Produkte weiß ich nicht, wo ich jetzt mit dem ausgelesenen Index hin soll ...
 
Zuletzt bearbeitet:
ach du redest einfach nur vom editieren? mach das doch beim ausgeben mit rein und fertig is der lack. hinter jede ausgegebene zeile nen edit button und wenn man druff drückt, erhält man (nach neuladen der seite - wenn man auf js verzichten mag) halt genau diese zeile wieder mit den inputfelderchen, vorselectiert/mit werten bestückt, die halt aus der db kommen. is genau das selbe wie die simple ausgabe, nur dass du eben statt dem wert direkt auszugeben, ihn als value in nem input ausgeben lässt. ich hätte eh wie gesagt eingabe, ausgabe UND editieren alles in einem verbaut. find das irgendwie blödsinn, das alles aufzuspalten. hast am ende 10mal die selbe tabelle gebaut für nix und wieder nix ^^


mein vorschlag ging in richtung fehlerbehandlung bei falscheingaben im formular. ob der da jetzt "kaffe kochen" oder "asfkjsaskj kopfroller" reinschreibt ist dabei zweitrangig, aber für ein gültiges projekt braucht es nunmal eine gültige gewählte tätigkeit und ein gültiges gewähltes produkt. fehlt eines davon, kann man die kiste nich speichern -> fehler. genauso bei login oder registrierung - gibts auch genug fehler, die man abfangen kann, ohne dabei die kompletten gemachten eingaben verfallen lassen zu müssen. nur bei deiner eingabeseite ist halt der aufwand etwas größer, da du multiple input-zeilen hast.
 
^^ Ja, einfach nur Zeile editieren und UPDATE DB ... um mehr geht's jetzt erstmal gar nicht.

Oh, mein Gott, deine Lösung klingt schon wieder 10x komplizierter als mein Ansatz. :wow:
Du willst eine statische/unveränderbare Ausgabezeile bei Klick auf einen Edit-Button durch unsere dynamische Eingabezeile ersetzen lassen???

Wie auch immer, so wie ich das sehe, brauche ich so oder so mal einen Code, der unsere Eingabezeile mit Werten vorbelegt. Und daran arbeite ich ja schon die ganze Zeit, kriege es aber aufgrund der im Vorposting genannten Probleme (noch) nicht hin ...
 
wie gesagt, MEIN ansatz drehte sich um was völlig anderes ^^ DEIN problem is mMn simple as hell :P

gut, ich poste einfach nochmal deine komplette auswerten.php mit meinen änderungen:
Code:
[COLOR=gray]<?php
    $sql = "SELECT
                t.taetigkeit AS Taetigkeit,
                p.produkt AS Produkt,
                t.id AS tID,
                p.id AS pID,
                [COLOR=black][B]pr.id AS prID,[/B]                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=darkorange]            // ich musste das mal auftrennen, alles in einer zeile, da blickt ja kein schwein durch :P    $db_erg = mysqli_query($mysqli, $sql);
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }

    [COLOR=darkorange]// aus pze kopiert    [COLOR=black][B]$taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<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 failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_p))
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }[/B]
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="10" 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>
                <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>
            </tr>';
    $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']]['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'];
                [COLOR=black][B]$row_collector[$row['tID']]['data'][$row['pID']]['prID'] = $row['prID'];[/B][COLOR=darkorange]    // unsere projekt-id mit sichern                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $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[0] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                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+3] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+3] = ' ';
                    }
                }
                echo '  <tr>';
                [COLOR=darkorange]// schauen, ob der edit-button gedrückt wurde                [COLOR=black][B]i[/B][B]f(isset($_POST['edit'.$row_collector[$taet_id]['data'][$prod_id]['prID']])) {
                    [/B][COLOR=darkorange]// baue die inputzeile nach[B]
                    echo '<td><select name="taetigkeit">';
                    foreach ($taetigkeiten as $taetigkeit) {
                        echo '<option value="'.$taetigkeit['id'].'"';
                        [COLOR=blue]if($taetigkeit['id'] == [/B][COLOR=gray][COLOR=black][B][COLOR=blue][B]$taet_id[/B]) echo ' selected="selected"';  [/B][COLOR=blue][COLOR=darkorange]// autoselect wenn option-value = db-wert[B]
                        echo '>'.$taetigkeit['taetigkeit'].'</option>';
                    }
                    echo '</select></td>';

                    echo '<td><select name="product">';
                    foreach ($products as $product) {
                        echo '<option value="'.$product['id'].'"';
                        [COLOR=blue]if($product['id'] == $prod_id) echo ' selected="selected"';  [/B][COLOR=gray][COLOR=black][COLOR=gray][COLOR=black][COLOR=blue][COLOR=darkorange]// autoselect wenn option-value = db-wert[B][COLOR=gray][COLOR=black][COLOR=blue][COLOR=darkorange]                        echo '>'.$product['produkt'].'</option>';
                    }
                    echo '</select></td>';

                    echo '<td><input name="beschreibung" type="text" size="50" maxlength="250"[COLOR=blue] value="'.$td[2].'"></td>';

                    for ($i = 0; $i < 7; $i++) {
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo ' <td><input type="text" name="'.$ts.'" maxlength="6" size="4" [COLOR=blue]value="'.$td[($i + 3)].'"></td>';
                    }

[/B] [COLOR=gray][COLOR=gray][COLOR=gray][COLOR=black][COLOR=darkorange]// einen save-button an die zeile anhängen, der die projekt-id im namen hat[COLOR=gray][B][COLOR=black]echo '    <td><input type="submit" name="[COLOR=blue]save'.$row_collector[$taet_id]['data'][$prod_id]['prID'].'" value="save"></td>';[/B]
                [COLOR=black][B]} else {[/B]                    for ($i = 0; $i < count($td); $i++) {
                        echo '    <td>'.$td[$i].'</td>';
                    }[COLOR=gray][COLOR=gray][COLOR=black][COLOR=darkorange]// einen edit-button an die zeile anhängen, der die projekt-id im namen hat[COLOR=gray][COLOR=black][B]echo '    <td><input type="submit" name="[COLOR=blue]edit'.$row_collector[$taet_id]['data'][$prod_id]['prID'].'" value="edit"></td>';
[/B][COLOR=gray][COLOR=black][COLOR=gray]                [B][COLOR=black]}[/B][B][COLOR=gray][/B]                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="10" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br><input type="submit" value="Einträge editieren" name="btnOutputCancel">Zurück zur Eingabe ...</div><br>';
    echo '<div class="controls"><input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File"></button></div>';
würde dann nur noch das updaten in formular.php fehlen. da muss ich mal grübeln, wie man das effizient macht.
 
Optisch stimmt's und der "edit" bzw. "save" Button "öffnet" bzw. "schließt" die Zeile auch für Eingaben. Was noch NICHT passiert, ist, dass sich auch in der DB was ändert. Da muss ich jetzt in formular.php noch irgendsowas ...
PHP:
if (isset($_POST['edit'])) {
    $update = mysqli_query($mysqli, "UPDATE ...");
}
... reinbasteln, oder?
 
jops, nur eben mit dem save statt edit. das größte prob ist mMn eben, rauszufinden, zu welcher prj-ID der eintrag gehört. denke mal es ist besser, wenn man das post-array durchläuft statt alle projekte der db ^^ also sowas in der art:
PHP:
foreach($_POST as $key => $val) {
  if(startsWith($key, 'save')) {
    $prID = (int)substr($key, 4);
    update projekt where id = $prID;
    updated alle zeiten where prID = $prID;
  }
}
wegen der startswith funke:
string - startsWith() and endsWith() functions in PHP - Stack Overflow
einfach mit reinkopieren. kannst meinetwegen auch ne functions.php bauen und die bei index.php mit includieren oder so, wenn du das getrennt haben magst.
 
Ja, das mit der dynamischen id war auch in meiner Logik der Knackpunkt. Ich hätte eben nach dem INSERT "$queryid = mysqli_insert_id();" gesagt, und dann diese $queryid irgendwie weiterzuverwenden versucht. Aber natürlich blöd, dass das INSERT in einer Schleife steht und sich da ein Wert nicht lange speichern lassen wird ...

Ich schaue mir mal formular.php an.

[EDIT]
So hätte ich es jetzt hingebastelt, aber so geht's nicht:
PHP:
if (isset($_POST['save'])) {
    foreach($_POST as $key => $val) {
        if (startsWith($key, 'save')) {
            $prID = (int)substr($key, 4);
            //update projekt where id = $prID;
            $update_projekte = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            //updated alle zeiten where prID = $prID;
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts]) and $_POST[$ts] != "") {
                    $dauer = $_POST[$ts];                              
                    $update_zeiten = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."', datum='".$ts."' WHERE taetprodid='".$prID."'");
                }
            }
        }
    }
}
 
Zuletzt bearbeitet:
Zurück