Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
[Apache, phpmyadmin, html, PHP, ...] Datenbank mit webbasiertem Zugriff erstellen
eben deswegen frag ich ja ^^ weil gerade beim rowcollector haste doch schon das meiste an daten. bzw kannst fehlendes sehr simpel hinzufügen. also für die zeiten eben die id des eintrags in der db (da brauchste nich mehr mit where klauseln filtern, sondern änderst einfach den zeiten-eintrag direkt per angegebener id usw usf).
Im Moment ist der Code für die vorbeleg-Zeile halt unfertig, und ich traue mich kaum, diese in ihrer jetzigen Form schon in projektzeiterfassung.php zu integrieren zu versuchen ...
Nicht, dass ich mir dann alles zerschieße; wobei, das Gesamtprojekt hätte ich eh mehrfach gesichert. Ich gehe jetzt in die Mittagspause, und ab 12:30 probiere ich das dann. Aber siehe noch meine vorige Anmerkung: So wie von dir skizziert, klappt das mit den keys im Feld noch nicht. Da kriege ich leere Dropdowns weil nichts im Feld ist.
Allerdings muss das (unsere alte Version) ...
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;
}
}
... und das (die mögliche neue) ...
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)) {
$teatigkeiten[$row_t['id']] = $row_t['name'];
}
}
... zumindest semantisch ident bleiben, sonst kriege ich dann beim Integrieren Probleme.
Ich bin mir sogar sicher, dass man von dem blau markierten Code auch nochmal gut die Hälfte wegsparen könnte, wenn man es noch geschickter in den eigentlichen projektzeiterfassung.php-Code einfügen würde, aber das hebe ich mir erstmal für später auf.
Als erstes bleibt eben die Zeit zu richten (das "nope!" ist immer noch meine Fehlermeldung wegen dem leeren query, das wir aber jetzt eh anders machen wollen?!):
In formular.php brauche ich vorerst nicht mehr als das:
PHP:
if (isset($_POST['edit'])) {
if (isset($_POST['check'])) {
$site_title = 'Projektzeiterfassung';
$section = 'pze';
}
}
Später dann muss da dann wohl noch das UPDATE-Zeugs dazu, und dafür braucht's dann wahrschenlich auch eine Unterscheidung beim "Bestätigen"-Button?! Eintrag vorhanden?-->UPDATE, nicht vorhanden?-->INSERT ...
Kann mir bitte wer verraten, warum folgendes INSERT-query leer ist?
PHP:
$eintragen = mysqli_query($mysqli, "INSERT INTO user (vorname, nachname, name, passwort, rechte) VALUES ('$vorname', '$nachname', '$username', $passwort', '$rechte');");
Ich habe gegenüber der ursprünglichen Version (war nur Username, Passwort, Rechte) absolut nichts verändert, außer Vorname und Nachname bei der Registrierung hinzuzufügen. Selbstverständlich habe ich auch die DB-Tabelle "user" entsprechend angepasst:
Und alle 5 Variablen beinhalten korrekte Werte, wie ich bereits durch echo-Ausgaben überprüft habe. Nachfolgend der Gesamtcode:
Code:
<?php
$erstellt = date('Y-m-d H:i:s');
if (isset($_GET['section'])) {
$section = $_GET['section'];
}
// seiten-titel bestimmen
if (isset($_POST['btnRegForm']) or $section == "register") {
$site_title = "Registrieren";
$section = "register";
}
if (isset($_POST['auswerten']) or $section == "output") {
$site_title = "Ausgabe";
$section = "output";
}
if (isset($_POST['filterName']) or isset($_POST['filterTaet']) or isset($_POST['filterProd']) or isset($_POST['kombination']) or isset($_POST['auswertenall']) or $section == "output_admin") {
$site_title = "Ausgabe (Admin)";
$section = "output_admin";
}
if (isset($_POST['btnRegCancel'])) {
$site_title = "Login";
$section = "login";
}
if (isset($_POST['btnOutputCancel'])) {
$site_title = "Projektzeiterfassung";
$section = "pze";
}
// hiddenfields-Daten speichern
if (isset($_POST['add'])) {
$add = $_POST['add'];
}
if (isset($_POST['wa'])) {
$wochenanfang = $_POST['wa'];
}
if (isset($_POST['we'])) {
$wochenende = $_POST['we'];
}
if (isset($_POST['prevWeek'])) {
$wochenanfang -= 60 * 60 * 24 * 7;
$wochenende -= 60 * 60 * 24 * 7;
}
if (isset($_POST['nextWeek'])) {
$wochenanfang += 60 * 60 * 24 * 7;
$wochenende += 60 * 60 * 24 * 7;
}
$kw = date('W', $wochenanfang);
$jahr = date('Y', $wochenanfang);
$monat = date('n', $wochenanfang);
$tag = date('j', $wochenanfang);
if (isset($_POST['addLine'])) {
$add++;
}
if (isset($_POST['remLine'])) {
$add--;
}
if ($add < 1) {
$add = 1;
}
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';
$section = 'pze';
} else {
$protokoll .= '- Benutzername und/oder Passwort waren falsch oder nicht registriert.<br>';
}
}
if (isset($_POST['logout'])) {
$site_title = "Login";
logout();
}
if (isset($_POST['btnReg'])) {
[COLOR=royalblue]if (isset($_POST['vorname'], $_POST['nachname'], $_POST['username'], $_POST['password'], $_POST['password2']) and trim($_POST['vorname']) != "" and trim($_POST['nachname']) != "" and trim($_POST['username']) != "" and trim($_POST['password']) != "" and trim($_POST['password2']) != "") {
$vorname = $_POST['vorname'];
$nachname = $_POST['nachname'];
$username = $_POST['username'];
$passwort = $_POST['password'];
$passwort2 = $_POST['password2']; if ($passwort != $passwort2) {
$protokoll .= '- die Bestätigung des Passworts stimmt nicht.<br>';
$_POST['btnRegForm'] = true;
unset($_POST['btnReg']);
$site_title = "Registrieren";
} else {
$passwort = hash('sha512', ($passwort).$salt);
if ($username == "test") {
$rechte = 0;
} else {
$rechte = 1;
}
$check = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."';");
if (mysqli_num_rows($check)) {
$protokoll .= '- Benutzername schon vorhanden.<br>';
$_POST['btnRegForm'] = true;
unset($_POST['btnReg']);
$site_title = "Registrieren";
} else {
[COLOR=royalblue]$eintragen = mysqli_query($mysqli, "INSERT INTO user (vorname, nachname, name, passwort, rechte) VALUES ('$vorname', '$nachname', '$username', $passwort', '$rechte');"); if ($eintragen) {
$protokoll .= '- Benutzer <b>'.$username.'</b> wurde erstellt.';
[COLOR=red]} else {
$protokoll .= '- Fehler: Speicherung des Benutzernamens und/oder Passworts fehlgeschlagen.'; $_POST['btnRegForm'] = true;
unset($_POST['btnReg']);
$site_title = "Registrieren";
}
}
}
} else {
$protokoll .= '- Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br>';
$_POST['btnRegForm'] = true;
unset($_POST['btnReg']);
$site_title = "Registrieren";
}
}
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 + ($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');");
}
}
}
}
if (isset($_POST['delete'])) {
if (isset($_POST['check'])) {
$selected = $_POST['check'];
for ($i = 0; $i < count($selected); $i++) {
$delete1 = mysqli_query($mysqli, "DELETE FROM projekte WHERE id = $selected[$i]");
$delete2 = mysqli_query($mysqli, "DELETE FROM zeiten WHERE taetprodid = $selected[$i]");
}
}
}
if (isset($_POST['edit'])) {
if (isset($_POST['check'])) {
$site_title = 'Projektzeiterfassung';
$section = 'pze';
}
}
/*$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."';");
}
}*/
^^ Er läuft mir jetzt immer ins rot-markierte else, weil das query leer ist. Das kann ich auch durch "echo 'eintragen: '.$eintragen"; sehen. Dann kriege ich nur "eintragen: " ausgegeben.
[EDIT]
Hab's schon: Ein einfaches ' hatte vor $passwort gefehlt. Und für sowas sucht man 3 Stunden und fragt sich, was für gravierende Logikfehler man wohl wieder reingebracht haben könnte ...
---------------
Nun, dann geht's jetzt eh wieder weiter damit, dass ich noch die eventuell vorhandenen Stunden für jeden einzelnen Tag in die vorbelegte Zeile reinkriegen muss. Allerdings sehe ich noch nicht, wie das über den $row_collector im Falle von mehreren vorbelegten Zeilen (man kann ja mehr als eine auf einmal editieren, oder sollte es zumindest können) funktionieren soll. Der kann ja immer nur die Daten von einem Datensatz speichern?! Deswegen hatten wir ja in den vorigen Arbeitsschritten auch immer wieder die "Überschreiber" und ich durfte mir für jeden Schmarr'n einen workaround überlegen.
Mal sehen, wie man das jetzt angehen könnte ... aber ich gehe schon davon aus, dass ich nicht um DB-Abfragen für die Stunden herumkommen werde ...
[EDIT2]
Ich hab's jetzt über den $row_collector probiert, aber da komme ich auf gar nichts vernünftiges. Daher jetzt ein neuer Versuch über eine DB-Abfrage, der schon in die richtige Richtung geht ...
PHP:
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
$time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."';");
$row_time = mysqli_fetch_row($time_id);
echo ' <td>'.$row_time[0].'</td>';
}
^^ Egal, welchen Datensatz ich zum Editieren auswähle, er nimmt für jeden Wochentag den letzten Zeitwert aus der DB. Das muss ich jetzt noch lösen. Im WHERE muss noch eine zweite Identifikation rein.
@ Mods
Wieder mal 'tschuldigung für die Vielfach-Posterei, aber sonst verliert das ganze völlig seine Übersichtlichkeit.
@ DarkMo
Rein codetechnisch und funktional wäre das Projekt jetzt abgeschlossen, aber es gäbe noch was, das zumindest mich extrem stört, auch wenn's kein Fehler im eigentlichen Sinne ist, weil wir es ja "bewusst" so gebaut haben. Und zwar wird ja projektzeiterfassung.php bei so gut wie jedem Button-Klick auf der Seite neu geladen. Z. B. wenn ich "<<" oder ">>" drücke. Leider aber auch, wenn ich jetzt z. B. 2 Editier-Zeilen habe und dann plötzlich auf die Idee komme, ich will ja auch noch zwei neue Zeilen zusätzlich eingeben. Dann klicke ich "+ Zeile hinzufügen" ... und, hui! ... weg sind sie, meine Editier-Zeilen.
^^ Da fühlt sich jeder User vom Programm verar***t. Es stört ja alleine dann schon ungemein, wenn ich jetzt bspw. 3 Zeilen ausgefüllt habe, dann eine 4. durch den Buttonklick dazumache ... und plötzlich sind die ersten 3 wieder leer.
Lässt sich das noch irgendwie vernünftig lösen, dass bereits getätigte (aber noch nicht abgesendete) Eingaben bestehen bleiben?
Auch wenn ich nicht DarkMo bin: Klar lässt sich das lösen: Wenn der "Zeile hinzufügen"-Button geklickt wurde, einfach die bestehenden Felder mit allem vorbelegen, was eingegeben wurde. Ist ja alles noch wie vor in einem großen Formular, wird per POST übermittelt, die Daten sind also im $_POST-Array.
Du hast 3 Stunden nach dem fehlenden ' gesucht? Oje. Hast du denn nicht einen Fehler "#1064 - You have an error in your SQL syntax" von MySQL zurück bekommen? error in your syntax = Tippfehler im Query. Es ist sinnvoll bei JEDEM per PHP übermittelten Query zu prüfen, ob ein MySQL-Fehler aufgetreten ist und diesen zu handeln.
Evtl. kann es dir helfen, wenn du neue SQL-Queries schreibst, bzw. alte umschreibst, diese erstmal mit dem Datenbankclient (ohne PHP) zu testen.
Auch wenn ich nicht DarkMo bin: Klar lässt sich das lösen: Wenn der "Zeile hinzufügen"-Button geklickt wurde, einfach die bestehenden Felder mit allem vorbelegen, was eingegeben wurde. Ist ja alles noch wie vor in einem großen Formular, wird per POST übermittelt, die Daten sind also im $_POST-Array.
^^ Damit ich den Teil mal richtig verstehe: Ich soll mir jetzte einen riesen Code basteln, der (um ein Beispiel zu haben) für 5 Zeilen alle 50 (!!!) Felder überprüft ob und wenn ja, was da drinnen steht? Und der soll immer dann ausgeführt werden, wenn ein Button auf projektzeiterfassung.php gedrückt wird, der die Seite neu lädt, die Daten aber nicht absendet?
Du hast 3 Stunden nach dem fehlenden ' gesucht? Oje. Hast du denn nicht einen Fehler "#1064 - You have an error in your SQL syntax" von MySQL zurück bekommen? error in your syntax = Tippfehler im Query.
Nein, an dem query hing leider kein "or die ... (error-meldung)" dran. Hätte vermutlich geholfen. Ich war mir allerdings die ganze Zeit sicher, dass ich semantisch/logikmäßig was verpfuscht haben muss. Auf so nen simplen Syntaxfehler hätte ich im Leben nicht getippt. Übrigens habe ich den gar nicht in Eclipse gefunden, sondern nur durch Zufall entdeckt, als ich den Code hier im Forum gepostet habe.
Du kannst dir das $fuelleFelderAus && theoretisch sogar sparen und immer wenn POST-Daten eines Feldes vorliegen, dieses damit vorausfüllen.
Alternativ kannst du auch eine weitere Programmiersprache lernen und neue Felder per JavaScript auf die Seite hinzufügen, ohne dass sie neu geladen werden muss. (Ich werde bereuen, dass ich das vorgeschlagen habe )
Auch ne Möglichkeit wäre einfach eine sehr große Menge Zeilen von Anfang an darzustellen (z. B. 50 Stück). Felder kosten ja nichts und so lang dauerts auch nicht, den HTML-Code zu rendern. Dafür dann auf die Felder hinzufügen/entfernen-Buttons verzichten.
^^ Genau das meinte ich: Du brauchst für ein EINZIGES Feld schon 3 Zeilen Code. Das wären für NUR lächerliche 5 Zeilen schon 150 (!!!) Zeilen Code. Natürlich könnte man da mit Schleifen und ifs "automatisieren", aber unter schätzungsweise 100 ließe sich das nicht lösen, und so nen mega-Codeblock will ich da jetzt nicht mehr reinknallen.
Ich denke, deine letzte Idee dürfte die beste Lösung sein. Mehr wie allerhöchstens 20 Einträge pro Woche sollte kein MA erstellen. Eher noch viel weniger ... soweit ich die Excel-Tabellen aus dem Sommer noch im Kopf habe.
-----------
BTW kämpfe ich noch mit was anderem: Ich hätte den ganzen UPDATE-Code in formular.php drinnen, aber er wird nie erreicht. Er kommt immer nur ins INSERT:
PHP:
if (!isset($_POST['edit'])) {
echo "EINTRAGEN";
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];
mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts');");
}
}
} else {
echo "UPDATE";
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];
mysqli_query($mysqli, "UPDATE zeiten SET zeit = $dauer WHERE taetprodid = $selected[$j] AND datum = $ts;");
}
}
}
Mir fällt langsam nichts mehr ein, das ich im if noch als Überprüfung probieren könnte. Ich habe schon Variablen-Werte, Projekt-IDs und was weiß ich sonst noch alles durch ...
[EDIT]
Ich weiß echt nicht mehr weiter. Meine letzte Idee wäre jetzt noch gewesen, in config.php "$_SESSION['update'] = 0;" zu setzen, in projektzeiterfassung.php diese Variable im edit-Codeteil auf 1 zu setzen, und dann in formular.php zu sagen: "if ($_SESSION['update'] == 0) {". Hat auch nicht geklappt, er landet immer nur im INSERT. Ins UPADTE kommt er nicht.
mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['product']."', beschreibung = '".$_POST['beschreibung']."', erstellt = $erstellt WHERE id = '".$_SESSION['prid']."';") or die ("Update 1 fehlgeschlagen.<br>".mysqli_error());
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, "UPDATE zeiten SET zeit = $dauer WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 2 fehlgeschlagen.<br>".mysqli_error());
}
}
Ich habe jetzt nämlich testweise mal den INSERT-Code auskommentiert um den UPDATE-Code testen zu können, und das kuriose ist, dass alle eingesetzten Variablen die korrekten Werte beinhalten, ich aber immer nur bis "Update 1 fehlgeschlagen" komme.
Warum also funktionieren meine eingesetzten Variablen im query nicht? Wenn ich da die Werte hard reincode, also z. B. '6', '28', etc., dann läuft das query durch (und updatet auch die DB korrekt).
Und ins zweite UPDATE kommt er anscheinend gar nicht, weil er im if hängen bleibt?! Jedenfalls kommt die zweite Fehlermeldung nie, allerdings liefert eine testweise Ausgabe von $ts VOR if korrekte Werte. Nur alles im if passiert nicht mehr. Ich vermute, dass das $a hier $ts.'_'.$anicht mehr passt?! Aber ohne läuft's auch nicht anders.
[EDIT]
Okay, habe jetzt rausgefunden, dass das erste query nur am $erstellt scheitert, alles andere akzeptiert er per POST oder SESSION. Irgendwas am timestamp passt ihm also noch nicht. Und ein weiteres "Sub-Problem" habe ich noch festgestellt:
Wird ein Eintrag das erste Mal geupdatet, nimmt er für Tätigkeit und Projekt eine ID, die um 1 zu klein ist (eben weil da unser $key im array, wo die Dinger gespeichert sind, und die id in der DB nicht ganz "synchron" sind). Und mit jedem weiteren Update des selben Eintrages zählt er nochmal 1 runter. Da dürfte sich mein "if ($key == $row_prod[0]-1) {" aus projektzeiterfassung.php bis nach formular.php auswirken?! Nur, wie behebe ich das wirklich???
Sobald jedenfalls irgendeine ID 0 wird, wird der entsprechende Eintrag nicht mehr aus der DB geholt, ergo nicht mehr auf der Website angezeigt.
[EDIT2]
Bei query 1 verzichte ich auf ein Updaten der Erstellzeit weil's eigentlich eh mehr Sinn macht, die originale drinnen zu lassen. Auch wenn ich da was update, bleibt es ja im Grunde der selbe alte Eintrag mit der selben ID. Somit stimmt das erste query bereits. Beim zweiten habe ich rausgefunden, dass es an $dauer scheitert. Wenn ich die mit einem Wert, z. B. 9, hardcode, läuft auch das zweite query erfolgreich durch.
Irgendwas hier stimmt also noch nicht:
PHP:
//if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
$dauer = $_POST['$ts'];
mysqli_query($mysqli, "UPDATE zeiten SET zeit = $dauer WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 2 fehlgeschlagen.<br>".mysqli_error());
//}
[EDIT3]
Fast geschafft, der beinahe korrekte UPDATE-Code:
PHP:
mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['product']."', beschreibung = '".$_POST['beschreibung']."' WHERE id = '".$_SESSION['prid']."';") or die ("Update 1 fehlgeschlagen.<br>".mysqli_error());
for ($b = 0; $b < 7; $b++) {
$ts = $wochenanfang + ($b * 60 * 60 * 24);
$dauer = $_POST['ts'];
mysqli_query($mysqli, "UPDATE zeiten SET zeit = 3 WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 2 fehlgeschlagen.<br>".mysqli_error());
}
Lediglich $dauer mag er noch nicht, die kann ich auch mit echo nicht ausgeben. Heißt wohl, dass die Variable leer ist, aber warum??? Gebe ich einen fixen Wert dafür an, wird alles korrekt in der DB geupdatet.
$dauer = $_POST['ts'] bezieht sich übrigens auf folgendes in projektzeiterfassung.php:
PHP:
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
$time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
$row_time = mysqli_fetch_row($time_id);
echo '<td><input type="text" name="ts" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
}
Meine Theorie ist jedenfalls, dass irgendwas irgendwo (name="ts" in projektzeiterfassung.php?) noch in ne Schleife rein muss?! Meine Einträge haben zufälligerweise alle keine Zeit bei MO, und weil ts eben noch nicht weiterspringt (?) schaut er nur MO an, was eben leer ist. Deswegen ist nichts ins $dauer drinnen?!?!?
[EDIT4]
Jetzt hätte ich es noch so probiert, aber hilft alles nicht ..
Code:
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
$time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
$row_time = mysqli_fetch_row($time_id);
echo '<td><input type="text" [COLOR=royalblue]name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
}
Ich bin nicht ganz durchgestiegen, welche deiner Probleme du nun gelöst hast und welche nicht:
Problem 1: der Syntaxfehler im Query:
Du kannst die Anführungszeichen '' um Werte nicht einfach weglassen. Also statt erstellt = $erstellt muss es heißen erstellt = '$erstellt' http://dev.mysql.com/doc/refman/5.1/de/string-syntax.html Wie schon ein paar mal angesprochen, ich würde ja prepared Statements verwenden...
Problem 2: Die sich verringernde ID:
IDs zu verändern ist keine gute Idee. Schließlich müsstest du die ID auch überall anpassen, wo sie verwendet wir (mit einem Trigger o. ä.). Warum ziehst du da überhaupt 1 ab? Warum sind key im Array und id nicht synchron? Ich würde das Problem nicht einfach umgehen, sondern lösen, sonst rächt sich das irgendwann.
Problem 3: Die Dauer, die sich nicht speichern lässt:
Du solltest prinzipiell niemals Usereingaben einfach so unvalidiert in die Datenbank schmeißen (google mal nach Bobby Tables), aber gut. Das Problem ist eine Kombination aus
- In $_POST['ts'] steht kein Integer (sondern vermutlich nichts/NULL)
- Um $dauer sind im Query keine Anführungszeichen
Wenn du "UPDATE zeiten SET zeit = '$dauer'... draus machst, wird zumindest der Query durchlaufen und keinen Fehler verusachen, das ist doch schonmal was
Problem 4: Dauer/_POST['ts']
Wie Rho und ich schon sagten: Führe dieses Select nicht in einer Schleife aus. Das widerspricht allem, wozu so eine Datenbank gut ist. Du kannst mit EINEM korrekt gebauten Query alle Werte die du brauchst auslesen. Aber das nur um Rande.
Stimmen denn eigentlich erstmal die Werte, die im Textfeld mit dem namen ts drinstehen? Also die du auf der Webseite vor dir siehst?
Du bist auf der richtigen Spur, dass das Problem daran liegt, dass hier mehrere Felder gleichen namens (ts) kreiert werden und das so nicht klappen kann. name="ts['.$wochentag.']" ist eine passende Lösung.
Ich würde dir empfehlen dir zunächst einfach mal den Inhalt von $ts in deiner Schleife auszugeben und zu schauen, ob diese Timestamps korrekt sind, d. h. denen in den Feldnamen entsprechen. Alternativ wäre es vielleicht übersichtlicher, die Schleife identisch aufzubauen, wie die andere Schleife, d. h. so
PHP:
/* Ich gehe mal davon aus, dass $wochenanfang und $wochenende hier irgendwo gesetzt sind */
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
$dauer = $_POST['ts['.$wochentag.']'];
/* ... */
}
P1: gelöst, durch Weglassen von $erstellt.
Mag ja sein, dass es da Standards gibt, aber keine " zu benutzen funktioniert bei mir ÜBERALL sonst im Code! Siehe z. B. mein EDIT-Code in projektzeiterfassung.php, der 1A funktioniert:
PHP:
if (isset($_POST['edit'])) {
if (isset($_POST['check'])) {
$selected = $_POST['check'];
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">';
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">';
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" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
$time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
$row_time = mysqli_fetch_row($time_id);
echo '<td><input type="text" name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
}
$_SESSION['prid'] = $selected[$j];
echo '<td>'.$selected[$j].'</td><br>';
}
}
}
^^ Ich vermute, dass das so locker ist, wie mit dem ; am Ende von queries, das ja auch gemacht werden sollte, aber funktionieren tut's genau so gut ohne.
P2: Ja, das muss unbedingt noch gelöst werden! Rächt sich ja jetzt schon. Die Asynchronität entsteht jetzt dadurch, dass ich durch DarkMo's Idee in oben gespoilerten EDIT-Code bei den Feldern einen key reingebracht habe:
Tja, dieser key stellt allerdings die Feld-Indexe dar, die ja bei 0 beginnen. In unseren DB-Tabellen für Tätigkeiten und Produkte hat phpmyadmin bei der autoincrement-id allerdings mit 1 begonnen. Dadurch ist die DB jetzt immer 1 hinter dem key hinten nach.
Im EDIT-Code in projektzeiterfassung.php konnte ich das noch ausgleichen sodass das richtige Element zum Vorbelegen der Dropdowns verwendet wird. Aber in formular.php, wo ich eben diese Daten jetzt abgreife, klappt das nicht mehr mit dem Ausgleichen. Da verzählt er sich jetzt mit jedem weiteren Update immer mehr. Und sobald eine Tätigkeit oder ein Produkt bei 0 ankommt, wird dann diese 0 in die DB geschrieben, aber der Datensatz dann nicht mehr auf der Webseite ausgegeben.
P3: "nicht speichern lässt" ist falsch. Ich glaube, das Problem ist, dass ich 7 input-Felder für Stunden pro Wochentag habe, diese sich aber aufgrund eines identen Namens (name="ts") nicht unterscheiden. In formular.php wird daher durch $_POST['ts'] immer nur der Inhalt des ersten input-Feldes übertragen. Da ich aber zufälligerweise keinen Datensatz mit einem Eintrag bei MO habe, ist dieses Feld immer leer, somit liefert $_POST nichts, was wiederum $dauer leer bleiben lässt --> ist jedenfalls meine Vermutung.
Ich bräuchte daher eine Lösung, um 7 verschiedene Namen für die input-Felder zu kriegen.
In formular.php müsste es schon passen, weil eh durch das WHERE im query dann ausgewählt wird, welcher eine Stundenwert geupdatet werden soll. Aber ich muss erstmal alle möglichen 7 für 1 Woche aus projektzeiterfassung.php rüberkriegen.
PHP:
WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;"
P4: Du meinst, ob name="ts['.$wochentag.']" stimmt? Habe ich noch nicht auszugeben probiert, aber kann ich gleich mal machen ...
^^ Eigentlich müssen die aber korrekt sein, weil ja das query, wo $wochentag verwendet wird, für alles immer richtig funktioniert.
[EDIT]
Jup ...
Zum Gegenvergleich formular.php-$ts:
MO stimmt überein (habe einen neuen Eintrag mit einer Zeit bei MO erstellt und diese zu updaten versucht).
^^ Also ich weiß echt gar nicht mehr, woran das jetzt noch scheitern könnte.
Außer vielleicht, dass wirklich noch wo ein Syntax-Murks im query ist?!?!
wegen dem synchronisieren der keys mit den db-indexen hatte ich dir aber schon was geschrieben gehabt ich hab dir gesagt, dass das mit dem -1 murks is.
Herr Polizist, mag ja sein, dass hier eine Zone 30 ist, aber ich kann sonst ÜBERALL in Deutschland mindestens 100 fahren...
HIER sind die Anführungszeichen notwendig. (Hast du meine aus dem Handbuch verlinkte Seite überhaupt gelesen?) Was überall sonst ist, ist ja erstmal egal. Es funktioniert halt ohne Anführungszeichen nicht, weil MySQL sonst nicht weiß, wo die Zeichenkette endet. Insbesondere kommen im Timestamp ja auch so wunderbare Zeichen vor wie ein Minus (-), das natürlich ohne Anführungszeichen auch als mathematischer Operator verwendet wird.
^^ Ich vermute, dass das so locker ist, wie mit dem ; am Ende von queries, das ja auch gemacht werden sollte, aber funktionieren tut's genau so gut ohne.
Tja, dieser key stellt allerdings die Feld-Indexe dar, die ja bei 0 beginnen. In unseren DB-Tabellen für Tätigkeiten und Produkte hat phpmyadmin bei der autoincrement-id allerdings mit 1 begonnen. Dadurch ist die DB jetzt immer 1 hinter dem key hinten nach.
Das Verhalten ist absolut normal. Arrays werden bei 0 indiziert, Auto increment beginnt bei 1 (kann man natürlich auch beides ändern).
Ich hab den konkreten Code jetzt nicht vor mir, aber warum baust du überhaupt eigene Indizes, anstatt den Wert aus der Datenbank zu verwenden?
Ja, richtiger Lösungansatz. Auch dein Code sieht auf den ersten Blick richtig aus. Müsste so ähnlich gemacht werden.
P3: "nicht speichern lässt" ist falsch. Ich glaube, das Problem ist, dass ich 7 input-Felder für Stunden pro Wochentag habe, diese sich aber aufgrund eines identen Namens (name="ts") nicht unterscheiden. In formular.php wird daher durch $_POST['ts'] immer nur der Inhalt des ersten input-Feldes übertragen. Da ich aber zufälligerweise keinen Datensatz mit einem Eintrag bei MO habe, ist dieses Feld immer leer, somit liefert $_POST nichts, was wiederum $dauer leer bleiben lässt --> ist jedenfalls meine Vermutung.
Ich bräuchte daher eine Lösung, um 7 verschiedene Namen für die input-Felder zu kriegen.
@ DarkMo
Siehe 4. Zitat in BenRo's Posting. Ich verstehe halt leider nicht, wie genau du das gemeint hast. Jedenfalls funktioniert's so NICHT, wie ich das dann probiert hatte ...
@ BenRo
Okay, soweit ich das sehe, kann ich also gänzlich auf jede Art von Hochkomme verzichten, wenn die Variable eine Zahl beinhaltet bzw. darstellen soll. Wohingegen ich ein Hochkomme brauche, wenn's auf nen String rausläuft. Das würde dann auch erklären, warum's bei meinem $selected[$j] immer ohne klappt. Ist ja nur eine Zahl, die ID (z. B. 28).
$dauer ist allerdings auch eine Zahl, also sollte ich da schonmal keine Hochkomme brauchen.
Jedenfalls müsste unbedingt noch das mit $dauer gelöst werden, damit endlich auch das zeit-update-query richtig arbeitet, und dann noch das mit den keys. Der konkrete Code für letzteres ist der, den ich oben schon gepostet hatte:
Code:
[COLOR=royalblue]$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)) {
[COLOR=royalblue]$taetigkeiten[count($taetigkeiten)] = $row_t; }
}
[COLOR=royalblue]$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)) {
[COLOR=royalblue]$products[count($products)] = $row_p; }
}
if (isset($_POST['edit'])) {
if (isset($_POST['check'])) {
$selected = $_POST['check'];
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">';
[COLOR=royalblue] foreach ($taetigkeiten as $key => $taetigkeit) {
if ($key == $row_taet[0]-1) { echo '<option value=[COLOR=royalblue]"'.$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">';
[COLOR=royalblue] foreach ($products as $key => $product) {
if ($key == $row_prod[0]-1) { echo '<option value=[COLOR=royalblue]"'.$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" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
$time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
$row_time = mysqli_fetch_row($time_id);
echo $wochentag.'<br>';
echo '<td><input type="text" name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
}
$_SESSION['prid'] = $selected[$j];
echo '<td>'.$selected[$j].'</td><br>';
}
}
}
Bei query 1 verzichte ich auf ein Updaten der Erstellzeit weil's eigentlich eh mehr Sinn macht, die originale drinnen zu lassen. Auch wenn ich da was update, bleibt es ja im Grunde der selbe alte Eintrag mit der selben ID.
[EDIT]
Das ist ein völliger Schmarr'n mit dem $key! Da bleiben mir alle dropdowns leer, wenn ich das auf den $key umbaue ...
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;
$taetigkeiten[$row_t['id']] = $row_t['taetigkeit'];
}
}
$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;
$products[$row_p['id']] = $row_p['produkt'];
}
}
/*************/
if (isset($_POST['edit'])) {
if (isset($_POST['check'])) {
$selected = $_POST['check'];
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">';
foreach ($taetigkeiten as $key => $taetigkeit) {
if ($key == $row_taet[0]) {
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">';
foreach ($products as $key => $product) {
if ($key == $row_prod[0]) {
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" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
$time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
$row_time = mysqli_fetch_row($time_id);
echo $wochentag.'<br>';
echo '<td><input type="text" name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
}
$_SESSION['prid'] = $selected[$j];
echo '<td>'.$selected[$j].'</td><br>';
}
}
}
/*************/
for ($a = 1; $a <= $add; $a++) {
echo '<tr><td><select name="taetigkeit'.$a.'">';
foreach ($taetigkeiten as $key => $taetigkeit) {
echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
}
echo '</select></td>';
echo '<td><select name="product'.$a.'">';
foreach ($products as $key => $product) {
echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
}
echo '</select></td>';
[EDIT2]
Jetzt habe ich gerade noch zwei Tippfehler ausgebessert, sodass die Teile mit dem $key eigentlich stimmen müssten, und was passiert? Ich kriege die Anfangsbuchstaben aller Tätigkeiten und Produkte angezeigt:
[EDIT3]
Das mit $dauer ist auch irre! Obwohl's ne Zahl ist, kriege ich den query-Fehler wenn ich es ohne Hochkomma schreibe. Schreibe ich allerdings '$dauer', läuft das query plötzlich durch, aber die Zeiten in der DB werden immer noch nicht geupdatet.
Stattdessen wandelt er alle Zeiten dieses Eintrags in 0 um. Kann das sein, dass '$dauer' als leerer aber auch funktionierender String gewertet wird, der dann die Zeitwerte mit 0 überschreibt?
if (mysqli_num_rows($res_t))
while ($row_t = mysqli_fetch_assoc($res_t))
$taetigkeiten[$row_t['id']] = $row_t['taetigkeit'];
...
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">';
foreach ($taetigkeiten as $key => $taetigkeit) {
if ($key == $row_taet[0]) {
mal rausgezogen... hier gibts für mich schonmal ein kleines unsinnigkeitsproblem ^^
du baust oben korrekt das array. in der db steht meinetwegen (tabelle id|name) 1|putzen und 3|kochen. dein array sieht dann also so aus: 2 elemente -> [1]=putzen und [3]=kochen. aso, jetz rall ich erst den 2. sql qry ^^ ok, unstimmigkeit is weg. selected[j] beinhaltet die projektid. ich war bei der tätigkeits-id. k. so ergibts sinn. gut, du holst also zur projekt-id die tätigkeiten id. gut, dann baust du für jede tätigkeit aus dem array ne option und sofern die row-id der array-id gleicht, wirds vorselektiert. passt soweit.
aber ich seh grad dein problem... $taetigkeit['taetigkeit'] <- hä? einfach $taetigkeit und gut is xD
foreach ($taetigkeiten as $key => $taetigkeit) bedeutet folgendes: wir erinnern uns: unser bsp array sah so aus: [1]=putzen und [3]=kochen. was macht nun foreach? als erstes ist unser array angegeben. jetzt geht er dort element für element durch (das ist intern glaube ne liste, da geht er halt vom listenkopf bis ans ende durch). dabei stellt er element-werte zur nutzung zur verfügung. in unserem falle 2 stück: einmal den key in der variablen $key und einmal den wert in der variable $taetigkeit. im ersten durchgang nehmen diese 2 also folgende werte an: $key=1 und $taetigkeit='putzen'. im 2. wird daraus dann für §key die 3 und für $taetigkeit 'kochen'. das sind keine arrays, das sind einfach strings. mit deinem arrayzugriff auf den string bringste den ärmsten nur völlig ausm konzept ^^