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

Also in projekte und zeiten jeweils 1 weitere Spalte hinzufügen, die z. B. "key" nennen ... und dann was? Mit welchen (int?-)Werten anfüllen? Oder soll ich schauen, dass irgendwie in "key" dann pro Zeile der selbe Wert landet, den wir schon in "id" haben (das auto-increment)? Aber worin wäre dann wieder der Sinn? Dann hätten wir 2x das selbe ...

^^ Irgendwie finde ich das immer noch völlig konfus ... :huh:
 
Nein, KEINE Zeile einfügen. Einen INDEX. Auf bestehende Zeilen.
Ich hab doch schon dreimal geschrieben: In zeiten UNIQUE INDEX über die drei Zeilen user, taetprodid, datum
Sorry, vielleicht bin ich didaktisch nicht gut genug es zu erklären. Entweder du machst es halt mit ON DUPLICATE KEY UPDATE, dann musst du wissen, wie du einen unique index erstellst, das steht auf den von mir verlinkten Seiten oder in jedem guten SQL-Buch, oder du googelst danach, oder du machst es halt nicht so.

SQL CREATE INDEX Statement
nun gehste in deinen php my admin oder was du hast, suchst dort ne möglichkeit, sql befehle einzuhämmern und schreibst dein sql querry da rein. enter, fertig. ^^

Gar nicht notwendig, phpmyadmin hat wunderbare Buttons um Indizes zu erstellen, man muss noch nicht mal den Syntax lernen (wobei das nie schaden kann).

Edit: Habe gehört, das hier sei gut:
http://www.amazon.de/Datenbanken-SQL-für-Einsteiger-Datenbankdesign-ebook/dp/B00BXENJXC/
Wenn du eher auf "peppigere" Bücher stehst, diese Reihe hat üblicherweise gute Beispiele. Das Buch selbst soll ok sein:
http://www.amazon.de/SQL-von-Kopf-bis-Fuß/dp/3897217600/
 
Zuletzt bearbeitet:
Wo sollte das denn sein?

Unbenannt.PNG

Sonst gebe ich halt einfach den Befehl ein, macht ja im Resultat dann keinen Unterschied ...

[EDIT]
Hab's jetzt eingegeben. Das ist zurückgekommen:
PHP:
CREATE UNIQUE INDEX p_index ON projekte (taetigkeit, produkt, userid, erstellt);# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).  
CREATE UNIQUE INDEX z_index ON zeiten (userid, taetprodid, datum);# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).
Stimmt das jetzt, oder nutzt uns das was?

[EDIT2]
Scheint nicht so ganz zu klappen. Beim Update-Versuch zweier Datensätze hat er den ersten verdoppelt (aber mit neuer ID in der DB) und beim zweiten einfach gar nichts gemacht:

Unbenannt.PNG
 
Zuletzt bearbeitet:
Unter "Struktur", dann die drei Felder auswählen, dann auf UNIQUE klicken (unten drunter, links), kannst es selbstverständlich auch eingeben.
 
zeiten ändern funktioniert einwandfrei, aber jeder geupdatete Eintrag wird dann in der DB in projekte ein zweites Mal mit neuer ID angelegt. Also stimmt's bereits in zeiten, aber irgendwas hat's noch in projekte.

Übrigens war es nicht möglich, in projekte "beschreibung" für das unique Zeugs hinzuzunehmen (weil er keinen TEXT, für den er kein Limit kennt, mag), also habe ich stattdessen "userid" zu "taetigkeit", "produkt", und "erstellt" ergänzt. Macht das jetzt was aus?
 
Wenn ich deine Datenbank richtig verstehe, müsste der Unique Index in Projekte über userid, taetigkeit und produkt gehen, nicht über erstellt und beschreibung. Denn die Kombination aus userid, taetigkeit und produktist doch einzigartig und identifiziert das ganze, oder?
 
Soweit ich meine DB selber verstehe, glaube ich das nicht. Es ist durchaus möglich, dass ein- und derselbe User zwei Einträge mit selbem Produkt und selber Tätigkeit erstellt. Somit würden "userid", "taetigkeit" und "produkt" nicht reichen ...

