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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
also wenn heute mittwoch ist, dann haben wir den tag 3, müssen also 2mal(?) 86400 abziehen um auf montag zu kommen und nochmal die hälfte um auf den tagesanfang zu kommen (vllt is 12 uhr mittags doch ned sinnvoll? kA ^^). dann hat man den wochenanfang. da jetzt 7 tage in timestampform draufzählen, und man sollte das wochenende haben (also 7*86400 addieren). und dann kann man die inputs für die einzelnen tage ja mit deren timestamps bspw ansprechen *denk* also statt name="mo[]" dann eben name="112584858[]" bspw. kann man ja locker nachbauen.

SO nen mist mit Zahlen abziehen machen wir nicht ;) Denn das führt zu Fehlern z.B. Zeitumstellung.

Sondern benutzen die Funktion mktime()

Die Funktioniert nach dem folgenden Prinzip:
PHP:
$vordreisigtagenundzwoelfstunden = date("YmdHis", mktime(date("H")-12,date("i"),date("s"), date("m"), date("d")-30, date("Y")));   
echo $vordreisigtagenundzwoelfstunden;

Du brauchst also nicht rechnen, sondern kannst Tage Monate, Jahre etc. Einfach addieren und subtrahieren.

Okay, m. E. könnte ich das aber auch lösen, indem ich einfach den SHA512-Hash über PW+Salt+Zufallszahl generieren lassen. K. A. wie gut der Generator ist, aber im Normalfall sollte das dann schon extrem unwahrscheinlich werden, dass für zwei User, selbst bei identem PW, zwei idente Hashes rauskommen?!

Die Zufallszahl musst du trotzdem im Klartext in die Datenbank speichern. Denn sonst wirst du den Login nie hinbekommen ;) Die Pin in meinem Beispiel generiert eine Zufallszahl z.B. 14385 und nimmt dann aus der Zeichenkette die Zeichen
 
Zuletzt bearbeitet:
Ich bin gerade am Überlegen, wie ich das jetzt wirklich am besten machen soll, mit Admin und User. Über eine Rechte-Spalte in der User-Tabelle kann ich eine Unterscheidung erzeugen.

Aber was jetzt als erstes?
1) Wenn der MA nach Eingabe seiner Daten auf "Bestätigen" klickt, sollten ihm vielleicht erstmal alle seine Daten aus einer Woche mit Editiermöglichkeit angezeigt werden?! (Dazu brauche ich aber jetzt schon dieses komplizierte Zeit-Zeugs?!)
2) Der Admin braucht irgendwie eine Seite, wo er in erster Linie einen bestimmten MA auswählen und sich dann dessen Daten (nach Wochen sortiert?) anzeigen lassen kann. Filtern nach Tätigkeiten, Produkte, Arbeitszeiten oder gar Kombinationen halte ich mir erstmal als optional offen. Das wird sich wahrscheinlich zeitlich nicht mehr ausgehen, aber werden wir sehen.
Gleichzeitig darf aber nicht vergessen werden, dass ja auch der "Admin" eigentlich nur ein MA ist, der ebenfalls Daten einzugeben hat, wie jeder andere MA auch.

Puh, wie stelle ich das jetzt am besten an? Erstmal eine Ausgabetabelle für alle Daten eines MAs basteln, die bei Klick auf "Bestätigen" angezeigt wird ...

[EDIT]
Also, formular.php könnte man so erweitern:
PHP:
 <?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;  
    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];    
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];
                $erstellt = date('Y-m-d-h-i-s');
                $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
                $eintragen = mysql_query($eintrag);
            }        
        }
        unset($data);
        unset($stunden);
    }
     
    $db_erg = mysql_query("SELECT taetigkeit, produkt, beschreibung, zeit, datum FROM zeiten WHERE zeiten.userid = 1");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
 
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    echo '<table>
            <tr><th>Tätigkeit</th>
            <th>Produkt</th>
            <th>Beschreibung</th>
            <th width="150">MO <input name="mo" type="text" size="10" maxlength="10"></th>
            <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
            <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
            <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
            <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
            <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
            <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th></tr>';
    while ($zeile = mysql_fetch_assoc($db_erg, MYSQL_ASSOC)) {
        echo "<tr>";
        echo "<td>".$zeile['taetigkeit']."</td>";
        echo "<td>".$zeile['produkt']."</td>";
        echo "<td>".$zeile['beschreibung']."</td>";
        echo "<td>".$zeile['zeit']."</td>";
        echo "<td>".$zeile['datum']."</td>";
        echo "</tr>";
    }
    echo "</table>";
 
    mysql_free_result( $db_erg );    
