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
Allerdings ...
Ich habe zwar DarkMo's Erklärung verstanden, was er da grundsätzlich zusammengebastelt hat, aber aus diesem Monster-Konstrukt dann einzelne Daten rauszufischen, das ist mir echt zu hoch.
Aber wo ich's mir gerade so anschaue: vielleicht täusche ich mich eh und die Projekt-ID steckt da gar nicht drinnen?! Dann bräuchten wir überhaupt einen anderen Weg. Ich hätte es ja in einem weiteren Versuch über ein mysqli-SELECT-query versucht, aber dann fehlte mir wieder irgendwas für WHERE ...
Es gibt halt leider nichts fixes zweites zur Identifikation und zum "Abgleich" mit der id.
ich befürchte, das kommt bei mir von einem browsergame, wo man scripten kann. dort gibt es ähnliche strukturen zur speicherung von daten (nennt sich dort datanodes, lässt sich aber eben notfalls wie ein array verstehen ^^). und nuja - da hab ich noch viel wildere konstruktionen gebaut ich sehe das weniger als ein x-dimensionales array, eher wie einen baum. oder meinetwegen eine art pfad-angabe.
bspw dieses lustige konstrukt:
$row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
könnte man abstrahiert vllt auch so deuten: $row_collector[tID/data/pID/time/Datum] = $row['Zeit'];
find ich persönlich jetzt überhaupt nich wirr ^^
aber zum eigentlichen problem:
die projekt-id wird nicht mit ausgelesen. in der ersten zeile im sql string (bitte schreib das ding mehrzeilig und formatiert (einrückungen), so kann man das wirklich kaum lesen) fehlt schlicht bei select ein "pr.ID AS prID" (oder so). dann müsste das beim rowcollector noch mit gespeichert werden, dort wo auch die beschreibung gespeichert wird (im "pfad" ^^) - ODER als alternative: ein projekt ergibt sich als einmalige kombination aus produkt-id und tätigkeits-id. also könntest du in where anstelle der projekt id auch diese beiden werte abfragen. die hast du schon und du bräuchtest nichts umarbeiten bei dem gleichen ergebnis.
und wie gesagt: wieso du das alles so starr trennst, versteh ich immernoch nich. ich würde das alles in einer tabelle machen und fertig.
Deine Idee mit Produkt- und Tätigkeiten-ID probiere ich gleich mal aus. Aber was meinst du mit "starr trennen"? Ich bastle das ganze doch in der auswerten-Tabelle dazu. Die checkboxen kommen einfach vor jede Datensatz-Zeile, der Editier-Button unter die unterste. So bleibt alles in jener Tabelle, die bestehende Datensätze anzeigt ...
[EDIT]
Ich merke gerade, wieso deine Idee doch nicht klappen kann. Auch die von dir genannte Kombination identifiziert einen Datensatz NICHT eindeutig!
Es kann ja ein User z. B. an zwei verschiedenen Tagen am selben Produkt mit der selben Tätigkeit gearbeitet haben.
Ich fürchte, ich muss doch die prID im query ergänzen und dann eben auch noch in den $row_collector reinbasteln ...
[EDIT2]
Ich habe jetzt im query noch "pr.id AS prID" hinzugefügt, weil wir bei WHERE schon ein pr.id drinnen haben, das auch semantisch tatsächlich die Projekt-ID sein soll, aber bisher nie verwendet wurde. Nur, wie mache ich das jetzt im $row_collector[]?
Die Projekt-ID hat doch eigentlich keinen Pfad, weil sie das allererste ist und alle Pfade bei ihr starten, oder?
und? das projekt ändert sich deswegen doch nicht. wenn das nicht reicht, dann suchst du nicht das projekt, sondern was anderes ^^
und wegen starrer trennung: eingabe und ausgabe mein ich. wieso du das trennst. ich hätte das einfach zusammen gemehrt (oben ausgabe, darunter eingabemöglichkeiten) und gut.
a) siehe meine EDITs. Ich denke, der $row_collector wäre trotz aller Schwierigkeiten die sinnvollste Lsg. Nur, wie machen, da probiere ich gerade rum ...
b) Achso, du meinst, den ganzen auswerten-Code in ein riesen-if in projektzeiterfassung.php reinzupacken, damit auswerten.php wegfällt?! Und angezeigt soll er eben nur werden, wenn isset($_POST['auswerten'])?!
[EDIT]
Im $row_collector verschiebt sich jetzt ALLES um einen Feldindex nach hinten, oder? Du hattest ja mit der tID angefangen, die in der DB-Tabelle "projekt" das zweite ist. Jetzt kommt vorne die id (prID) hinzu?!
zum edit: nopes ^^ irgendwo steht was wegen der beschreibung (..[desc] = row[beschreibung]...). genau DORT muss die projekt-id mit angeführt werden. kannst also die beschreibungs-zeile kopieren, darunter einfügen und ein ...[prID] = row[prID]... schreiben. also alles wieder pseudocode, musste natürlich ordentlich ausschreiben alles ^^
wegen b): so in etwa. einfach eine tabelle bauen, angefangen wird mit der woche und deren auswahl, darunter kommen alle datensätze für diese woche (und diesem user*), dann kann man ja ne leerzeile als lücke einfügen und dort folgen dann die "add-zeilen". und oben bei der anzeige der datensätze kommt einfach nen edit-button dahinter, fertig**.
* für nen admin kann man hier natürlich noch andere regeln einführen. filter für den user oder gar mehrere bla bla bla.
** in meiner vorstellung wird die ganze ausgabe schon vorhandener datensätze gleich in input-feldern aufgebaut. die tragen gleich die nötigen namen (wie die aussehen müssten, damit sie das prädikat "nötig" erfüllen müsste man dann halt mal schauen ^^), sind aber erstmal inaktiv und per css "unsichtbar" gemacht (keinen rand usw usf, also NICHT hidden oder sowas). drückt man auf den editbutton, wird in dessen zeile jedes inputfeld enabled (so dass man reinklicken und rumschreiben kann) und optisch wieder sichtbar gemacht (also eben wieder nen rand ran oder so, hintergrundfarbe...). der edit-button wird zum save button gefolgt von einem abbrechen button und unterhalb des ersten tabellenteils kann man ja noch nen save-all button bauen. das wäre so meine idealvorstellung ^^ *abschweif*
Okay, also ich will's erstmal in auswerten.php funktionierend hinkriegen. Wenn's dort mal laufen sollte, kann ich die Codes immer noch zusammenfügen ...
Ich probiere jetzt nochmal das mit $row_collector.
der aufbau is schlicht dem db-ergebnis geschuldet. sicherlich lässt sich das auch umbauen, dass zuerst die proj-id kommt, aber der von mir beschriebene weg sollte der einfachste sein. wenn da nich noch anderes zeugs kommt, was dir so vorschwebt. da bei meinem aufbau usw dieser row-collector eh immer komplett ausgewertet werden muss (also ein kompletter "pfad"), verfügst du eh über alle relevanten daten am ende. egal wo du die prID nu speicherst.
um die ordner/pfad-analogie noch etwas zu verdeutlichen: alles, was ein (sub)array ist, wäre szs ein ordner. alles, was schlicht werte erhält, entspräche einer datei. wenn du den ergebnis-string der db durchleierst, wirst du zwangsläufig für jeden db-satz eine komplette "pfadangabe" (also eben immer wieder die tätigkeits id und die projekt id und die produkt id...) haben. du musst also nun nur schauen "ist der ordner 'tID' schon angelegt? wenn nein, leg ihn an". dabei werden gleich alle nötigen "dateien" mit angelegt. die ändern sich ja nicht. ist der "ordner" schon vorhanden, braucht man ihn nicht mehr anlegen und kann gleich weiter machen im text. so, nun hab ich einen weiteren ordner data im ordner tID angefügt, und in den kommen nun alle produkt-id ordner. die könnte man naütlich auch ohne data-ordner gleich in den t-id ordner packen, aber die auswertung per schleife wäre dann schwieriger, da ja die "tID-dateien" auch damit drin rumschwirren ^^ daher hatte ich das extra nochmal ausgelagert.
und so gehts halt weiter. ich hoffe, mit ordnernd und dateien als synonyme ist das verständnis leichter und so kannst du das ggf auch umbauen, wie du magst.
Also, ich habe jetzt erstmal einen Gesamtcode in projektzeiterfassung.php gebastelt, womit wir auswerten.php los wären ...
Code:
<?php
$db_erg = mysqli_query($mysqli, "SELECT
pr.id AS prID,
t.taetigkeit AS Taetigkeit,
p.produkt AS Produkt,
t.id AS tID,
p.id AS pID,
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;");
if (!$db_erg) {
die ('Ungültige Abfrage: '.$mysqli->error);
}
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></th>
<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>';
$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;
}
for ($a = 1; $a <= $add; $a++) {
echo '<tr><td></td><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.'" 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>';
}
}
$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="#4169e1"]$row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['Projekt']; $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="#4169e1"]$td[3] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
echo $td[3]; // nur zum Testen
echo ' <td><input type="checkbox" name="check'.[$td[3]].'"></td>'; for ($i = 0; $i < count($td); $i++) {
echo ' <td>'.$td[$i].'</td>';
}
echo ' </tr>';
}
}
} else {
echo ' <tr><td colspan="10" style="text-align:center">Keine Einträge gefunden.</td></tr>';
}
echo '</table><br>';
echo '<div class="submit">';
echo ' <input type="submit" name="addLine" value="+ Zeile hinzufügen">';
echo ' <input type="submit" name="remLine" value="- Zeile entfernen">';
echo ' <input type="submit" name="edit" value="Editieren">';
echo ' <input type="submit" name="delete" value="Löschen">';
echo ' <input type="hidden" name="add" value="'.$add.'">';
echo '</div><br>';
echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...';
echo '<br><br><br>';
echo ' <input type="submit" name="auswerten" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...<br><br>';
echo ' <input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
if ($rechte == 0) {
echo ' <br><br><input type="submit" name="auswertenadmin" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30">';
}
echo '</div>';
^^ Die relevanten Zeilen wieder in blau. So klappt's jedenfalls noch nicht.
In formular.php habe ich bereits die Funktionalität der beiden neuen Buttons ergänzt:
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['auswertenadmin']) 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'])) {
if (isset($_POST['username'], $_POST["password"], $_POST["password2"]) and trim($_POST["username"]) != "" and trim($_POST["password"]) != "" and trim($_POST["password2"]) != "") {
$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 {
$eintragen = mysqli_query($mysqli, "INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
if ($eintragen) {
$protokoll .= '- Benutzer <b>'.$username.'</b> wurde erstellt.';
} 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";
}
}
[COLOR="#4169e1"]if (isset($_POST['edit'])) {
if (isset($_POST['check'][$td[3]])) { // wenn checkbox ausgewaehlt wurde
$stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
$del = mysqli_query($mysqli, "DELETE * FROM projekte WHERE id=".$irgendwas."");
$ins = mysqli_query($mysqli, "INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt')");
}
}
if (isset($_POST['delete'])) {
if (isset($_POST['check'][$td[3]])) {
$del = mysqli_query($mysqli, "DELETE * FROM projekte WHERE id=".$irgendwas."");
}
}
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')");
}
}
}
}
^^ Aber auch hier habe ich wieder das Problem: Keine Ahnung, wie ich an die verdammte ID der Projekte kommen soll. Wenn wir die dann mal in projektzeiterfassung.php richtig im $row_collector haben, müsste man die dann wohl irgendwie an formular.php mitschicken?!
BTW: Kann ich sagen POST['check'][$td[3]], oder muss das POST['check'][$td][3] heißen?
Und bevor der erste UPDATE!!! schreit: Ich habe das Editieren bewusst über Löschen und danach Einfügen gemacht, damit ich nicht für jedes einzelne Feld überprüfen muss, ob schon was drinnen steht und ob das anders ist als der neue Wert. So ist es kurz und schmerzlos programmiert, auch wenn's vielleicht mehr Aufwand für die DB ist.
[EDIT]
Ich merke gerade, mit dem edit-Button ist das so noch nichts ...
Anklicken soll ja erstmal bewirken, dass die Felder überhaupt neu beschreibbar werden. Und dann muss ich UPDATEn.
[EDIT2]
In formular.php könnte ich vielleicht so an die id kommen:
Code:
if (isset($_POST['delete'])) {
if (isset($_POST['check'][$td][3])) {
$del = mysqli_query($mysqli, "DELETE * FROM projekte WHERE [COLOR="#4169e1"]id=".$_POST['check'][$td][3]."");
}
}
Aber dazu müsste ich sie immer noch zuerst richtig in projektzeiterfassung.php aus dem $row_collector rauslesen und als Name für die jeweilige Checkbox einsetzen.
Nachdem du ja anscheinend nicht mehr unter Zeitdruck stehst, wäre es vielleicht mal an der Zeit die Sache richtig anzugehen und erst mal in Ruhe die notwendigen Grundlagen zu lernen. Vorausgesetzt du hast wirklich interesse daran.
Das was hier im Moment abläuft ist zwar durchaus unterhaltsam, aber nicht gerade zielführend. Auf die Weise könntest du noch Monate und vermutlich sogar Jahre weitermachen ohne große Fortschritte zu erzielen.
Ich habe bereits ein 600 Seiten PHP-Buch durch und das Problem sind auch nicht mehr irgendwelche Grundlagen. Das Problem ist, dass der gesamte Code a) so extrem verschachtelt ist, dass abgesehen von keinem Durchblick mehr klitzekleinste Änderungen reichen, damit ALLES gar nicht mehr oder falsch läuft. Und b), dass ich halt nicht weiß, wie ich aus diesem $row_collector einzelne Daten rausholen soll. Was das mit Grundlagen zu tun hat, soll mir mal einer verraten ...
Jedenfalls habe ich heute "nichts" gemacht, und schon geht wieder gar nichts mehr. Ich habe wirklich nur den auswerten.php Code via copy-paste nach projektzeiterfassung.php geholt und schon produziert das nur mehr Blödsinn. Kurioserweise können nur 5 Datensätze angezeigt werden, egal wie viele in der DB stehen. Darüber hinaus werden keine Stundendaten an Montagen angezeigt und was ich für Sonntag speichere, wird dann einfach in einem vorherigen Datensatz angezeigt anstatt im neuen, richtigen (in der DB wird allerdings alles richtig gespeichert, es liegt also am Ausgabe-Code).
Durch die zusätzliche Chechbox-Spalte musste ich natürlich colspan von 10 auf 11 erhöhen damit die Tabelle ordentlich formatiert bleibt, aber trotz zig align-center als inline CSS und im style.css File in allen möglichen Varianten schaffen es die Überschriften wie z. B. "Projektzeiterfassung" natürlich wieder nicht, sich mitanzupassen ...
^^ Das ist alles so zum Kotzen ...
Und nur durch das copy-paste vom auswerten.php Code, der super funktioniert hat, solange er noch in seinem eigenen File war. Jetzt müsste man wieder gefühlte 100.000 kleine Anpassungen im Code machen, damit das auch in der jetzigen Form wieder vernünftig arbeitet, aber finde das alles mal in DarkMo's Konstrukten an!
Ich weiß jetzt wieder nur, dass die "Fehlerquelle" der auswerten.php-Code in projektzeiterfassung.php ist und ich alle Fehler auf einen Schlag lösen könnte, indem ich auswerten.php einfach wieder als extriges File herstelle.
Und von der Projekt-ID, die auch noch nicht so wirklich im $row_collector landet und daher auch noch nicht rausgeholt werden kann, habe ich noch gar nicht angefangen ... *seufz*
PHP:
<?php
$db_erg = mysqli_query($mysqli, "SELECT
pr.id AS prID,
t.taetigkeit AS Taetigkeit,
p.produkt AS Produkt,
t.id AS tID,
p.id AS pID,
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;");
if (!$db_erg) {
die ('Ungültige Abfrage: '.$mysqli->error);
}
echo '<table>';
echo ' <tr>';
echo ' <td colspan="11" 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></th>
<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>';
$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;
}
for ($a = 1; $a <= $add; $a++) {
echo '<tr><td></td><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.'" 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>';
}
}
$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']]['proj'] = $row['Projekt'];
$row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
$row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
$row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
$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>';
/************/
$td[3] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
echo $td[3]; // nur zum Testen
echo ' <td><input type="checkbox" name="check'.[$td[3]].'"></td>';
/************/
for ($i = 0; $i < count($td); $i++) {
echo ' <td>'.$td[$i].'</td>';
}
echo ' </tr>';
}
}
} else {
echo ' <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
}
echo '</table><br>';
echo '<div class="submit">';
echo ' <input type="submit" name="addLine" value="+ Zeile hinzufügen">';
echo ' <input type="submit" name="remLine" value="- Zeile entfernen">';
echo ' <input type="submit" name="edit" value="Editieren">';
echo ' <input type="submit" name="delete" value="Löschen"><br>';
echo ' <input type="hidden" name="add" value="'.$add.'"><br>';
echo ' <input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...<br><br>';
echo ' <input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File"><br>';
if ($rechte == 0) {
echo ' <br><input type="submit" name="auswertenadmin" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br>';
}
Dann betrachtet das bisherige Programm doch einfach als Prototypen und fange noch mal neu an. Dabei kannst das, was du in der Zwischenzeit gelernt hast, von Anfang an anwenden.
Das Problem ist [...], dass ich halt nicht weiß, wie ich aus diesem $row_collector einzelne Daten rausholen soll. Was das mit Grundlagen zu tun hat, soll mir mal einer verraten ...
Dann schreibst/kopierst du vermutlich einen so wirren und undurchsichtigen Code zusammen, weil du bereits ein absoluter Profi bist, der alle Grundlagen im Schlaf beherrscht. Sorry, mein Fehler.
Mein Tipp wäre, wie gesagt, den jetzigen Code zu verwerfen und einen Neustart hinzulegen. Eventuell fängst du auch erst mal mit einfacheren Programmen an, um dein Wissen weiter zu vertiefen. Im Moment legst du ja einen absoluten Blindflug hin. Falls das Programm plötzlich doch mal funktionieren sollte, wie du es dir wünscht, wäre das wohl mehr Zufall als Können.
wollt ich auch grad vorschlagen ^^ auch wenns ein schwieriger schritt ist... das alte musst du ja nich löschen. code-fetzen als vorlage/inspiration (NICHT unbedingt als simple copy-paste quelle ^^) kann man immer mal brauchen. aber beginne mal ein frisches projekt, denke dir die sache vorher gut durch. wie willst du das strukturieren (ich hatte halt immer die index.php mit den verschiedenen includes als basis konzept gehabt - muss bei dir ja nicht zwingend gleich sein), welches format soll alles haben, welche funktionen sollen umgesetzt werden. das DB schema kann man denke ich erstmal belassen und die neue seite daraufhin anpassen. und dann würde ich ganz langsam schritt für schritt vorgehen. erstmal ein grundlayout bauen und die db verbindung bla. dann einfach mal ne dummy tabelle bauen, quasi als skizze. diese dann mit beispielhaften zeilen füllen und diese zeilen dann konkreter mit eingabefeldern befüllen. die eingabe funktionalität umsetzen und danach die ausgabe einbauen. also immer stück für stück vorgehen. wenn du die ausgabe hast, kannst du ans ändern/löschen denken. danach stück für stück an weitere features. auf keinen fall alles auf einmal machen.
dass du jetzt alles in eins klatscht, konnte ich nich wissen ^^ das war nur eine anmerkung meinerseits. dass das wohl schief gehen würde, wenn du das holter die polter zusammen wirfst, war mir fast schon klar. sind bestimmt nur kleinigkeiten, aber das is dann wieder soviel gefummel >< das problem am row_colector ist ja auch: änderst du die struktur, hat das auswirkungen auf den ganzen code. der ganze tabellenaufbau hängt ja von dessen struktur ab ^^ modelst du da was um, musst du auch den tabellen aufbau ummodeln usw usf. und scheinbar steh ich allein da mit der meinung, das sei nich kompliziert das ding ^^
@ Rho
Mit der Datenbank habe ich bei diesem Projekt eigentlich nichts mehr direkt zu tun, weil die in ihrer jetzigen Form schon unverändert bleibt. Es geht jetzt nur mehr um weitere Operationen von der Website aus.
Wobei ich aber sagen muss, dass ICH schon seit Beginn des Projektes sehr viel lieber eine redundante DB gehabt hätte, auf der man dann mit einem einfacheren Code arbeiten kann, anstatt eine top-strukturierte, redundanzbefreite DB, auf der wir jetzt so undurchschaubar mit solchen Wahnsinns-Konstrukten rumwerken müssen. Zumindest hätte ich nur eine Tabelle für die Projekte verwendet, und darin hätte es dann halt für ein Projekt so viele Zeilen gegeben, wie eben Tage daran gearbeitet wurde. Dann hätte man sich halt die Ausgabe anders überlegen müssen, aber ich glaube, ich hätte mir so leichter getan.
@ DarkMo
Na ja, jetzt ganz neu anfangen ... weiß nicht, ob das mehr Sinn macht als am jetzigen weiterzuarbeiten. Einmal brauche ich das alles noch für die Firma (in sehr naher Zukunft), und dann noch mit Filterfunktionen und eben einer Editierfunktion.
Zum Code: Einfach "zusammengeklatscht" habe ich es nicht, ich habe schon darauf geachtet, nur den Teil zu übernehmen, den wir m. E. tatsächlich für die Ausgabe brauchen, und den dann auch an der m. E. richtigen Stelle eingefügt. Meine Vermutung zu den ganzen falschen Stundendaten jetzt ist, dass irgendeine Schleife jetzt nicht mehr von 0 bis <7 zählen dürfte, sondern vielleicht von 1 bis 7, oder irgendsowas in die Richtung. Weil ja in der Gesamttabelle vorne eine weitere Spalte dazugekommen ist (die Chechboxen). Deswegen gehen vermutlich die Montag-Daten verloren?! Aber wie gesagt: Ich durchschaue dein System leider nicht soweit, als dass ich das jetzt finden würde.
Dabei hätte ich mir sogar alle Codes ausgedruckt, nebeneinander gelegt, und Zeile für Zeile verglichen ...
^^ Jedenfalls wäre DAS ganz leicht zu lösen: Einfach wieder auswerten.php herstellen und projektzeiterfassung.php in Originalzustand zurückversetzen.
Das einzige Problem, das ich zum Weiterarbeiten gelöst kriegen müsste, wäre die auto-increment projekte-ID aus der Datenbank im Code ausgelesen zu bekommen. Deine zweite Idee, abgesehen vom $row_collector, geht m. E. definitiv nicht, weil die Kombination aus Produkt-ID und Tätigkeiten-ID ein Projekt NICHT eindeutig identifiziert. Stell dir vor, zwei Mitarbeiter machen genau das gleiche, es landen aber trotzdem zwei verschiedene Einträge in der DB. Die dann allerdings BEIDE die SELBEN genannten IDs hätten! Der einzige Unterschied wären dann die User-ID und eben die Projekt-ID.
Es geht also beim jetzigen Code nur über den $row_collector, bei dem du der einzige zu sein scheinst, der den wirklich durchschaut.
Tja, wenn du mir bitte helfen könntest, die projekte-ID da reinzuspeichern und dann auch wieder rauszulesen, wüsste ich schon alleine, wie es danach weiter ginge (zumindest beim delete) ...
Im Code im obigen Spoiler siehst du ja die eine Zeile im $row_collector, die ich, so wie ich deinen Tipp verstanden habe, hinzugefügt habe, und dann innerhalb der orangen Kommentar-Markierung, wie ich die projekte-ID auszulesen versucht habe. Was ist daran falsch?
[EDIT]
Ich habe jetzt wieder den letzten Zustand, den wir gemeinsam erarbeitet hatten, hergestellt, allerdings ist ein Fehler geblieben: Es können in der Ausgabe nicht mehr als 5 Zeilen angezeigt werden und es werden dann immer die letzten 5 Projekte aus der DB geholt. Dadurch geraten aber offenbar Stundendaten durcheinander, wodurch Stunden bei falschen Projekten mitausgegeben werden. Das mit den nur 5 Zeilen muss ja auch wieder an irgendeiner Schleife liegen?! Aber ich glaube nicht, dass du da wo bewusst eine Begrenzung eingebaut hast?!
Hier in auswerten.php vielleicht:
Code:
<?php
$db_erg = mysqli_query($mysqli, "SELECT t.taetigkeit AS Taetigkeit, p.produkt AS Produkt, t.id AS tID, p.id AS pID, 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;");
if (!$db_erg) {
die ('Ungültige Abfrage: '.$mysqli->error);
}
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'];
$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="#4169e1"]for ($i = 0; $i < count($td); $i++) {
echo ' <td>'.$td[$i].'</td>';
} 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="Zurück zur Eingabe" name="btnOutputCancel"><br><br>';
echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File"><br>';
da habe ich jetzt ein kleines verständnis problem:
auch wenn da 20 leute das selbe machen (tät/prod-kombi = gleiches projekt), dann ändert sich das projekt doch nich oder? es arbeiten halt nur mehr leute an einem projekt ^^ will man nun explizit die arbeit des users am projekt bearbeiten, darf man sich natürlich NICHT nur nach dem projekt (ob nun per id oder per kombination aus tätigkeit und produkt) filtern, sondern muss auch die user-id filtern. deswegen hatte ich ja damals schon gemeint, dass die einträge der projekt-tabelle keine user-id brauchen, da diese unterscheidung durch die zugeordneten zeiten (bei denen die user-id gespeichert wird) geschieht. hoffe, das war verständlich ^^
das zurückbauen auf den getrennten urzustand find ich erstmal gut. so kommst du wenigstens erstmal wieder besser klar. wegen dem problem mit der beschränkung auf 5 datensätze... liegen die anderen eventuell ausserhalb des zeitfensters? und wegen dem montag und sonntag-problem: meine erste vermutung geht in richtung des kalenders da. wir speichern ja nicht dem montag um 17uhr 31 (oder sowas) sondern den montag - und dazu "normalisieren" den wert des montags. ich glaube wir hatten gesagt mit "montag" meinen wir präzise 12 uhr mittags am montag. ebenso werden die datensätze mit diesem timestamp gespeichert. eventuell ist hier einfach ein fehler bei der abfrage. also statt datum > wochenanfang eher ein datum >= wochenanfang. weis grad nich, wie du es jetzt hast. falls es das nicht ist... puh ^^
a) Eben nicht. Selbst wenn 2 Personen das absolut selbe machen (= mit der selben Tätigkeit am selben Produkt arbeiten), so geschieht das dennoch völlig unabhängig voneinander und es sind zwei unterschiedliche Projekte. Wobei die einzigen beiden (oder vielleicht drei) Unterschiede in der DB eben die User-ID und die Projekt-ID (und event. eben noch die Tage/Stunden) sind.
^^ Du siehst, die Kombi aus Taet-ID und Prod-ID ist KEINE eindeutige Identifikation für ein Projekt. Woher willst du damit im Beispiel wissen, ob's das Projekt 1 oder 2 war?
Man könnte zwar, wie du sagst, die User-ID für die Identifikation dazunehmen, aber dann muss ich mir ja bei jeder Abfrage 3 Daten anschauen. Mit der Projekt-ID wär's nur ein Datum.
b) Ich habe alle Tests heute gemacht. Da liegen sicher keine Daten außerhalb der (noch, bis Mitternacht?) aktuellen KW.
[EDIT]
Was die Sache jetzt so verzwickt macht: In dem PHP-Buch, das ich gelesen habe, ist ein Beispiel drinnen, wo im Prinzip das selbe gemacht wird. Checkboxen zum Auswählen von Datensätzen, die Anhand ihrer ID identifiziert werden. Und das wollte ich halt für den Anfang nachbauen. Der Unterschied: Im Buch-Beispiel hat der Author die IDs selbst erstellt und in der DB gespeichert, nix mit auto-increment-blabla. Und wenn ich weiß, die ID dieses und jenes Datensatzes ist z. B. 68, dann kriegt's jeder Trottel hin, im query "UPDATE/DELETE blabla WHERE id=68" zu sagen.
dann is das aber nen anderer db aufbau, wie ich ihn noch kenne ^^ dann haben wir sehr oft aneinander vorbei geredet dann hier die frage: WIE definierst du ein projekt? bisher klang das immer so, dass eben die kombination aus tätigkeit und produkt ein projekt wäre. zumindest - wenn ich mich recht erinnere - war das damals unsere wortschöpfung dafür. weil direkt nen namen hatte das ja nich. du sagtest immer, dass sich owas aus ner tätigkeit und einem produkt zusammen setzt das irgendwer bearbeitet. um nich immer teat-prod zu sagen begann ich irgendwann von projekten zu reden und meinte damit genau diese kombination. verstehst du eventuell was komplett anderes darunter und ich hab szs ungewollt ein bezeichnungswirrwar erschaffen?
Ich bin mir sicher, dass ich von Anfang an bis heute immer das selbe gemeint habe, aber offenbar haben wir uns gegenseitig missverstanden.
Ja, ein Projekt besteht real MINDESTENS aus einem Mitarbeiter, einer Tätigkeit und Stunden an mindestens einem Tag. Das war's im Mindestfall auch schon, ein Produkt ist nicht zwingen nötig! Deswegen auch die Auswahlmöglichkeit "---" (was in der DB allerdings, für dein Verständnis, ebenfalls als Produkt eingestuft ist) im Produkte-Dropdown. Zusätzlich kann es dann eben noch ein Produkt geben. Und in der DB kommt eben noch die ID des Projekts hinzu.
Das einzige Unterscheidungsmerkmal zwischen den Projekten, die wie gesagt bei mehreren Usern völlig ident sein können (auch wenn die Wahrscheinlichkeit dafür SEHR gering ist), bleibt die Projekt-ID. Die User-ID nutzt ja auch nicht viel, weil da ja gegebenenfalls wieder mehrere Projekte mit der selben vorhanden sein können, wenn ein Mitarbeiter über Wochen hinweg fleißig war.
[EDIT]
Ich habe gerade die DB vor mir offen und ich glaube aber nicht, dass die taetprodid in Tabelle "zeiten" (equivalent mit der auto-increment ID in Tabelle "projekte") deswegen sinnlos ist?! Die brauchen wir ja, um zu wissen, welche Zeiten zu welchem Projekt gehören.
BTW: in auswerten.php sehe ich jetzt im KW-Zeit-Teil keinen Fehler, der zu nur 5 Zeilen oder einer Falschzuordnung von Stunden zu Tagen führen könnte ...
PHP:
<?php
$db_erg = mysqli_query($mysqli, "SELECT t.taetigkeit AS Taetigkeit, p.produkt AS Produkt, t.id AS tID, p.id AS pID, 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;");
if (!$db_erg) {
die ('Ungültige Abfrage: '.$mysqli->error);
}
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'];
$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>';
for ($i = 0; $i < count($td); $i++) {
echo ' <td>'.$td[$i].'</td>';
}
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="Zurück zur Eingabe" name="btnOutputCancel"><br><br>';
echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
Ach ja? Stimmt, du verwendest ja auch kein SQL und die gewünschten Daten aus der DB zu bekommen bzw. einzugeben und zu ändern ist auch kein Problem für dich. Schon wieder mein Fehler.
Wobei ich aber sagen muss, dass ICH schon seit Beginn des Projektes sehr viel lieber eine redundante DB gehabt hätte, auf der man dann mit einem einfacheren Code arbeiten kann, anstatt eine top-strukturierte, redundanzbefreite DB
*seufz* Mal abgesehen davon, dass ich bezweifle, dass dein DB-Schema top struktiriert und frei von jeglicher Redundanz ist (nur eine Vermutung, habe es mir nicht genau angesehen), zeugt dein Wunsch nicht unbedingt davon, dass du inzwischen alle Grundlagen schon so prima drauf hast, wie du vielleicht glaubst.