Es ist allerdings nicht möglich, dass ein- und derselbe User genannte zwei Einträge zur exakt selben Zeit erstellt. Deswegen meine Logik mit dem Hinzufügen von "erstellt."

[EDIT]
Ich muss mich korrigieren: Scheint doch möglich zu sein, allerdings werden dann Zeitwerte überschrieben. :what: Wie behindert ist unser System eigentlich??? :ugly:

Jedenfalls, was soll ich jetzt machen? Das "unique" in projekte nochmal neu über "userid", "taetigkeit" und "produkt"?

[EDIT2]
Hab's gemacht; damit funktioniert das Editieren jetzt schon für Beschreibung und Zeiten, aber ein Ändern von Tätigkeit und Produkt führt immer noch zum Erstellen eines doppelten Eintrages mit neuer ID in der DB.
 
Zuletzt bearbeitet:
ALLES soll editierbar sein. Ich will die Tätigkeit ändern können, das Produkt, die Beschreibung und auch einen mögichweise vorhandenen Stundenwert für jeden Wochentag.

Klappt schon alles außer eben Tätigkeit und Produkt. Da wird ein doppelter Eintrag mit den neuen Werten in der DB erstellt, anstatt dass die alten überschrieben würden.

(Ich kann Englisch)
 
Okay, sorry, dann hatte ich da was missverstanden. In dem Fall nimm den Index in projekte nochmal raus.

Am Besten löst du es in projekte dann nicht über das ON DUPLICATE KEY UPDATE, sondern wie du es ursprünglich mal angedacht hattest. Für zeiten ist das ON DUPLICATE KEY UPDATE nach wie vor sinnvoll, für projekte nicht.

Du könntest zwar theoretisch einen Unique/Primary Key auf id legen (ist sowieso sinnvoll), aber dann müsstest du die id beim INSERT mit angegeben und kannst nicht mehr auf MySQLs eingebaute AUTO_INCREMENT-Funktion bauen, sondern müsstest die id mit MAX(id)+1 ermitteln, davor die Tabelle LOCKen, danach UNLOCKen usw... Ist nicht sinnvoll.
 
So meinst du?
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!isset($_POST['edit'])) {
                echo 'INSERT';
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                $taetprodid = mysqli_insert_id($mysqli);
            } else {
                echo 'UPDATE';
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }
                
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                }
            }
        }
    }
^^ Dann musst du mir aber bitte verraten, was bloß ich im if als Unterscheidungskriterium nehmen soll. Dieses !isset() auf den edit-Button funktioniert nämlich aus mir unerfindlichen Gründen nicht, er kommt immer nur ins INSERT, nie ins UPDATE ...

[EDIT]
Habe noch schnell zum Testen den INSERT-Code auskommentiert, damit er nis UPDATE kommt: Dieses läuft absolut korrekt ab, auch in der DB.
 
Zuletzt bearbeitet:
Was ist $_POST['confirm'], was ist $_POST['edit']? Wenns beides Buttons sind, kanns ja nicht klappen, da man sie schlecht gleichzeitig drücken kann.
 
Man könnte meinen, es wird irgendwann langweilig hier mitzulesen, aber es ist dann doch immer wieder amüsant. Weiter so!

Was hat deinen Arbeitgeber denn bisher die Entwicklung dieser Software gekostet? Dass du den Source-Code, dessen Entwicklung er bezahlt, hier regelmäßig veröffentlichst, ist für ihn in Ordnung?

(Dieser Beitrag ist zu 100% frei von Sarkasmus)
 
Ja, sind beides Buttons. In meiner Logik hätte ich mir das aber so vorgestellt ...

1) Man sieht projektzeiterfassung.php und klickt auf "eigene", um zu auswerten.php zu kommen.
2) In auswerten.php drückt man jetzt "edit", $_POST['edit'] wird gesetzt
3) Man kommt zurück zu projektzeiterfassung.php, macht dort seine Änderungen, und drückt dann "bestätigen". $_POST['confirm'] wird gesetzt
4) Man landet jetzt in formular.php, wo doch sowohl $_POST['confirm'] als auch $_POST['edit'] immer noch gesetzt sein müssten?!