?>
Das würde dann schon mal beispielhaft folgendes Ergebnis liefern:

Unbenannt.PNG

Stellt sich halt noch die Frage, wie ich das Datum neben dem jeweiligen Tageskürzel anzeigen lassen soll (und die Stunden unter dem richtigen Tag), aber ich hoffe, da fällt mir noch was ein. Und im Code habe ich halt jetzt erstmal die userid hard-gecoded, nachdem mein Versuch mit "WHERE zeiten.userid = user.id" nicht funktioniert hatte. K. A. wie ich das wieder dynamisch lösen soll ...
 
Zuletzt bearbeitet:
Mein Vorschlag:

Unterteile die Seite in zwei "Spalten" Navigation und Anzeigeteil ich mache das entweder mit einem div Float Layout (Alte Variante) oder mit einem FlexBox Layout (Neue Variante).

Die Links zu den unterschiedlichen "Websites" speichere ich persönlich in einer DB Tabelle. diese besteht aus den Einträgen id/link/Name/rechte

Mit einer for/foreach Schleife kannst du dann alle Einträge der Tabelle ausgeben. Mit einer if Anweisung innerhalb der Schleife Prüfe ich ob der Nutzer berechtigt ist diesen Link zu sehen (rechte).

wenn meine Hauptseite die index.php ist, dann übergebe ich beim klicken des Links für den ersten Tabelleneintrag "index.php?inc=1".

Im Anzeigeteil der Website steht dann einfach nur eine include() Anweisung die Anhand von inc=1 den passenden Link aus der Datenbank holt und diesen in den include reinschreibt.

Im Ergebnis befindet sich der Nutzer also immer auf der index.php in welche die gewünschte Seite eingebunden ist.
Um unbefugte Nutzer von den Seiten abzuhalten auf die Sie nicht dürfen, muss jetzt weiterhin der Code jedes "includes" in eine if Schleife geschrieben werden, welche die Rechte des Nutzers prüft. Hier ist zu beachten das du immer die Rechte in der Datenbank prüfst und keine $_POST[] Variablen, denn die lassen sich manipulieren. So ähnlich wie wir das mit GET gemacht haben.
 
Von FlexBox habe ich noch nie was gehört, aber nach schnellem googlen ist das nichts anderes, als ein paar "optisch schöne" Buttons, die eben wohin "verlinken". Und so, wie ich das anhand deiner Beschreibung verstanden habe, soll ich jetzt einfach ein paar solcher Buttons machen, und je nachdem ob ein User Recht 0 oder 1 hat, soll ihn ein Buttonklick weiterleiten oder eben nicht?! Am Ende hätten dann die MAs jede Menge schöner Buttons auf ihrer Seite, die nichts machen?!

Da kommt mir meine Idee gerade dezent "einfacher" vor: JEDEM (also Admin und MAs) soll erstmal unsere altbekannte projektzeiterfassung.php angezeigt werden, wo jeder seine Daten eingeben kann. Und hier könnte man vielleicht einen Button "Datenbankauswertung" einfügen, der nur sichtbar ist, wenn userid=0 (Admin)?! Dieser Button führt dann zu einer weiteren Seite, wo der Admin anhand einer Namensauswahl z. B. den ganzen DB-Inhalt eines bestimmten MAs anzeigen lassen kann.

[EDIT]
Ein "vor und zurück" lässt sich ja auch leicht implementieren:
PHP:
echo '<link rel="stylesheet" type="text/css" href="style.css">';
echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
^^ Das hier auf meiner Anzeigeseite für die MA-Daten. Dann werden die eingegebenen Daten im Formular noch angezeigt und können geändert werden. Und mit "Bestätigen" geht's wieder vorwärts zur Anzeige. Stellt sich nur die Frage, ob nicht durch "Bestätigen" bereits Daten in der DB gelandet sind und die neuen/geänderten dann ebenfalls reinkommen?! Da sollten dann die alten/falschen schon geändert bzw. überschrieben werden ...

[EDIT2]
Gerade getestet: Wie ich's angenommen hatte, habe ich dann doppelt so viele Zeilen als gewollt in der DB. Da muss ich mir noch was überlegen, wie beim Editieren die alten Einträge gelöscht oder durch die neuen ersetzt werden.
 
Zuletzt bearbeitet:
Inkorrekt FlexBox ist im Prinzip genau das gleiche wie ein div Basiertes Layout (nur mit ein paar Vorteilen). Das hat erst mal Garnichts mit Buttons zu tun.

Ist klar wenn du das Formular als Link benutzt und auf bestätigen haust produziert er Einträge.

Wie gesagt bau dir eine Navigation und eine 2. Website für die Ausgabe.
 
Trotzdem habe ich das Gefühl, dass wir im Prinzip das gleiche machen wollen ... ;)

Ich würd's halt über Buttons realisieren, a) weil ich mich (nur) damit auskenne, und b) weil das jetzt schon zur Optik dessen passt, was wir schon haben. Außerdem kann ich ja auch bei meinen Buttons die Rechte einfließen lassen.
Bei FlexBox habe ich jede Menge Beispielcodes gefunden, aber wenig Anschauungsbeispiele, wie das dann konkret ausschaut.

Auf jeden Fall habe ich bei meinem Ansatz derzeit folgende Probleme:
- Zuordnung von Datum zu Tageskürzel in der Auswertung
- Zuordnung von Stundenanzahl zu Tag/Datum
- Löschen oder Überschreiben von alten Einträgen in der DB nach Editieren

^^ Damit "spiele" ich mich gerade herum, wie man das lösen könnte ...
 
Zu deinem "Reineditierten":
Ich sehe halt keinen Sinn für dein Linksystem, weil ich ja defacto nur einen einzigen Link (deine Version) oder Button (meine Version) dazukriegen würde --> Auswertung für den Admin. Alles andere lässt sich locker über bereits existierende Buttons realisieren.
Wenn ich jetzt ~10 Seiten hätte und dafür 10 Links machen sollte, DANN könnte ich mir das schon viel eher auf deine Art vorstellen.

Für die Ausgabe, an der ich gerade bastle, kann ich mir zwar durchaus eine zweite Seite basteln, aber ich glaube, mein drittgenanntes Problem würde trotzdem bestehen bleiben?!
 
wieso wollt ihr unbedingt 2 seiten machen? boss hat das doch schon super erkannt (im ansatz): ihr habt die tabelle. diese kann output und input gleichermaßen bereitstellen (mir erschließt sich einfach nich, wozu man hier 2 tabellen oder gar 2 seiten braucht). und was ist das problem, mit if dem admin zusätzliche buttons und inputs zur verfügung zu stellen?

und ganz generell: auch der normale MA kann doch filtern. is doch durchaus denkbar ^^ nur halt nicht nach daten anderer MA's. aber in seinen daten sollt er auch filtern können *denk*
 
1. Natürlich kannst du auch Buttons verwenden. Ich nehme an du wirst dann halt die Einträge hardcoded machen. Mein System basiert halt wieder auf der einfachen Erweiterbarkeit des Codes. Denn ein "neuer" Eintrag in der DB aktualisiert damit die gesamte Navigation der Webseiten.

Das ändern musst du natürlich über die UPDATE Funktion statt INSERT lösen. Auch musst du eine Prüfung einbauen ob INSERT oder UPDATE erfolgen soll. Dann ist das Problem gelöst.
Wo ist das Problem, aus einem Timestamp kannst du dir doch ein Tageskürzel ausgeben lassen.

PHP:
$tage = array("So","Mo","Di",
"Mi","Do","Fr","Sa");

$tag = date("w",$timestamp);
echo $tage[$tag];

Edit:
Zwei "Seiten" bzw. includes würde ich verwenden weil er sich damit nicht den bereits bestehenden Code zerschießt. Denn genau das wird passieren wenn er versucht diesen entsprechend einer Ausgabe mit Filtern umzuschreiben und das Eintragen Script auf Eintragen oder Update umzubauen.
 
Zuletzt bearbeitet:
Ich habe zwar jetzt die zweite Seite erstellt, halte sie aber auch immer noch für unnötig ...

@ Tessa
Meine Vorstellung mal ohne echte Funktion, aber grafisch dargestellt:

Unbenannt.PNG