^^ Somit müsste meine Abfrage doch stimmen?! $_POST ist ja ein array mit beliebig vielen Feld-Elementen?! 'confirm' überschreibt ja 'edit' nicht?!

Wo ist mein Denkfehler? :huh:
 
POST steht für die POST-Methode eines HTTP-Requests. Ein HTTP-Request funktioniert nicht so, wie du dir das vorstellst. Und $_POST ist nicht über mehrere Requests persistent (im Gegensatz zu einer Session).
Wikipedia erklärts ganz gut, wie HTTP funktioniert:
Hypertext Transfer Protocol

Kurz: Nein, so geht das nicht. Es ist entweder confirm oder edit gesetzt.
 
Ich hatte in der Zwischenzeit schon eine Lösung gefunden, bin nur wegen Testen noch nicht zum Posten gekommen. Über $_SESSION klappt's, wenn ich in der EDIT-Ausgabe eine entsprechende Variable setze und diese im "confirm" dann abfrage:
Code:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
           [COLOR=royalblue] if (!($_SESSION['update'] == 1)) {                echo 'INSERT';
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                [COLOR=darkorchid]$taetprodid = mysqli_insert_id($mysqli);            } else {
                echo 'UPDATE';
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }
                
            for ($b = 0; $b < 7; $b++) {
                [COLOR=darkorchid]///////////                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $taetprodid AND datum = $ts;");
                }
            }
        }
    }
Damit bleibt mir nur noch eines zu erledigen: Die taetprodid bzw. projekt-id muss an der markierten Stelle hin. Wie, da hat noch keiner meiner Versuche geklappt. Derzeit wird jedenfalls immer bei zeiten 0 für die taetprodid eingetragen, wodurch es keine Zuordnung zu den Projekten gibt, was wiederum dazu führt, dass nichts aus der DB ausgelesen werden kann.
 
Tuts an der unteren violetten Stelle nicht einfach $taetprodid = $_SESSION['prid'];
Oder ist das wieder was anderes?
 
^^ Eben nicht, das hatte ich schon probiert ... warum's nicht klappt, weiß ich aber auch noch nicht.

[EDIT]
Ich glaube, ich seh's schon: Diese $_SESSION-Variable wird in projektzeiterfassung.php im update-Code gesetzt. Der ist aber noch nicht erreicht, solange ich mir nur vorhandene Datensätze anzeigen lassen will.
 
Was spricht eigentlich gegen ein hidden-Feld?

HTML:
<input type="hidden" value="hierdiebisherigeIdeintragen" name="meinelustigeid"/>

Ich finde es ein bisschen seltsam, diese Sachen in der Session zu speichern...
 
Wo sollte ich das vernünftig hinbasteln? Ich bin ja schon in formular.php und ich kann ja, wie wir's ja die letzten zwei(?) Stunden hatten, keinen weiteren Buttons (oder ein Feld) in "confirm" abfragen. Außerdem kann ich die ID des nächsten zu erstellenden Eintrages auch nicht vorausahnen und sie dem Feld-value zuweisen ...

[EDIT]
So funktioniert's in der Ausgabe, dass wieder alles aus der DB geholt wird:
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!($_SESSION['update'] == 1)) { 
                mysqli_query($mysqli, "INSERT INTO 
                                            projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                          VALUES 
                                            ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");             
            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".$_SESSION['prid']."';");
            }
                
            $taetprodid = mysqli_insert_id($mysqli);
            for ($b = 0; $b < 7; $b++) {               
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                } elseif ($_POST[$ts.'_'.$a] == "") {
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $taetprodid AND datum = $ts;");
                }
            }
        }
    }
Allerdings stimmt jetzt das Updaten der Zeiten wieder nicht, da bleibt die taetprodid 0 in der DB. :(
 
Zuletzt bearbeitet:
Zurück