Mehr ist das m. E. nicht. Die ersten drei Buttons sind klar, haben wir ja schon seit Tagen. Der fünfte sollte auch klar sein, auch wenn ich noch nicht weiß, wie nun konkret ich dessen Funktion umsetzen soll.
Interessant ist jetzt erstmal der vierte Button "Bisherige Einträge in Datenbank anzeigen". Dieser soll auf jeden Fall mal den Code aufrufen, der mir die etwas weiter oben gezeigte Ausgabe-Tabelle bastelt und mit Daten aus der DB füllt.
Der Knackpunkt sind halt jetzt die Rechte: Wie konkret sich das nun umsetzen lässt, muss ich noch ausprobieren, aber in der Theorie hätte ich mir gedacht --> Klickt ein MA drauf (user.rechte=1), soll der Button nur alle Daten dieses MAs aus der DB anzeigen. Klickt der Admin drauf (user.rechte=0), soll der Button den gesamten* DB-Inhalt anzeigen und zumindest die Filtermöglichkeit "MA-Name" bieten.

* wobei das hier bei hunderten Einträgen schnell overkill werden kann. Vielleicht zuerst die Filterfunktion anzeigen, damit der Admin nicht gleich von Daten "erschlagen" wird?!

@ DarkMo
Habe vorhin mit meinem Auftraggeber geredet: Das mindeste, was wir beide haben wollen, ist für den Admin die Möglichkeit, nach MA-Namen zu filtern (wie von mir eben erwähnt). Alles andere (Filtern nach Tätigkeiten, Produkten, Zeiten, Kombinationen, etc.) wäre nett, aber ist jetzt nicht absolut notwendig. Da richten wir uns nach der Zeit (nächste Woche?), wie das dann ausschaut, wenn das absolut notwendige steht. :)

[EDIT]
Ah ja, siehste, an UPDATE hatte ich wieder nicht gedacht. Thx, probier's gleich aus.
 
Zuletzt bearbeitet:
@DarkMo

du denkst zwar wieder mal effektiv aber eben nicht simpel. Es ist einfacher Ihm für alles getrennten Code bzw eine eigene "Seite" zu geben. Selbst wenn der Code dann zu 95% redundant ist.

Im Ergebnis braucht er sich dann nämlich keine Gedanken um eine Trennung zwischen INSERT und UPDATE machen. Denn die Formulare rufen dann ja zwei getrennte Seiten auf. z.B Insert.php oder Update.php.

Du vereinfachst also mit der Aufteilung auf mehrere Seiten die zwar weitgehend gleich sind den Code, denn es gibt weniger if() Abfragen die es zu verstehen gilt und du benötigst weniger "Übergabedaten" die identifizieren welcher Codebestandteil denn jetzt ausgeführt werden soll. Denn das ergibt sich ja bei der Aufteilung bereits daraus von welcher Seite das Script aufgerufen wurde.

Im Ergebnis kann man also sagen, der Code wird dadurch zwar insgesamt länger aber auch einfacher.
 
Also, so wie ich das sehe, geht's jetzt darum:
PHP:
if () {
     $eintragen = mysql_query("INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')");
} else {
     $eintragen = mysql_query("UPDATE zeiten SET taetigkeit='$taetigkeit', produkt='$produkt', userid='$userid', beschreibung='$beschreibung', zeit='$dauer', datum='$tag', erstellt='$erstellt' WHERE ???");
}
Zum einen muss ich mir eben eine passende if-Bedingung überlegen, und zum anderen, wie ich jetzt beim WHERE wieder die entsprechende Zeile identifiziere.

Bei der if-Bedingung hätte ich mir gedacht, könnte man vielleicht irgendwie ein "Token" mitgeben, sobald auf "Einträge editieren" geklickt wird. Dieses Token wandert zu projektzeiterfassung.php und wird dort bei einem weiteren "Bestätigen" (nachdem die Daten dann entsprechend geändert wurden) wieder an formular.php zurückgesendet. Wird das "Token" dort empfangen, dann eben if (token=='true') ... INSERT und UPDATE müsste ich dann eigentlich im if vertauschen.

^^ Lässt sich irgendsowas realisieren? :huh:

Ansonsten muss ich es eh über mehrere Seiten machen.

@ DOcean
Danke, genau auf der Seite hatte ich mir das angeschaut. Aber es wirkt mir zu umständlich für "das bisschen" was wir brauchen.
 
PHP:
WHERE id=$id
Denn die Id kannst du dir bereits bei der Anzeige ausgeben lassen.
Realisieren lässt sich prinzipiell alles. Man kann auch eine Bedingung "verneinen" != also "ungleich". Du kannst natürlich deinem Button den Link "projektzeiterfassung.php?token=true" verpassen ;) Dann kannst du diesen dort per GET abfragen in ein hiddenfield verfrachten und hast diesen dann in Formular.php per POST zur Verfügung.
 
a) Nur fürs Verständnis: Welche ids vergleichen wir hier? "id" ist die id in zeiten, also jene, die die Zeilen dort identifiziert. Aber was ist in der Variable "$id" gespeichert? Wo nehmen wir den Wert darin her?

b) Tja, das doofe ist, wenn ich in meinem Button "projektzeiterfassung.php?token=true" sage, dann leitet mich das zwar auch zurück, aber wieder zu einer leeren projektzeiterfassung. Bei meiner Version mit "history.go(-1);return true;" komme ich wieder so zurück, dass die gemachten Einträge wieder angezeigt werden.
Jetzt stellt sich halt die Frage: Was ist denn bei mir dieses "return true"? Könnte ich nicht das auch schon als mein "Token" verwenden?
 
zu a)
Den Wert lässt du bereits beim Ausgeben in die Tabelle in einem hidden field speichern. Wenn du also die Tabelle mit vorbefüllten Daten zum ändern hast, dann kennst du in diesem Zeitpunkt bereits die ID. Die wird dann wieder mit übergeben und von dir in $id gespeichert. Damit kannst du dann das Update an genau der richtigen Stelle ausführen.

zu b)
Du sagst der Website doch nur Stelle bitte die Seite wieder her die in deiner Historie vor der aktuellen Website kommt. Also quasi ein Klick auf den Zurückbutton im Browser. Da kannst du dann keine anderen Werte übergeben. Denn du gehst ja nicht "Vorwärts" sondern machst einen Schritt "Zurück".

return True ist der "Rückgabewert" der Funktion. Die Funktion gibt also "Erfolg" zurück. Ist in diesem Fall quasi das Ausführungskommando.
 
Okay, bei b) blicke ich schon wieder gar nicht mehr durch ...
Wie soll denn der User eben gemachte Einträge editieren können, wenn er gar nicht mehr sieht, was der da ne Minute zuvor eingegeben hat?

Jedenfalls habe ich jetzt mal versucht, das alles halbwegs im Code hinzubasteln, aber das ist ziemlich sicher noch so voller Syntaxfehler, dass ich noch gar nicht versuchen wollte, das auszuprobieren.

projektzeiterfassung.php:
PHP:
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Projektzeiterfassung</title>
</head> 
<body>
<form action="formular.php" method="post">
    <br><h1>Projektzeiterfassung</h1>
    <table>
        <tr><th>Tätigkeit</th>
        <th>Produkt</th>
        <th>Beschreibung</th>
        <th width="150">MO <input name="mo" type="text" size="10" maxlength="10"></th>
        <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
        <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
        <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
        <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
        <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
        <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th></tr>    
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
      
    if( isset($_GET['add'])) {
        $add = $_GET['add']; 
        $add++;
    } elseif (!isset($_GET['rem'])) {
        $add = 1;
    }
    if ( isset($_GET['rem'])) { 
        $add = $_GET['rem']; 
        $add--;
    }

    for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['taetigkeit'].'">'.$taetigkeit['taetigkeit'].'</option>';
        }
        echo '</select></td>';

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

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

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr>';
    } 
    echo '</table><br>';

    echo '<div class="submit"><button name="add" type="button" value="Zeile hinzufügen" onclick="window.location.href=\'projektzeiterfassung.php?add='.$add.'\';">Neue Eingabezeile hinzufügen</button> <button name="rem" type="button" value="Zeile entfernen" onclick="window.location.href=\'projektzeiterfassung.php?rem='.$add.'\';">Eingabezeile entfernen</button></div><br>';
    echo '<input type="hidden" name="add" value="'.$add.'">';

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    if ($token) {
        echo '<div class="submit"><br><br><form action=";return $token=true;"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"></form></div>';
    } else {
        echo '<div class="submit"><br><br><form action=";return $token=false;"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"></form></div>';
    }

    echo '<div class="submit"><form action=""><br><input type="submit" value="Daten nach Excel exportieren"></form></div>';
?> 
</body>
</html>
^^ Probleme:
- Ganz unten im if: Würde sich das mit dem token so machen lassen (angenommen, es kommt bereits von formular.php. Wobei das ja eigentlich gar nicht sein kann, weil projektzeiterfassung.php immer zuerst kommt.)?
- Was soll ich bei form action angeben? Blöderweise weiß ich jetzt durch das ganze Rumgebastle nicht mehr, wie ich das ursprünglich hatte. Wenn ich aber einfach formular.php angebe (dann könnte ich das auch in das bestehende form reinschreiben), werden mir ja nicht nur die Daten aus der DB angezeigt, sondern auch gleich wieder welche reingeschrieben?! Wie lösen? Ich hatte das schon, aber ich weiß es eben nicht mehr, verdammt!

formular.php:
PHP:
 <?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;  
    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];    
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
        
        $token = false;
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];
                $erstellt = date('Y-m-d-h-i-s');
                if (!$token) {
                    $eintragen = mysql_query("INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')");
                } else {
                    $eintragen = mysql_query("UPDATE zeiten SET taetigkeit='$taetigkeit', produkt='$produkt', userid='$userid', beschreibung='$beschreibung', zeit='$dauer', datum='$tag', erstellt='$erstellt' WHERE id=$id");
                }
            }        
        }
        unset($data);
        unset($stunden);
    }
    
    $db_erg = mysql_query("SELECT taetigkeit, produkt, beschreibung, zeit, datum FROM zeiten WHERE zeiten.userid = 1");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
 
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    echo '<table>
            <tr><th>Tätigkeit</th>
            <th>Produkt</th>
            <th>Beschreibung</th>
            <th width="150">MO <input name="mo" type="text" size="10" maxlength="10"></th>
            <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
            <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
            <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
            <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
            <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
            <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th></tr>';
    while ($zeile = mysql_fetch_assoc($db_erg, MYSQL_ASSOC)) {
        echo "<tr>";
        echo "<td>".$zeile['taetigkeit']."</td>";
        echo "<td>".$zeile['produkt']."</td>";
        echo "<td>".$zeile['beschreibung']."</td>";
        echo "<td>".$zeile['zeit']."</td>";
        echo "<td>".$zeile['datum']."</td>";
        echo "</tr>";
    }
    echo '</table>';
 
    mysql_free_result($db_erg);

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return $token=true;"></form></div>';
?>
^^ Problem:
- Kann man das hier mit dem $token so lassen? In Zeile 22 bei der Definition, dann im if in der for-Schleife, und ganz am Ende im Button?
 
Wie soll denn der User eben gemachte Einträge editieren können, wenn er gar nicht mehr sieht, was der da ne Minute zuvor eingegeben hat?
Ist das nicht offensichtlich? Du musst die Felder eben mit diesen Werten "Vorbelegen"

Zu deinem zweiten Problem du musst halt eine Fallunterscheidung realisieren damit du dann mit einer if zwischen UPDATE und INSERT wählen kannst.
 
Ist das nicht offensichtlich? Du musst die Felder eben mit diesen Werten "Vorbelegen"
Geht's nicht auch einfacher? Du sagst ja selbst, an die id der Einträge käme ich ran. Kann ich dann nicht einfach statt UPDATE die alten Einträge, die ich "editiert" haben will, löschen, und die "Editierten" ganz normal per INSERT in die DB schreiben? Das war jedenfalls mein ursprünglicher Gedanke bevor du mit UPDATE kamst ...
(Dann bräuchte ich auch das ganze token-Zeugs nicht?!)

Und wie komme ich jetzt denn am besten zu meiner Ausgabe in formular.php? Wenn ich den entsprechenden Button in projektzeiterfassung.php normal in die bestehende form einbaue, geht's zwar, aber er hätte dann gleichzeitig auch die selbe Wirkung wie "Bestätigen". :huh:
 
Natürlich kannst du die Einträge auch löschen. Dadurch sehen die Nutzer aber trotzdem nicht was sie eingetragen haben^^.
Der Befehl dafür ist DELETE.

Du wirst aber schnell feststellen das du dabei auf genau dieselben Probleme stößt. Denn eine Fallunterscheidung ist trotzdem nötig. Du musst ja wissen ob du ein INSERT oder ein DELETE machen musst ;)


Und wie komme ich jetzt denn am besten zu meiner Ausgabe in formular.php? Wenn ich den entsprechenden Button in projektzeiterfassung.php normal in die bestehende form einbaue, geht's zwar, aber er hätte dann gleichzeitig auch die selbe Wirkung wie "Bestätigen".

Gleiches Problem wie oben. Fallunterscheidung.
 
Zurück