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



## boss3D (2. Juli 2014)

Hallo!

Ich habe folgende Aufgabe:

Es liegen Daten in Excel-Tabellen zu Mitarbeitern einer Firma vor. Es soll nun eine Datenbank erstellt werden, die folgende Funktionalität und Eigenschaften bietet:
- Jeder MA soll nach dem Schema der bisher benutzen Excel-Tabellen weiterhin seine Daten auf einfachem Wege eingeben können
- MAs sollen sich ihre eigenen Daten auch anschauen können, aber keinen Zugriff auf jene der Kollegen haben
- Ein "Admin" soll Zugriff auf die gesamte Datenbank haben und alle Daten auswerten und, wenn nötig, auch verändern können (sprich, alle Rechte haben)
- Die Daten der Datenbank sollen auf einfachem Wege exportiert werden können (am besten wieder in Excel-Tabellen)
- Es soll eine auf OpenSource-Software basierende Lösung gefunden werden

Und ich habe folgendes Problem:

Für mich ist das absolutes Neuland. Ich habe mich nie wirklich mit Datenbanken, html oder PHP beschäftigt und habe auch keinerlei Programmier-Erfahrungen damit. 

Nun gut, nach einiger Recherche und dem Vergleichen verschiedener Möglichkeiten bin ich nun zu folgendem Lösungsansatz gekommen, der mir als der beste erscheint:
- xampp als Basis (Apache als Webserver, MySQL als Datenbank, phpmyadmin zum Managen dieser)
- Erstellung einer einfachen Website mit html ("Onlineformular"), die als "simple Oberfläche" für jeden Mitarbeiter im Netzwerk am Webserver erreichbar sein soll. In das Onlineformular kann dann jeder seine Daten eingeben
- Ein php-Script wertet die von der Website bekommenen Daten aus und sendet sie an die Datenbank
- Nur der "Admin" hat vollen Zugriff (root) auf die Datenbank selbst

Aber jetzt wird's schwammig, weil ich nicht weiß, ob das alles so möglich ist, wie ich mir das weiter vorstelle:
- Einen Login für Website erstellen. Zuordnungen von MAs und Passwörtern in der Datenbank hinterlegen?!

^^ Wäre das alles mal so ungefähr möglich, oder gäb's eine schlauere Variante? 
Meine html Website zeigt im Moment jedenfalls ein Formular bestehend aus einer Tabelle, die wiederum aus einigen Dropdown-Auswahlen und Textboxen besteht. Aus dem Netzwerk erreichbar ist die Seite auch. Einen absenden-Button (der das auch macht) gibt's auch schon.
Jetzt gibt's aber wahrscheinlich keine simple Möglichkeit, die gesamte Tabelle auf einen Schlag auszuwerten und an die Datenbank zu senden?! Wenn ich jetzt aber ein PHP-Script schreiben muss, das mir alle gefühlt 100 einzelnen Bestandteile der Tabelle auswertet, werde ich alt dabei ...  (Screenshots/Code kann ich morgen nachreichen)
Wie mache ich das jetzt am schlauesten?
Wie ich den Login für die Website erstelle, ergoogle ich mir noch selbst. Da melde ich mich wieder, wenn ich auf nichts Vernünftiges komme. Alles weitere danach ...

Danke im Voraus für baldige und hilfreiche Antworten!


----------



## Rho (2. Juli 2014)

Ich frage mich ja, warum diese Firma nicht jemanden mit der Aufgabe betraut, der halbwegs Ahnung hat, von dem was er tut.

Weshalb willst du deine Lösung eigentlich in PHP umsetzen, wenn du davon, nach eigener Aussage, keine Ahnung hast? Oder anders gefragt, mit welchen Sprachen hast du denn bereits Erfahrung?


----------



## boss3D (2. Juli 2014)

Es geht in erster Linie um Lernzwecke, auch wenn am Ende natürlich ein benutzbares Ergebnis rauskommen soll. Ich habe aber gerade wegen der nötigen Einarbeitung in die Materie auch alle Zeit, die ich brauche. 

Zum Thema: Ich kann C, Java (nutzt hier aber beides nichts) und glücklicherweise html. Die eigentliche Schwierigkeit für mich ist PHP. 
Die Website (also das online Formular) zu erstellen ist kein Problem, aber ab der Erstellung der/des PHP Script(es) zum "Austausch" der Daten zwischen Website und Datenbank wird's schwierig...


----------



## Rho (2. Juli 2014)

Also geht es um eine Art von Praktikum?

Weshalb sollte Java in dem Fall keinen Nutzen haben?
Ich persönlich würde an deiner Stelle jedenfalls einen weiten Bogen um PHP machen.


----------



## DarkMo (2. Juli 2014)

ach mensch, wenn ich nich grad prüfungen hätt, könnt ich dir da sicher bissl helfen. php mit html zu verknüpfen ist erstmal grundsätzlich sehr einfach. hmm, gibt da jetzt verschiedene ansätze. gehen wir einmal von einer sehr simplen html seite aus:

```
<html>
  <head>
    <title>meine seite</title>
  </head>

  <body>
    hallo welt
  </body>
</html>
```
so. wie gesagt, sehr sehr simpel. willst du hier jetzt php code einfügen, musst du das mit <?php - code - ?> machen. dabei kannst du die komplette seite damit einklammern und alles per echo ausgeben:

```
<?php
  echo '<html>';
  echo '  <head>';
  echo '    <title>meine seite</title>';
  echo '  </head>';

  echo '  <body>';
  echo '    hallo welt';
  // irgendwelcher php code...
  echo '  </body>';
  echo '</html>';
?>
```
oder auch nur dort, wo du wirklich php code nutzt:

```
<html>
  <head>
    <title>meine seite</title>
  </head>

  <body>
    hallo welt
<?php
  // irgendwelcher php code...
?>
  </body>
</html>
```
ist im übrigen auch wumps, ob du echo 'text'; oder echo "text"; schreibst. bei " kannst du glaube variablen direkt fließend im text unterbringen - was aber auch nicht immer sinnvoll funktioniert - und bei ' musst du immer mit dem string-verbinde-operator . arbeiten. also echo 'test '.$var.' bla'; vs echo "test $var bla" (kann auch andersrum gewesen sein - ich nutze immer ., da mir das irgendwie sicherer ist ^^ ja, wie du siehst werden variablen mittels $ gekennzeichnet. die sind auch NICHT typgebunden. hat seine vor- aber auch seine nachteile. zum bsp kann man sowas basteln:

```
$test = 123;
  $test .= ' huhu';
```
da wird aus dem integer fix nen string usw usf. ansonsten funzt es nich großartig anders wie c usw mit dem ganzen verzweigungen und schleifen bla. objektorientierung geht auch, wenn man mag. also for-schleifen oder sowas ist wie gewohnt.

man muss es dann halt als .php speichern und es erfordert nen webserver - also sowas wie dein xammp (was ich auch nutze  ). das hat auch gleich mysql dabei, ist also wunderbar für deine zwecke geeignet. xammp installieren und einrichten und dann haste im xammp verzeichnis einen htdocs-ordner. der entspricht der browsereingabe localhost btw dieses 127.0.0.1 - wenn du also direkt in htdocs ne (test.)php hast, dann kannste die im browser über localhost/test.php aufrufen. ist sie in nem unterordner, dann eben localhost/unterordner/test.php.

als seite zum rumschnüffeln würde ich php.net empfehlen. da findet man alle möglichen funktionen schön erklärt. ein login system war für mich bisher aber die königsklasse. also db-anbindung, formulare via php, das is dagegen nen klacks. aber bei login musste soviel krams beachten >< da müsst ich mich auch selber erstmal wieder reinfuchsen. wie gesagt: lust dadrauf hätt ich tierisch, aber ich muss büffeln


----------



## boss3D (2. Juli 2014)

Ich habe das Gefühl, ich bin nicht so weit weg von dem, was ich als Ergebnis haben will als dass es schlauer wäre, den bisherigen Weg aufzugeben ...

Die Website steht ja schon (wenn auch noch nicht optimal) und mit phpmyadmin kann ich auch was anfangen. Nur das "Zwischenstück" (php-Script) ist halt noch eine Plage, aber auch hier sind mir die "Grundzüge" (Variablen, Schleifen, echo, implode, ...) durch die Einarbeitung schon einigermaßen bekannt. GET und POST verwirrt mich noch, wie das genau mit Arrays läuft fehlt meinem Verständnis noch, und auch das genau Senden zur DB und Abholen von Daten ... aber dafür findet man ja wieder wenigstens einige Tutorials.

Mit viel Zeit kriege ich schon was zusammen. Ich hatte hier in erster Linie auf Input gehofft, ob die Aufgabenstellung mit meinem Lösungsansatz überhaupt vernünftig realisierbar ist, oder ob es was besseres gäbe. Und wenn's so geht, dann vielleicht, dass mir wer mit Tipps durch die "schwammigen Stellen" meines Planes hilft. Eben z. B. wie ich das mit den Rechten nun wirklich machen soll (Login für alle auf der Website? Oder DB mit allen Nutzern anlegen und Rechte in phpmyadmin vergeben?), oder auch, wie ich die Daten, die die MA auf der Website eingeben, möglichst gemeinsam auswerten kann, ohne eine php Abfrage für jede einzelne Textbox/etc machen zu müssen ...

Vielleicht wird das alles morgen klarer, was ich will, wenn ich dann Screens und Codes habe.

[EDIT]
@ DarkMo
Okay, ich brauche nicht Hilfe von 0 weg, sondern eher von 1 weg ... 

Die absoluten Basics sind mir durch meine Einarbeitung schon klar. Sooo simple brauche ich es dann zum Glück nicht mehr. Wie gesagt, alles mit html kann ich mir schon zusammenbasteln. Auch einfache php Scripte (wie z. B. Ausgaben von Variableninhalten mit echo, oder von Array-Werten mit implode) gehen schon.

Das mit dem htdocs Ordner, Aufrufen der Website (auch über die IP meines PC vom ganzen Netzwerk aus) habe ich alles schon.


----------



## Rho (2. Juli 2014)

Play Framework - Build Modern & Scalable Web Apps with Java and Scala
Mit dem Framework lässt sich wirklich gut arbeiten und du kannst deine Java-Kenntnisse mit einbringen.


----------



## DarkMo (2. Juli 2014)

ah ok, dann is ja gut. das klang nur so, als ob du dich damit noch garnich beschäftigt hattest. aber falls du mit php weitermachen möchtest, kannste mich auch gerne mal fragen.

wegen post und get... diese arrays gibt es IMMER - sind quasi "system-globals" oder wie man nennen mag. get bezeichnet damit daten, die per url anhängsel übertragen werden. post ist dann eher "unsichtbar" und daher zu bevorzugen - nutzbar bei formularen bspw.

als bsp: du baust in deine seite einen link ein, der etwa so aussieht: index.php?name=mustermann&vorname=max
bis ? ist es die url, danach folgen die get-parameter, die per & verknüpft werden können. kannst da also beliebig viele dranhauen. zuerst kommt der parameter-name, dann dessen wert, durch = getrennt. nach klicken des links kannst du also in der index.php mittels php auf $_GET['name'] (was den wert mustermann hat) und auf $_GET['vorname'] (-> max) zugreifen. somit kannst du daten über seiten hinweg (klingt irgendwie doof) mitgeben/retten bla.

post geht hier einen anderen weg. das get zeugs kann ja auch manuell da reinbauen. also man schreibt einfach selber diese url + parameter oben rein und kann damit auch durchaus unfug anrichten. bei post funzt das natürlich nicht. da muss man tatsächlich das formular ausfüllen und absenden. heisst aber glaube nicht, dass das total sicher ist ^^ gibt da mE auch irgendwelche hacker-tricksereien. aber soweit isses dann bei mir auch noch ned gediegen ><

jedenfalls baust du ein formular in deinem html:

```
<form name="form1" action="[B]index.php[/B]" method="[B]get[/B]">
  <input name="[B]name[/B]" value="[B]mustermann[/B]" type="text">
  <input name="[B]vorname[/B]" value="[B]max[/B]" type="text">
</form>
```
so, hier haste nun genau nix gewonnen, denn die eingetragenen daten werden wieder per get-systematik übertragen. die input-felder-namen sind dann die parameter namen und deren inhalte eben die werte bla. jetzt machste als methode aber post, und du hast den gewünschten effekt. es steht nix mehr oben in der adresszeile, aber du bekommst die daten dennoch. diesmal eben über das $_POST array in vergleichbarer manier (dass du da oben im bsp das mit value nich brauchst, weiste denk ich mal oder? klang zumindest jetzt so - war nur schöner fürs bsp ^^).


----------



## boss3D (2. Juli 2014)

Na, dann war's ja ein glücklicher Zufallstreffer, dass ich von Anfang an immer POST genommen habe ... 

Ja, so kommt mir das eh bekannt vor: Ich habe in meiner php-Abfrage auch gesagt, $_POST['benutzername']

Seit 2 Tagen arbeite ich jetzt an der Aufgabe, 17 habe ich noch (okay, 21 mit zuhause arbeiten), nur bevor's hier weitere Verwirrung gibt. Ich habe nur jetzt nichts zum Herzeigen, weil ich zuhause sitze und das Zeugs am Firmen-Rechner ist.


----------



## XPrototypeX (2. Juli 2014)

Rho schrieb:


> Play Framework - Build Modern & Scalable Web Apps with Java and Scala
> Mit dem Framework lässt sich wirklich gut arbeiten und du kannst deine Java-Kenntnisse mit einbringen.


 
Dann würde ich lieber gwt nehmen: 
GWT Project


----------



## boss3D (2. Juli 2014)

Wofür ich jetzt erstmal noch ne gute Idee bräuchte, wäre folgendes: Wenn ein MA seine Daten in das online-Formular (Website) eingibt, sind die "voneinander abhängig". Also, zuerst wählt er bspw. aus dem Dropdown seine Tätigkeit, dann soll irgendwie die Möglichkeit kommen, für diese Tätigkeit ein Produkt zu wählen, und dann noch für diese Tätigkeit an diesem Produkt eine Stundenanzahl einzugeben.
Bis jetzt kann man in meinem Formular nur alle drei Daten unabhängig voneinander eingeben. 

^^ Kommt wer mit, was ich meine?

Wie realisiere ich das im html Code am besten? (Idee reicht, Code kriege ich dann schon hin)


----------



## DarkMo (2. Juli 2014)

sowas wird mMn mit javascript gemacht. also bei onselect? als eventauslöser des ersten dropdown-menüs wird eine js-funktion aufgerufen, die die nächste drop-down-menü-inhaltsliste zurechtbaut - eben je nach dem gewählten im ersteren. das kann man dann immerfort führen. aber dieses "wissen" ist jetzt auch schon paar jährchen alt - kA ob das nu ausser mode is und was tolleres neues existiert :/ mir hats immer gereicht, auch wenn ich selber erst wieder googlen müsst, wie das nu genau funzt ^^


----------



## boss3D (2. Juli 2014)

Hallelujah ... ich hatte auf ne html Lösung gehoft 

Immerhin weißt du, was ich meine, aber wenn ich jetzt mit JavaScript auch noch komme, verpfusche ich alles. Das wird mir zu steil. Vielleicht wäre es in meinem Fall besser, die Daten zwar unabhängig voneinander eingeben zu lassen, dann aber irgendwie in der DB entsprechend zusammenzufügen?! 
Am Ende soll's wieder vernünftig in einem exportierten Excel Dokument landen ...

Muss ich noch weiter überlegen ...

Morgen schaue ich mal, dass ich den Login auf der Website hinkriege.


----------



## Rho (2. Juli 2014)

> Dann würde ich lieber gwt nehmen:
> GWT Project


Mal abgesehen davon, dass das zwei völlig unterschiedliche Ansätze sind, die man nicht unbedingt miteinander vergleichen kann, weshalb würdest du GWT gegenüber Play vorziehen?


----------



## XPrototypeX (2. Juli 2014)

Leichter in der Anwendung vor allem wenn man sieht wie viel Ahnung der TO in Websprachen und dessen Funktion hat. In GWT kann man die komplette Seite samt Funktionalität in Java schreiben und selbst die Client / Server Verbindung wird mit Java gekapselt.


----------



## Rho (2. Juli 2014)

Wäre für ihn eventuell wirklich besser, wenn ich mir seine Kommentare bezüglich JavaScript so ansehe. Habe selbst nur leider noch nicht mit GWT gearbeitet. Ansonsten hätte ich es vielleicht auch empfohlen.
Letztendlich sind beide Varianten besser als so eine Bastellösung mit PHP.


----------



## DarkMo (2. Juli 2014)

boss3D schrieb:


> Hallelujah ... ich hatte auf ne html Lösung gehoft


 unschön, aber eventuell möglich: nen aktualisieren button in das formular einbauen oder sowas. wenn du dann kategorie 1 gewählt hast, musste aktualiseren drücken, er lädt die seite neu und du kannst anhand des übergebenen wertes mittels php die dropdowns füllen. is halt wie gesagt nich unbedingt knorke, aber wäre ein workaround ^^

und js da mit reinzufummeln macht den brei doch nu auch ned mehr fett. lagerst den js code aus. also so, wie du auch css reintüdelst. hier mal das bsp aus meiner letzten kleinen spaß seite:

```
<head>
            <title>APCR vs AP</title>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
            <link href="apcr.css" rel="stylesheet" type="text/css" media="all" />
            [B]<script src="apcr.js" type="text/javascript"></script>[/B]
          </head>
```
in der apcr js ist mein code, fertig. in der html datei selber sieht man dann nur sowas hier:

```
...<a href="[B]javascript:toggle_type[/B]('.$row['ID'].');" id="ta'.$row['ID'].'" class="tab_link">'.$row['Type'].'</a>...
```
bei nem link is das auslösen natürlich ebbes simpler ^^ wie gesagt, bei sonem dropdown wirste mal schauen müssen, obs sowas wie onSelect gibt. also <input ... onSelect="js...">. jedenfalls wird nicht allzuviel am html code geändert. was du brauchst, sind allerdings id's für deine html elemente. siehste bei meinem link auch da oben. über die id wähle ich dann das element aus um es zu ändern. das $row geblubber ist übrigens auch db gelumbe.

(ehe sich wer wundert: das war eine per php generierte statische html seite, die dennoch filterbar sein sollte. daher js. wollte einfach die htm zippen und rumreichen ohne dass die anderen dazu nen webserver usw brauchen ^^)


----------



## XPrototypeX (2. Juli 2014)

Die Grafiklib ist änlich wie in SWING aufgebaut nur wird bei Programmstart in JS umgewandelt. Zum stylen wird einfaches CSS verwendet. HTML kann man auch verwenden. Lohnt sich echt sich damit auseinander zu setzten. Vor allem wenn man schon Java kann...


----------



## Rho (2. Juli 2014)

Ich vermute mal, er wird trotz der (besseren) Alternativen irgendwas Halbgares mit PHP zusammenfrickeln und sich darüber freuen, wenn es am Ende halbwegs funktioniert.


----------



## TessaKavanagh (3. Juli 2014)

boss3D schrieb:


> Wofür ich jetzt erstmal noch ne gute Idee bräuchte, wäre folgendes: Wenn ein MA seine Daten in das online-Formular (Website) eingibt, sind die "voneinander abhängig". Also, zuerst wählt er bspw. aus dem Dropdown seine Tätigkeit, dann soll irgendwie die Möglichkeit kommen, für diese Tätigkeit ein Produkt zu wählen, und dann noch für diese Tätigkeit an diesem Produkt eine Stundenanzahl einzugeben.
> Bis jetzt kann man in meinem Formular nur alle drei Daten unabhängig voneinander eingeben.
> 
> ^^ Kommt wer mit, was ich meine?
> ...


 
Nur mit HTML wirst du das nicht gelöst bekommen, da HTML statisch ist. Du kannst wo du aber eh schon mit php arbeitest das Formular "teilen" also führst du deine Arbeitnehmer einfach durch mehrere Schritte. Schritt 1 "Tätigkeit wählen" und bestätigen -> Schritt 2 "Produkt wählen" und bestätigen -> Schritt 3 "Stunden eintragen" und bestätigen. Erst danach trägst du die Daten in die Datenbank an. Die Daten aus Schritt 1 werden jetzt im Hintergrund mit übergeben und du kannst diese zur Erstellung des Dropdowns für Schritt 2 Nutzen. Gleiches dann mit den Daten von Schritt 1+2 für Schritt 3 usw.

Die im "Produktiveinsatz" von PHP gängige Lösung wäre Wohl PHP in Kombination mit AJAX


----------



## boss3D (3. Juli 2014)

^^ Hey, vielen Dank! Genau sowas in die Richtung brauche ich ... 

Übrigens habe ich in den letzten 3 h (ja, sitze schon seit 06:00 hier, damit ich um 15:00 rauskomme und zum Badesee fahren kann ) schon den gesamten Login inkl. Übermitteln der Daten aus der Registrierung an die DB hinbekommen. _*freu*_
Dropdowns habe ich jetzt zwar erstmal durch Checkboxen ersetzt, aber vielleicht ist deine Idee trotzdem umsetzbar. Ich überlege da noch, aber es ist ja auch noch Zeit.

[EDIT]
Was auch noch bedacht werden sollte: Im Normallfall machen die MAs zwar nur eine Tätigkeit am Tag, aber es sollte dennoch möglich sein, dass einer z. B. am Ende der Woche alles auf einmal einträgt, und da kann's schon sein, dass er bspw. am MO Tätigkeit 1 an Produkt a und b, und am MI Tätigkeit 4 an Produkt f durchgeführt hat. 
Es sollte für den MA in so einem Fall nicht nötig sein, sich "100 Mal" durchs Formular zu klicken. Irgendwie sollte noch etwas Effizienz in deinen Vorschlag rein, aber vielleicht kommen wir noch auf was.


----------



## TessaKavanagh (3. Juli 2014)

PHP ist dynamisch. Wenn du jetzt z.B. in Schritt 1 Checkboxen verwendest ist das Stichwort Multiauswahl. Dann könntest du also wenn er in Schritt eins zwei Tätigkeiten wählt in Schritt 2 zwei leisten mit Checkboxen erstellen lassen. Wenn er dann pro Tätigkeit z.B. 3 Verschiedene Produkte wählt lässt du für Schritt 3 eben 6 Leisten erstellen also jeweils für Tätigkeit 1 Produkte a - c. Und für Tätigkeit 2 Produkte a-c jeweils eigene Leisten.

Du musst halt nur das html durch ein PHP Script erstellen lassen.


----------



## Rho (3. Juli 2014)

Schau dir einfach mal Javascript an. In Verbindung mit jQuery & Co lässt sich dein Problem relativ einfach und vor allem auch benutzerfreundlich lösen. Du kannst aber natürlich auch weiterhin auf deine PHP-only Frickellösung beharren.


----------



## boss3D (3. Juli 2014)

^^ Das wird schon mit html und PHP und ich lerne jeden Tag, den ich am Projekt arbeite, was Neues dazu. 

Ich habe jetzt hier mal die erste html Seite (Tätigkeitsnamen abgekürzt):

```
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Zeiterfassung1</title>
</head> 
<body>
<form action="formular.php" method="get">
    <h1>Zeiterfassung</h1>
    <p>Bitte wählen Sie Ihre Tätigkeit:</p>
        <input type="checkbox" name="taetigkeit[]" value="A" id="check1"><label for="check1">A</label><br>
        <input type="checkbox" name="taetigkeit[]" value="A-B" id="check2"><label for="check2">A-B</label><br>
        <input type="checkbox" name="taetigkeit[]" value="E" id="check3"><label for="check3">E</label><br>
        <input type="checkbox" name="taetigkeit[]" value="O" id="check4"><label for="check4">O</label><br>
        <input type="checkbox" name="taetigkeit[]" value="P" id="check5"><label for="check5">P</label><br>
        <input type="checkbox" name="taetigkeit[]" value="P/A" id="check6"><label for="check6">P/A</label><br>
        <input type="checkbox" name="taetigkeit[]" value="S" id="check7"><label for="check7">S</label><br>
        <input type="checkbox" name="taetigkeit[]" value="Se" id="check8"><label for="check8">Se</label><br>
        <input type="checkbox" name="taetigkeit[]" value="Ser" id="check9"><label for="check9">Ser</label><br>
        <input type="checkbox" name="taetigkeit[]" value="So" id="check10"><label for="check10">So</label><br>
        <input type="checkbox" name="taetigkeit[]" value="V" id="check11"><label for="check11">V</label><br>
    <p>Bitte fügen Sie eine Beschreibung Ihrer Tätigkeit hinzu:</p>
        <textarea name="text" id="text" rows="4" cols="25"></textarea><br><br>                    
    <input type="submit" value="Weiter zu Produkt" />
</form>
</body>
</html>
```
Ich habe ganz genau verstanden, wie die zweite Seite gemäß TessaKavanagh's Idee ausschauen soll, aber ich weiß nicht so wirklich, wie ich das jetzt "dynamisch" mit PHP machen soll ... 

Über folgendes php-Script müsste ich die (leere) zweite html-Seite kriegen?! Nur, was jetzt? Ich muss das wahrscheinlich irgendwie aufrufen, sobald der _submit_-Button auf der ersten html-Seite gedrückt wird?!

```
<?php
    $title = 'Zeiterfassung2';
    $datei = "$title".".html";
?>
```
Und wie genau erstelle ich dann via php die Checkboxen in der zweiten html-Seite? Ich kann ja jetzt nicht einfach html-Code in dieses php-Script reinschreiben, oder?

[EDIT]
Ich könnte auch das php-Script, das bereits beim Anklicken des _submit_-Buttons ausgeführt wird, um die 4 Zeilen am Ende erweitern:

```
<?php    
    $taetigkeit = $_GET['taetigkeit'];
    $taetigkeit_text = implode("<br>",$taetigkeit);
    echo '<p>Ihre ausgewählten Tätigkeiten:<br><br>'.$taetigkeit_text.'</p>';
    
    $beschreibung = $_GET['text'];
    echo '<p>Ihre Beschreibung:<br><br>'.$beschreibung.'</p>';
    
    $fh = fopen("zeiterfassung2.html", "w+");
    if ($fh) {
        fwrite($fh, "<html>[..... hier der HTML Code .....]</html>");
    }
    
    fclose($fh);
?>
```
^^ Aber ob das "sauber" wird, da dann den ganzen html-Code auch gleich mitreinzuknallen?


----------



## TessaKavanagh (3. Juli 2014)

1. Wenn etwas dynamisch werden soll brauchst du einen Speicherort an dem du benötigte Daten ablegen kannst (Datenbank oder File). In deinem Fall bietet sich die ohnehin verwendete MySQL Datenbank an.

Hier erstellst du jetzt z.B. eine Tabelle die heißt "Produkte" mit den Spalten (id, Produktname) Da schreibst du alle verfügbaren Produkte rein.

Dann erstellst du eine php Datei als Grundlage. PHP ist eine serverseitige Sprache der Quellcode wird somit nie an den Nutzer weitergegeben sondern nur das Interpretierte Ergebnis.
Du kannst jetzt also über echo "****"; Beliebigen HTML Code erzeugen 
Das php Dokument <?php echo "<html><head></head><Body>Hallo Welt</Body></html>"; ?>
würde in der Ausgabe also genauso wie das html Dokument mit Inhalt <html><head></head><Body>Hallo Welt</Body></html>" aussehen. Der Nutzer kann es nur durch die andere Dateiendung unterscheiden.

Nun zum eigentlichen Problem:

Du hast jetzt z.B. 2 Produkte per POST übertragen. Ins POST Formular im ersten Dokument muss jetzt natürlich die PHP Datei als Target.

Im neuen Dokument Fragst du dann z.B. mit einer for Schleife die POST Daten ab.

also in deinem Fall:

$checkbox_arr = array();
for($a= 1 ; $a <= 11 ; $a++) 
{

$abfrage = 'check';
$abfrage  .= $a; 
if(isset($_POST['$abfrage']))
{$Checkbox_arr[] = $_POST['$abfrage'];}

} 

am ende hast du dann ein Array mit z.B. 2 Einträgen für die jeweiligen Tätigkeiten.
Auf dieser Basis kannst du dann mit:

$count_arr = Count($Checkbox_arr);
for($b = 1; $b <= $count_arr; $b++)
{

Hier kannst du jetzt jeweis Checkbox einträge mit Dynamischem Inhalt erstellen lassen.

}

Das ist kein funktionierender Code. Es handelt sich lediglich um einen Lösungsansatz. Wenn du einfach mal drüber sprechen möchtest kannst du mir gerne ne PN schicken und man  könnte mal Nachmittags per TS reden. Wie dir aber viele hier schon geschrieben haben ist das sicher keine "optimale" Lösung im Hinblick auf Leistungsfähigen Code.

Im Prinzip ist der Fehler in deinem Lösungsansatz das du versuchst php in html einzubinden wenn man mit php Arbeitet bietet es sich an das ganze genau andersherum zu gestalten. Oder du Arbeitest mit einer entsprechenden Template Engine (was ich bevorzuge). Dann kannst du bei einem Objektorientierten Ansatz den Code vollständig vom Layout trennen.


----------



## DarkMo (3. Juli 2014)

bin jetz grad ebbes durchn wind, aber hier nochmal mein erklärungsversuch:

du hast eine formular.php meinetwegen mit eben einem formular:

```
<?php
  // html head gerödel...
  <form... action="formular.php" method="post">
    <input dropdown... name="drop1">
      <option bla value="1" select="selected">
      <option blubb value="2">...
    <input submit... name="send">
  </form>
  // footer gerödel...
?>
```
jetz mal skizzenhaft.

drückst du den button, ruft sich die seite szs selber wieder auf. per post wird der gewählte dropdown dingens value gesendet. es passiert also folgendes:
wieder wird die selbe datei vom server bearbeitet, nur dass diesmal eben formulardaten dabei sind. müssen wir also das noch checken, und je nach dem (dynamisch - php usw ^^) die seite umgestalten:

```
<?php
  // html head gerödel...
  <form... action="formular.php" method="post">
    [B]if(!isset($_POST['send'])) {[/B] // kein senden (name send) button gedrückt -> unsere anfangsdropdingens anzeigen
    <input dropdown... name="drop1">
      <option bla value="1" select="selected">
      <option blubb value="2">...
    [B]} else {[/B] // ansonsten halt die nächste
    <input dropdown... name="[B]drop2[/B]">
      [B]if(isset($_POST['drop1']) && [/B][B]$_POST['drop1'] == "arbeiten") {[/B] // oder hier vllt besser switch case
      <option [B]haste [/B]value="1" select="selected">
      <option [B]nich [/B]value="2">...
      <option [B]gesehn [/B]value="3">...
     [B] } else {[/B]
      // andere options...
      }
    }
    <input submit... name="send">
  </form>
  // footer gerödel...
?>
```
so in etwa. muss gleich zur arbeit, kann also nich so ausführlich ^^

jedenfalls baust du halt je nachdem, was in post gesendet wird, deine seite immer um. und die dropboxen füllst du am sinnvollsten in ner forschleife und wie tessa schon sagte: die daten, mit was du die dropboxen füllst, kannste bspw in der db mit speichern - oder hardcoded in der php. per db methode können aber auch aussenstehende mittels php-admin dingens direkt in der db neue optionen einstellen oder löschen usw usf.

das lässt sich natürlich beliebig erweitern und ich hoffe, die grundsätzliche arbeitsweise ist klar. also das ist mit php usw definitiv machbar. wenn deine firma eh über den browser arbeitet, dann ist das wohl nichmal die schlechteste alternative. falls das aber völlig bums is und du auch per java oder so arbeiten kannst (auch da kann man formulare erstellen und ne db anbinden - genauso halt c usw ^^) UND du damit besser klar kämst, wäre das halt wie schon erwähnt auch ne alternative.

beim php login gelumbe haste halt das problem, dass du die logindaten immer mit "rüberretten" musst, wenn man irgendwas klickt. cookies und sessions und all son gerumbel - das is bissl zäh ^^


----------



## Rho (3. Juli 2014)

DarkMo schrieb:


> also das ist mit php usw definitiv machbar. wenn deine firma eh über den browser arbeitet, dann ist das wohl nichmal die schlechteste alternative.



Was wäre denn die schlechteste Alternative?

Und inwiefern macht der Zugriff auf die Anwendung per Browser PHP zu einer besseren Alternative? Das ließe sich auch ganz einfach per Java realisieren.


----------



## boss3D (3. Juli 2014)

Danke an alle für die Tipps! Ich werde heute zeitlich nicht mehr zum Weitermachen kommen, aber morgen, und v. a. am WE, möchte ich mich wieder intensiv damit beschäftigen.

Im Anhang mein bisheriges Ergebnis, falls es sich wer anschauen will. Ich denke, dann wird euch auch klarer, in welche Richtung ich mit dem ganzen gehen will ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Wer's sehen will:
1) xampp installieren, Apache und MySQL starten
2) Alle Files aus dem Archiv in den htdocs Ordner einfügen
3) Die beiden sql-Datenbank-Files in phpmyadmin importieren, sodass beide DBs drinnen sind
4) dann http://localhost/eintragen.html starten
^^ Von da weg rufen sich die Files dann nacheinander gegenseitig auf

Dass es hier und da noch Verbesserungsmöglichkeiten gibt, ist mir auch selbst klar. Vor allem das "root, root" in den Datenbank-connections stört mich noch irgendwie. Das gehört sicher noch geändert, auch wenn so alles funktioniert?! Und die GETs sollte ich auch noch durch POSTs ersetzen, aber das habe ich heute nicht mehr geschafft, ohne mir dabei zig Errors einzufangen.


----------



## boss3D (4. Juli 2014)

Okay, meine Seite 2 (php Script) habe ich jetzt mal so begonnen:

```
<?php
    echo "<br><h1>Projektzeiterfassung</h1>";
    echo "Bitte wählen Sie je Tätigkeit die Produkte, an denen Sie gearbeitet haben:";
    
    $checkbox_arr = array(); // $checkbox_arr wird Feld
    for ($a = 1; $a <= 11; $a++) { // Schleife durchläuft Anzahl aller Produkte
        $abfrage = $a; // $abfrage erhält in jeder Schleifenrunde um 1 erhöhten Wert, beginnend bei 1, endend bei 11
        if (isset($_POST['$abfrage'])) { // Wenn überhaupt etwas in POST steht, soll Wert aus dem html-Formular (Anzahl d. gew. checkboxen) in $abfrage gespeichert werden
            $Checkbox_arr[] = $_POST['$abfrage']; // $Checkbox_arr erhält dann diesen Wert als Größe
        }
    } 
    
    $count_arr = Count(isset($Checkbox_arr)); // $count_arr erhält Größe des $Checkbox_arr als Wert
    for ($b = 1; $b <= $count_arr; $b++) { // jetzt wird von 1 bis zu diesem Wert gezählt und so oft passiert dann was ...
        echo "test";
    }
?>
```
Allerdings bin ich mir nicht sicher, ob ich TessaKavanagh's Schleifen-Vorschlag richtig verstanden habe. Vorrausgesetzt, meine Kommentare stimmen, dann muss irgendwo ein semantischer Fehler drinnen sein?! Was auch immer ich in die zweite Schleife reinschreibe, passiert nur 1 Mal ... egal, wie viele checkboxen ich im html-Formular angewählt habe. 

Ich verstehe auch nicht, wieso ich in der ersten Schleife überhaupt erstmal alle Produkte bis 11 durchzählen soll. Das if alleine sollte doch schon reichen, weil die Anzahl der angewählten checkboxen doch eh schon in POST drinnen sein sollte?!

Das ist alles ein bisschen seltsam. Habe gerade gesehen, dass ich theoretisch $checkbox_arr immer klein schreiben und diese Zeile ( $checkbox_arr = array(); ) auch ganz weglassen könnte. Ändert gar nichts. ???

[EDIT]
@ DarkMo
Ungefähr verstehe ich deinen Beispielcode und was du damit zeigen willst. Grundsätzlich ist mir klar, was ich jetzt machen muss. Es wird am Ende eine Mischung aus Elementen aus deinem und Tessa's Code. Bei mir scheitert's im Moment an meinen mangelnden php-Kenntnissen, siehe meine Fragen über dem EDIT ...


----------



## TessaKavanagh (4. Juli 2014)

du kannst die Variable $Checkbox_arr auch $horst nennen. Die Großschreibung ist nur weil der Rechner hier aus irgendeinem Grund das dingen immer wieder groß macht.

Ich zähle bis 11 durch weil es in deinem Script Hypotetisch bis zu 11 Checkboxen gibt. Wenn du die schleife also nur 8 mal durchlaufen lässt aber Checkbox 10 aktiviert wäre. Dann würde er nur die Checkboxen 1-8 abfragen und 10 ignorieren. Das if Fragt ohne schleife ja dann nur chechbox1 ab. Erst im zweiten Durchlauf wird checkbox2 abgefragt.

 $checkbox_arr = array(); // initalisiert das Array.

PHP würde aber wie du bemerkt hast die variable einfach in ein Array Ändern sobald du es als Array ansprichst. Weswegen die o.g. Zeile nicht zwingen nötig ist. 

Schreib nach "$count_arr = Count(isset($checkbox_arr));" mal ein "echo $count_arr;" da müsste ja eigentlich jetzt ne Zahl stehen. Evtl einfach mal nur $count_arr = Count($checkbox_arr)

und ja ich hasse es das der Rechner hier immer Großbuchstaben reinhaut -.-

Edit:
 Du Schreibst oben// Wenn überhaupt etwas in POST steht, soll Wert aus dem html-Formular (Anzahl d. gew. checkboxen) in $abfrage gespeichert werden

Jain er soll nur indirekt die Anzahl der gewählten Checkboxen bestimmen. Ziel ist es hier herauszufinden welche Checkboxen genau aktiviert wurden.


----------



## boss3D (4. Juli 2014)

^^ Okay, jetzt verstehe ich mal das ganze Konstrukt.

echo $count_arr; liefter genau "1", wie ich's schon bemerkt und erwähnt hatte. 

Gerade festgestellt: Ohne das zweite isset, das ich eingefügt habe, kommt immer "0".


----------



## TessaKavanagh (4. Juli 2014)

Füge bitte mal "print_r($_POST);" in den Code ein und Poste das Ergebnis mit mindestens 2 aktivierten Checkboxen


----------



## boss3D (4. Juli 2014)

Da kommt dann folgendes raus:

Array (     [taetigkeit] => Array         (             [0] => An             [1] => En             [2] => Or             [3] => Sc             [4] => So         )      [text] => fd )

Schaut ja nicht schlecht aus, nur das fd hinten stört ein bisschen (das ist der Inhalt meiner Textbox, wo der MA eine Beschreibung eingeben kann). Die Textbox vielleicht weg und woanders hin (dann auf Seite 3?), und die Anzahl d. anderen Feldelemente abzählen, dann müsst's passen ...

Muss ich mir jetzt überlegen. Ganz verstehe ich aber noch nicht, wieso ich immer nur "1" oder "0" erhalte, je nachdem ob mit oder ohne isset. count() sollte doch schon die Elemente abzählen?!


----------



## TessaKavanagh (4. Juli 2014)

Die Lösung dürfte Simpel sein. Ändere mal den "Name" im Formularfeld in den Checkboxen in taetigkeit1 bis taetigkeit11 und im php Code ersetzt du bei $abfrage = "check"; das ganze durch $abfrage  = "taetigkeit";

Das [text] => FD wird er nicht abfragen ist also insoweit unbeachtlich.


----------



## boss3D (4. Juli 2014)

Du meinst im html-File?
So: <input type="checkbox" name="taetigkeit*1*[]" value="An" id="check1"><label for="check1">An</label><br>

^^ Habe ich jetzt bei allen 11 gemacht.

Und im php Script (projektzeiterfassung2.php) schaut's jetzt so aus:

```
<?php
    echo "<br><h1>Projektzeiterfassung</h1>";
    echo "Bitte wählen Sie je Tätigkeit die Produkte, an denen Sie gearbeitet haben:";

    for ($a = 1; $a <= 11; $a++) {
        $abfrage = "taetigkeit";    
        $abfrage .= $a; 
        if (isset($_POST['$abfrage'])) { 
            $checkbox_arr[] = $_POST['$abfrage']; 
        }
    } 
    
    $count_arr = count(isset($checkbox_arr)); 
    echo "<br><br>";
    for ($b = 1; $b <= $count_arr; $b++) { 
        echo "test";
    }
?>
```
Und das Ergebnis ist:

*Notice*:  Undefined index: taetigkeit in *C:\xampp\htdocs\db\login\formular.php* on line *4*
*Warning*:  implode(): Invalid arguments passed in *C:\xampp\htdocs\db\login\formular.php* on line *5

*formular.php schaut so aus:
	
	



```
<?php    
    include('projektzeiterfassung2.php');

    $taetigkeit = $_POST['taetigkeit'];
    $taetigkeit_text = implode("<br>",$taetigkeit);
    echo '<p>Ihre ausgewählten Tätigkeiten:<br><br>'.$taetigkeit_text.'</p>';
?>
```


----------



## TessaKavanagh (4. Juli 2014)

Jop íst doch klar. Du hast doch im Formular den index geändert. Das implode $Taetigkeit kann jetzt natürlich nicht merh funktionieren. lösche mal alles nach dem include. Das [] hinter taetigkeit 1-11 kannst du auch gleich rausschmeißen


----------



## boss3D (4. Juli 2014)

Geht wieder, aber selbes Problem: Er zählt bei den checkboxen nur bis "1" ... egal, wie viele ich anwähle.


----------



## TessaKavanagh (4. Juli 2014)

also mein Vorschlag ich setze mich heute Nachmittag/Morgenvormittag mal zuhause hin und schicke dir einen funktionierenden Code

BTW. Kannst du hinter 
$abfrage = "taetigkeit";    
$abfrage .= $a;

mal echo $abfrage; setzen und das Ergebnis posten


----------



## boss3D (4. Juli 2014)

Dann kriege ich noch das ausgegeben: taetigkeit1taetigkeit2taetigkeit3taetigkeit4taetigkeit5taetigkeit6taetigkeit7taetigkeit8taetigkeit9taetigkeit10taetigkeit11

Es geht eh so einiges nicht, wie ich mir das vorgestellt hatte. Z. B. hätte ja DarkMo vorgeschlagen, html Code ins php Script einzufügen. Mache ich das, wird dieser nicht als solcher erkannt (trotz Tags und egal ob mit oder ohne echo), etc. ...

Ich weiß auch nicht, wie das dann am besten zu machen wäre, wenn das dann mal geht mit der Anzahl der angewählten checkboxen. Dann bin ich in der Schleife, die genau so oft mal durchlaufen wird und kann entsprechend viele checkboxen erstellen. Aber wie ich dann jeder checkbox eine andere Tätigkeit zuweise, sehe ich noch nicht. Puh, das wird noch "lustig".

BTW kannst du dir gerne von der Vorseite das zip-Archiv runterladen und anschauen, wie das alles, das ich bis jetzt habe, genau ausschaut. Nur in formular.php wäre jetzt eben alles zu löschen bis auf die include-Zeile, in projektzeiterfassung1.html bei taetigkeit 1, 2, 3, ... , 11 anhängen und die [] weg. Und projektzeiterfassung2.php ist eben dieses Konstrukt:

```
<?php
    echo "<br><h1>Projektzeiterfassung</h1>";
    echo "Bitte wählen Sie je Tätigkeit die Produkte, an denen Sie gearbeitet haben:";

    for ($a = 1; $a <= 11; $a++) {
        $abfrage = "taetigkeit";    
        $abfrage .= $a; 
        echo $abfrage;
        if (isset($_POST['$abfrage'])) { 
            $checkbox_arr[] = $_POST['$abfrage']; 
        }
    } 
    
    $count_arr = count(isset($checkbox_arr)); 
    echo "<br><br>";
    for ($b = 1; $b <= $count_arr; $b++) { 
        echo "test";
    }
?>
```


----------



## TessaKavanagh (4. Juli 2014)

Ich werde mich heute Nachmittag/Morgen früh mal hinsetzen und dir ein vollständiges (funktionierendes) und Auskommentiertest Beispiel erstellen. 

Inklusive Dynamische erstellten Checkboxen/Formularen


----------



## boss3D (4. Juli 2014)

Das wäre echt super! 

Blöd ist es halt schon, wenn man zwar genau weiß, was zu tun ist, aber es dann kaum umsetzen kann weil man sich mit dem "Arbeitsmaterial" zu wenig auskennt. Ich versuche zwar schon seit mittlerweile 4 Tagen, mir selbst von "0 weg" php beizubringen, aber übers Internet (mit seinem Halbwissen an jeder Ecke) ist das einfach nur verwirrend und GANZ was anderes, wie wenn man's von einem Lehrer auf einer Uni unterrichtet bekommt. (Glücklicherweise versteht mein Auftraggeber das aber und lässt mir ja gerade deswegen so viel Zeit)
Natürlich erkenne ich die elementaren Dinge wie Schleifen, Variablen, etc. aus meinen C- und Java-Kenntnissen wieder und auch mit $_POST kann ich langsam was anfangen, aber dieses html/php-Gemisch läuchtet mir noch nicht ein. Deswegen habe ich ursprünglich auch versucht, html und php bloß in getrennten Files zu halten. Ich habe aber auch nicht gedacht, dass das so "komplex" werden könnte, dass ich das Formular überhaupt in mehrere Teile aufspalten müssen werde ...
Was isset(), count(), implode(), und was ich halt bis jetzt so an php Funktionen benutzt habe, machen, kapiere ich auch, aber gerade deswegen nervt's mich, dann den "Knacks" in solchen mini-Codeschnipseln nicht anzufinden, wenn was nicht richtig funktioniert.

Aber ich nutze jetzt eh noch die Zeit bis 15:00 und suche selber weiter. Und wenn ich den Fehler finde und mal die richtige Anzahl habe, dann denke ich mich nochmal in die ifs von DarkMo rein ...


----------



## TessaKavanagh (4. Juli 2014)

Der Fehler liegt definitiv im Auslesen der Post werte. 

Hierzu bitte mal das Formular wie folgt ändern:  name = "taetigkeit[1]" bis  name = "taetigkeit[11]"

Dann musst du den Code im php wie folgt anpassen:

$abfrage = "taetigkeit[";
$abfrage .= $b;
$abfrage .= "]"

und dann sollte es hoffentlich funktionieren.

Sollte das nicht gehen muss es wahrscheinlich wie folgt lauten:

for ($a = 1; $a <= 11; $a++) {

        if (isset($_POST['taetigkeit][$b])) { 
            $checkbox_arr[] = $_POST['taetigkeit'][$b]; 
        }

P.S. eigentlich ist das ganze nicht sonderlich kompliziert. Ich stelle mich vermutlich nur grade doof an  Wenn man den Code nicht von Grund auf selber schreibt und selber testet dann ist es halt mühsam


----------



## boss3D (4. Juli 2014)

^^ Bei Variante 2 muss entweder die Zählvariable in der Schleife "$b" sein, oder die Indexvariable im if "$a" ... dann geht's endlich. Danke!

Aber was war jetzt das eigentliche Problem? Dass die checkboxen im html File keine Array-Felder mit Index waren?


----------



## TessaKavanagh (4. Juli 2014)

Es muss natürlich $a statt $b sein das hast du richtig erkannt 

Das eigentliche Problem war das die Kombination aus "name" und abfrage in php nie zusammen gepasst hat. Im ersten code habe ich versucht id abzufragen (was halt falsch war). Danach bin ich nicht von einem Array sondern von getrennten POST Variablen ausgegangen. Hat dann also wieder nicht gepasst. Damit eine eindeutige Zuordnung möglich ist habe ich als letztes das Array einfach zu einem assoziativen Array gemacht. Normalerweise würde das Array $teatigkeit bei zwei ausgewählten Boxen immer die keys [0] und [1] verwenden. Dabei spielt es dann keine Rolle ob teatigkeit 1 und 2 oder 5 und 7 ausgewählt wurden. Also als Beispiel [teatigkeit]  [0]=1   [1]=2 oder eben [teatigkeit]  [0]=5   [1]=7. 
In der jetzigen Varianten wäre das Array dann aber je nachdem [teatigkeit]  [1]=1   [2]=2 oder eben [teatigkeit]  [5]=5   [7]=7


----------



## boss3D (4. Juli 2014)

Okay, dann versuche ich das jetzt mal selber mit den Checkboxen, aber da habe ich eben noch ein "Logikproblem". Wie soll ich z. B. bei 3 gewählten Tätigkeiten innerhalb der selben Schleife zwar 3 Zeilen aber jede mit einer unterschiedlichen Tätigkeitsbezeichnung hinkriegen?

Na ja, das Array mit den bspw. 3 gespeicherten Tätigkeiten untereinander ausgeben und unabhängig davon an jede Zeile checkboxen in der Anzahl der Produkte anhängen ... Aber das wäre halt dann wieder nur eine optische Lösung, die zwar für den Benutzer der Website vernünftig aussieht, aber ICH habe wieder das Problem, dass dabei kein Zusammenhang zwischen der jeweiligen Tätigkeit und den Häkchen bei den Produkten entsteht (am Ende muss ich aber alle Daten zusammenhängend in eine DB kriegen) ... Hm 

[EDIT]
Wenn man den Gedanken fortführt: Dann müsste ich in der Auswertung dann irgendein if-Konstrukt basteln, das sagt "Wenn die Häkchen in Zeile 1 gemacht wurden, dann gehören sie zur Tätigkeit XY, sonst, bla ...". Aber mir kommt das immer noch unnötig umständlich vor?!


----------



## DarkMo (4. Juli 2014)

hmm, wieviele checkboxen hastn jetz? ich dachte "eine ansammlung" bisher, das da oben sieht aber irgendwie wie mehrere aus ^^ also generell wirds so gemacht:
SELFHTML: HTML/XHTML / Formulare / Auswahllisten, Radio-Buttons und Checkboxen <- da bei "bitte beachten sie". das habt ihr ja scheinbar auch schon gemacht: name="teatigkeit[]". dann sollte in $_POST['teatigkeit'] eigentlich das besagte array drin sein.

ja, hier stehts auch noch mal sehr schön: PHP: Checkboxen komfortabel auswerten

du müsstest jetzt also prüfen, ob isset($_POST['teatigkeit']) true ist. übrigens: das zu "count"en ergibt wohl wenig sinn  da kommt dann entweder 0 oder 1 bei raus (weil isset true oder false ergibt). hmm, oder es kommt immer 1 raus, da true/false/0/1 immer ein element ist - gute frage ^^ count ohne isset ergibt auch nicht 11 (oder wieviele checkboxen man so hat), sondern gibt die anzahl der ausgewählten checkboxen an. haste 3 checkboxen gewählt, sind auch genau diese 3 in dem array drin. als wert haben sie den value-parameter ausm html code. also sollte man mit dem vergleichen.

als bsp:
gehen wir davon aus, die checkboxen werden per schleife generiert und die daten stehen im array pff... $chkbx_values[]. dann könnte das ganze so aussehen:

```
for($i = 0; $i < $chkbx_count; $i++) {
  echo '<input type="checkbox" name="taetigkeit[]" value="'.$chkbx_values[$i].'"';
  if(isset($_POST['teatigkeit']) && $_POST['teatigkeit'][$i] == $chkbx_values[$i])
    echo ' checked';
  echo '> '.$chkbx_values[$i].'<br>';
}
```

damit dürften dann nach dem senden-button drücken (sofern man für das bsp natürlich auf die selbe seite leitet) die vorher gewählten checkboxen wieder ausgewählt sein. beim ersten echo bei dem value das sind übrigens ' und " gemischt. sieht vllt nich sehr eindeutig aus. hier sieht man auch gleich, dass php-code und html mischen keine probleme macht. das fand ich immer am reizvollsten irgendwie ^^ mit php eine html seite erstellen und dort html und js reinfummeln und das ganze mit sql-daten befüttern >< so einfach konnt ich noch nie "sprachen mischmasch" betreiben


----------



## TessaKavanagh (4. Juli 2014)

So ich nehme mal an das nicht jede Tätigkeit mit jedem Produkt möglich ist. Wenn das falsch ist verbessere mich bitte.
Zunächst legst du dir also eine Tabelle mit Tätigkeiten und eine Tabelle mit Produkten in der Datenbank an. Die Angaben der Checkboxen die du jetzt bisher "fest" in der html stehen hast ordnest du in der Tabelle für Tätigkeiten entsprechend ein. Du hast dabei mindestens folgende Spalten
id/name/produkte/

als Beispiel wären die Einträge dann eben id = 1 / Name = Taetigkeit 1 / Produkte= 1|2|4|6|9

dann trägst du die Produkte in eine Tabelle ein auch hier hast du id/Name

also id = 1 / Name = Produkt 1
id= 2 / Name = Produkt 2

etc.

Die Checkboxen kannst du dann mit einer verschachtelten for Schleife erstellen.

Innerhalb der ersten schleife durchläufst du das Array $checkbox_arr da du ja für jeden Eintrag eine entsprechende Leiste mit Produkten erstellen möchtest.

Also sähe die for Schleife in etwa wie folgt aus.

for($a = 0; $a <= count($checkbox_arr); $a++)
{
Abfrage von spalte Produkte aus der Tabelle taetigkeiten an der Stelle an der Name = $checkbox_arr[$a] 
Das Ergebnis der Abfrage ist dann ein String der z.B. so aussieht 1|2|4|5|8|10 den speicherst du als abfrage in $ergebnis.

Den string zerlegst du jetzt in ein Array
$ergebnis_arr = explode('|',$ergebnis);

Dann bindest du eine for Schleife in die bereits bestehende ein.
for($b = 0; $b < count($ergebnis_arr); $b++)
{
Daten aus der Tabelle Produkte abfragen und daraus Checkboxen erstellen.

Hole Name aus Tabelle Produkte an der Stelle wo id=$ergebnis_arr[$b] und speichere in $name
Speichere $ergebnis_arr[$b] in "$id;

$c = $b;
$c++;

echo "<input type="checkbox" name="produkte[$a][$id]" value="$name" id="check".$c""><label for="check".$c"">$name</label><br>";

// Da diese Schleife jetzt für jeden Durchlauf von Schleife $a erneut aufgerufen wird ergibt sich am Ende also ein Mehrdimensionales Array "Produkte" welches "übergeben" werden kann.

}


}


----------



## DarkMo (4. Juli 2014)

TessaKavanagh schrieb:


> echo "<input type="checkbox" name="produkte[$a][$id]" value="$name"  id="check".$c""><label  for="check".$c"">$name</label><br>";


 ööööh, satz mit x? ^^ hier wirste schnell nen fehler bekommen


----------



## boss3D (4. Juli 2014)

Bevor ich mich jetzt in eure Erklräungen reindenke, erstmal mein Lösungsansatz:

projektzeiterfassung.php

```
<?php
    echo "<br><h1>Projektzeiterfassung</h1>";
    echo "Bitte wählen Sie je Tätigkeit die Produkte, an denen Sie gearbeitet haben:<br><br>";
    
    $checkbox_arr = array();
    for ($a = 1; $a <= 11; $a++) {
        if (isset($_POST['taetigkeit'][$a])) {
            $checkbox_arr[] = $_POST['taetigkeit'][$a];
        } 
    }
    
    $count_arr = count($checkbox_arr); 
    for ($b = 1; $b <= $count_arr; $b++) { 
        echo include('produktcheckboxen.php');
        echo $checkbox_arr[$b-1]."<br>";
    }
?>
```
produktcheckboxen.php

```
<?php
    echo '<input type="checkbox" name="produkt[1]" value="60" id="check1">';
    echo '<input type="checkbox" name="produkt[2]" value="70" id="check2">';
    echo '<input type="checkbox" name="produkt[3]" value="120" id="check3">';
    echo '<input type="checkbox" name="produkt[4]" value="GO" id="check4">';
    echo '<input type="checkbox" name="produkt[5]" value="80" id="check5">';
    echo '<input type="checkbox" name="produkt[6]" value="100" id="check6">';
    echo '<input type="checkbox" name="produkt[7]" value="70G" id="check7">';
    echo '<input type="checkbox" name="produkt[8]" value="80G" id="check8">';
    echo '<input type="checkbox" name="produkt[9]" value="100G" id="check9">';
    echo '<input type="checkbox" name="produkt[10]" value="550" id="check10">';
    echo '<input type="checkbox" name="produkt[11]" value="250" id="check11">';
    echo '<input type="checkbox" name="produkt[12]" value="360" id="check12">';
    echo '<input type="checkbox" name="produkt[13]" value="480" id="check13">';
    echo '<input type="checkbox" name="produkt[14]" value="360" id="check14">';
    echo '<input type="checkbox" name="produkt[15]" value="S60" id="check15">';
    echo '<input type="checkbox" name="produkt[16]" value="S70" id="check16">';
    echo '<input type="checkbox" name="produkt[17]" value="S80" id="check17">';
    echo '<input type="checkbox" name="produkt[18]" value="S100" id="check18">';
    echo '<input type="checkbox" name="produkt[19]" value="LI" id="check19">';
    echo '<input type="checkbox" name="produkt[20]" value="GO!" id="check20">';
?>
```
liefter:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Wo der 1er vor den "Wörtern" herkommt, weiß ich nicht. Und wie ich Wörter und Kästchen vertauschen soll, sodass die Wörter links auf der Seite stehen, muss ich mir auch noch überlegen. Und über jede Kästchenspalte gehört natürlich noch ein Produktname. Die Kästchen sollten sich dann auch entsprechend weiter verschieben, sodass wirklich nur eines unter einem Produktname steht. Aber ich nehme mal an, unter php habe ich nicht den "Luxux", ein CSS File erstellen zu können, das mir das richtet?! Oder kann man eines machen, das sich nur auf html-Teile innerhalb eines php Files auswirkt?

So oder so kommt mir meine Lösung nicht gerade dynamisch vor. Ich denke mich jetzt mal in eure Vorschläge rein ...

PS: Es sind 11 Tätigkeiten und 20 Produkte. Wobei es nicht schlecht wäre, alles so zu machen, dass das vielleicht irgendwann vom Admin einfach erweitert werden kann ohne den halben Code umschreiben zu müssen.

[EDIT]
Damit ihr euch noch besser was vorstellen könnt. So sehen die Excel-Tabellen eines jeden MAs aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Meine Aufgabe ist jetzt eben, ein System zu entwickeln, bei dem die MA genau diese Daten (also Tätigkeit, Produkt und Stunden/Wochentag) in ein einfaches Formular eingeben können. Die Daten, die dieses Formular sammelt, sollen dann an eine DB gesendet werden, und der Admin will dann zwei Dinge machen können. Erstens, die Daten aus der DB wieder in ein sinnvolles Excel-Ergebnis exportieren können. Zweitens, die Daten "auswerten" können. Soll heißen, z. B. schauen, wie viele Stunden habe alle MAs zusammen an Produkt XY gearbeitet.

Bis auf den letzten Teil (da bin ich mir nicht sicher) sollte sich das alles mit Apache als Webserver, phpmyadmin für die DBs und der Website als Formular für die MAs umsetzen lassen. Deswegen bin ich ja auf diesen Lösungsansatz mit xampp gekommen ...


----------



## boss3D (4. Juli 2014)

TessaKavanagh schrieb:


> So ich nehme mal an das nicht jede Tätigkeit mit jedem Produkt möglich ist.


Jedem Produkt muss eine Tätigkeit zugewiesen werden, umgekehrt nicht! "Messe/Schulung" z. B. kommt als Tätigkeit immer wieder vor, betrifft aber kein Produkt.


TessaKavanagh schrieb:


> Zunächst legst du dir also eine Tabelle mit  Tätigkeiten und eine Tabelle mit Produkten in der Datenbank an.


Habe ich schon.


----------



## TessaKavanagh (4. Juli 2014)

boss3D schrieb:


> Bevor ich mich jetzt in eure Erklräungen reindenke, erstmal mein Lösungsansatz:
> 
> PS: Es sind 11 Tätigkeiten und 20 Produkte. Wobei es nicht schlecht wäre, alles so zu machen, dass das vielleicht irgendwann vom Admin einfach erweitert werden kann ohne den halben Code umschreiben zu müssen.


 
Deswegen sollst du alles per Schleife aus DB Einträgen erstellen lassen. Dein Code bezüglich der Checkboxen ist Hardcoded, das ist eben nicht dynamisch und anpassungsfähig. Du musst also das script so anlegen das es dir die benötigten Zeilen und Spalten von alleine erstellt. hierzu brauchst du die Zeile im echo '<input type="checkbox" name="produkt[20]" value="GO!" id="check20">'; im Prinzip nur ein einziges mal. Allerdings eingebunden in eine schleife und die Werte wie "Produkt[20]""GO!" "check20" müssen eben mit Variablen ersetzt werden die den entsprechenden in der DB hinterlegte Werte annehmen

P.S. selbstverständlich kannst du auch von PHP erstellten HTML Code per CSS Formatieren.


----------



## boss3D (4. Juli 2014)

Okay, grundsätzlich ist mir dein Ansatz klar, nur eines verstehe ich noch nicht: Wie genau hängen die beiden DBs (Tätigkeiten, Produkte) zusammen. 

Ich habe eine DB "Tätigkeiten" mit einer gleichnamigen Tabelle, die in ihren 2 Spalten 11 Einträge mit id und Namen enthält. Ebenfalls habe ich eine DB "Produkte" mit einer gleichnamigen Tabelle, die in ihren 2 Spalten 20 Einträge mit id und Namen enthält.

Ich nehme mal an, du willst die Tätigkeiten DB mit einer 3spaltigen Tabelle haben, um dort schon die ganzen Ergebnisse unserer "Seite 2" reinspeichern zu können?! Aber wozu soll dann noch die Produkte DB gut sein? Irgendwie verwirrt mich das mit den DBs ...

_PS: Alles, das in Richtung Optik und Design geht, halten wir uns als optional offen. Wichtig ist der Firma in erster Linie, dass ich innerhalb der Zeit eine vollfunktionsfähige DB-Lösung bastle. Die optische Gestaltung ist zweitrangig und nicht zwingend erforderlich._


----------



## DarkMo (4. Juli 2014)

der "1er" wird von deinem echo include kommen *vermut* bei erfolg gibt include warscheinlich ne 1 zurück - die du mit echo ausgibst  auf deutsch: einen include befehl brauchst du nicht auszugeben, lösche das echo.

gut, dein problem sieht ja nich viel verzwickter aus, als angenommen >< du hast ja nicht nur ein "checkboxen-feld", sondern gleich 11. also quasi ein 2dimensionales array, wenn man so will. dazu ein paar fragen: sind das IMMER 20 auswahlmöglichkeiten pro tätitkeit? dann könnte man es dennoch als simples eindimensionales array machen. und es sind pro tätigkeit auch mehrere auswählbar ja? weil wenn man sich nur für eins entscheiden können soll, wären radio-dingsens wohl besser.

so problem: du rufst 11 mal deine "checkbox-bau-php" auf. und in dieser sagst du immer ganz genau, dass die checkbox den namen produkt[1] zum bsp hat. nun hast du also 11 mal eine checkbox mit dem namen produkt[1] - wie soll er das dann auseinander klamüsern ;P lass einfach die zahl da drin weg, also schreib nur produkt[] und fertig. dann sollten wir schonmal das erste prob weghaben.

css... das versteh ich jetz nich so ganz. natürlich kannst du css verwenden. wieso auch nich? ob du nun schreibst
echo '<font>text</font>';
oder
echo '<font color="red">text</font>';
oder
echo '<font style="color:red">text</font>';
oder
echo '<font class="red-text">text</font>';

wieso sollte er da probleme bekommen? php erstellt html code, wenn du das möchtest. das ist ja irgendwo der grundsinn von php ^^
ach, ich seh grad noch ne frage: erst wörter, dann checkboxen... ääh... ^^

```
for ($b = 1; $b <= $count_arr; $b++) {
  [strike]echo[/strike] include('produktcheckboxen.php');
  echo $checkbox_arr[$b-1]."<br>";
}
```
einfach die zeilen austauschen? ><

für dynamik brauchst du dann wohl deine db. lege da eine tabelle an, in der du deine produkte angibst, und lege eine tabelle an, für deine tätigkeiten. nun ließt du beide aus (select * from...) und lässt für jedes dingen dort eben eine zeile/checkbox generieren. wieso du das mit den checkboxen in ne extra php ausgegliedert hast erschließt sich mir auch noch ned so recht ^^

ich machs mal exemplarisch (codeschnipsel aus meinem letzten projekt als grundlage ^^):

```
// Verbindung zu MySQL Aufbauen
  $wot = @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR $error.="Konnte keine Verbindung zur Datenbank herstellen.<br>Fehlermeldung: ".mysql_error()."\n<br>";
  mysql_select_db(BASIC_VEHICLE_DATA) OR $error.="Konnte Datenbank ".BASIC_VEHICLE_DATA." nicht benutzen.<br>Fehlermeldung: ".mysql_error()."\n\n<br><br>";

  ...

  // get produkte
  $products = array();
  $sql_p = "SELECT * FROM produkte;";
  $res_p = mysql_query($sql_p) OR die("Get Produkte failed.<br>".mysql_error());
  if(mysql_num_rows($res_p))
    while($row_p = mysql_fetch_assoc($res_p)) {
      $products[count($products)] = $row_p;

  // get tätigkeiten
  $sql_t = "SELECT * FROM taetigkeiten;";
  $res_t = mysql_query($sql_t) OR die("Get Taetigkeiten failed.<br>".mysql_error());
  if(mysql_num_rows($res_t))
    while($row_t = mysql_fetch_assoc($res_t)) {
      echo $row_t['Bezeichnung'].': '; // sofern die spalte in der tabelle Bezeichnung heißt
      foreach($products as $product)
        echo '<input type="checkbox" name="produkt[]" value="'.$product['Produkt'].'" id="check1">'; // sofern die spalte in der tabelle eben Produkt heißt
    }
```
dat müsste so funktionieren. schöner wärs natürlich, wenn du das alles in ne tabelle packst ^^ aber das is ja nur optik. jedenfalls kannst du dann in der db tätigkeiten und produke editieren wie du willst, und er baut dir die seite je nach dem dynamisch zurecht.


edit: du hast für einzelne tabellen eigenständige db's angelegt? oO erstell doch in deiner schon vorhandenen db einfach 2 tabellen xD
edit2: bei der inneren schleife (und dem produkte auslesen am anfang) musst ich noch was ändern, so müsst es passen


----------



## boss3D (4. Juli 2014)

Bitte nochmal das editierte Ende meines vorletzen Postings auf der Vorseite beachten. 

Trotzdem nochmal kurz: Es gibt (derzeit) 11 Tätigkeiten und 20 Produkte, allerdings sollte die Anzahl in Zukunft vom Admin leicht geändert werden können (daher dynamische Lsg. zu bevorzugen). Einem Produkt ist IMMER eine Tätigkeit zugewiesen, umgekehrt aber NICHT. Es gibt auch Tätigkeiten, die ein MA z. B. zur Fortbildung macht, hat ergo nichts (direkt) mit Produkten zu tun. In einer (Excel-)Tabelle kann auch die selbe Tätigkeit auf verschiedene Produkte angewandt werden, aber bevor uns da die Köpfe zu rauchen beginnen, kann das natürlich getrennt eingegeben werden --> also in so einem Fall z. B. 3 Zeilen mit 3 unterschiedlichen Produkten, aber jedem Produkt wird Tätigkeit a zugewiesen, die dann eben auch 3 mal in der Tabelle steht (also multi-Zuweisungen machen wir nur von Tätigkeiten zu Produkten, umgekehrt nicht).
Und am Ende sollen ALLE Daten korrekt zusammenhängend in EINER DB landen. Diese soll ja dann wieder zu einem vernünftigen Excel-Ergebnis exportiert werden können (das darf dann m. E. auch aus phpmyadmin heraus gemacht werden müssen).

Der Lösungsansatz von Tessa mit den dynamischen Schleifen gefällt mir schon sehr gut. Ich weiß aber noch nicht, ob ich das umzusetzen schaffe, aber ich fange nach der Pause, die jetzt dann um 12:00 ist, an. Mal schauen, wie weit ich komme ...

[EDIT]
Wegen der einen finalen vollständigen DB muss ich mir wohl auch noch überlegen, ob's schlauer wäre, nach dem Ausfüllen jeder Seite die Daten hinzusenden, oder diese von Seite zu Seite "mitzunehmen" und erst bei der letzten Seite (also dem letzten Formular) dann gesammelt hinzusenden.


----------



## TessaKavanagh (4. Juli 2014)

Kannst du evtl. so eine Excel Tabelle anonymisiert zur Verfügung stellen? Dann könnte ich auf der Basis aller vorhandenen Infos am WE mal exemplarisch ein vollständiges Script erstellen. Dann kannst du dir den Kompletten Code inklusive DB mit Tabellen anschauen und ggf. verändern.

Edit: Auch der Excel Export ließe sich über php relativ einfach realisieren.


----------



## DarkMo (4. Juli 2014)

die schleifen hab ich dir ja quasi eben schon hingekritzelt. aber, hmm, kurze frage: wieso setzt du das ganze nicht vergleichbar der exel tabelle um? das würde auch den "umstieg" der mitarbeiter vereinfachen, wenn sie dann "dein neues system" nutzen.

ich stell es mir gerade so vor:
du baust die tabelle wie die exel dinges das vorgibt nach.
du hast einen statischen teil: den header. also die überschriften szs
du hast einen dynamischen teil: den inhalt schon gespeicherter datensätze
un du hast nochmal einen statischen teil: die eingabe maske für neue datensätze
naja und untendrunter noch die summen zusammenfassung

den letzten punkt würde ich einfach wieder als letzte tabellenzeile gestalten. tätigkeit und produkt werden als dropdown liste gestaltet, aus der man sich das entsprechende aussuchen kann. wie die jetzt zusammenhängen, war mir auf die schnelle noch zu hoch >< aber fangen wir simpel an: in die dropdowns einfach erstmal alles reinbauen. die beschreibung einfach ein unput feld sowie die ganzen anderen dinger auch - fertig ist die eingabe maske.

wenn du dann noch nen login hinbastelst, kannst du die tabelle nach einträgen nur des einen mitarbeiters filtern. du kannst uU die vorhandenen einträge editierbar machen (sofern das möglich sein soll) und und und.

drückst du den add button, wird vor der tabellen-ausgabe eben der datensatz in die db geschrieben und das wars. bzw eben geändert, gelöscht, what ever. kommts zum erstellen der tabelle, ist die db ja schon wieder im korrekten zustand und du brauchst weiter nix ändern.


----------



## boss3D (4. Juli 2014)

TessaKavanagh schrieb:


> Kannst du evtl. so eine Excel Tabelle anonymisiert zur Verfügung stellen?


 Als Bild siehst du das schon auf der Vorseite, aber du meinst wohl als xlsx File selbst?! Ja, kann ich dir heute Abend noch oder morgen übermitteln.


TessaKavanagh schrieb:


> Auch der Excel Export ließe sich über php relativ einfach realisieren.


Von mir aus gerne, aber ich habe mir das noch nicht angeschaut. Das ist für mich einer der letzten Schritte. Bis jetzt habe ich nur gesehen, dass phpmyadmin praktischerweise alle möglichen Formate (xlsx, pdf, sql, ...) anbietet.


DarkMo schrieb:


> wieso setzt du das ganze nicht vergleichbar der exel tabelle um?


Hätte ich schon probiert gehabt, aber da werde ich alt beim php Script Code schreiben, weil ich ja nicht die ganze Tabelle als ein Objekt auswerten kann, sondern jede einzelne Textbox und jedes einzelne Dropdown gesondert behandelt werden müsste?!


----------



## DarkMo (4. Juli 2014)

wieso willst du die ganze tabelle auswerten? du musst doch nur den neuen datensatz (oder was du änderst) auswerten. das ist doch nur noch eine visualisirung schon vorhandener daten. sitz grad leider ned mehr bei mir am rechner, daher wirds mit codebeispielen nich mehr so genau ^^ aber ich kanns ja mal ausm kopf versuchen:

grundaufbau der seite:
- eventuelle configs/definitionen bla
- verbindungsaufbau zu sql
- formulardaten checken (wurde was gesendet)
- tabelle bauen
-> tabellen kopf
-> dynamisch den tabelleninhalt mit allem schon gespeicherten
-> "add" zeile für neuen datensatz
-> summen-zeile

das dürfts im groben schon gewesen sein. für tabelle bauen hätt ichs halt in etwa so gemacht:

```
echo '<table>';
// tabellen kopf
echo ' <tr>';
echo '   <td>Tätigkeit</td>';
echo '   <td>Produkt</td>';
// ...
echo ' </tr>';

// tabellen rumpf, dynamisch
// datensatz aus db lesen -> ich geh mal von nem $row-arry aus und denk mir passende spaltennamen aus
// im falle eines login basierten systems, solltest du beim speichern der datensätze die mitarbeiter-id mit in der db speicher,
// dann kannste hier alle datensätze rausfiltern, die nur von dem aktuellen mitarbeiter sind
// -> wäre wie gesagt nur eine änderung im sql-string nötig
$overall_time_spend_Mon = 0;
// ...
while($row = mysql_fetch_assoc($res) {
  echo ' <tr>';
  echo '   <td>'.$row['Taetigkeit'].'</td>';
  echo '   <td>'.$row['Produkt'].'</td>';
  // ...
  echo '   <td>'.$row['Time_spend_Mon'].'</td>'; // hier müsste man noch irgendwie ausknobeln, wie man das macht ^^
  $overall_time_spend_Mon += $row['Time_spend_Mon'];
  // ...
  echo '   <td><input type="submit" name="edit"...></td>'; // <- eventuell ein edit-button
  echo ' </tr>';
}

// add zeile
echo ' <tr>';
echo '   <td><input type="text" name="add_taet"...></td>';
echo '   <td><input type="text" name="add_prod"...></td>';
// ...
echo '   <td><input type="submit" name="add"...></td>'; // <- add button
echo ' </tr>';

// Summenzeile
echo ' <tr>';
echo '   <td colspan="3" style="text-align:right">Summe</td>';
echo '   <td>'.$overall_time_spend_Mon.'</td>';
// ...
echo ' </tr>';
echo '</table>';
```

so in etwa würd ich mir das vorstellen.


----------



## TessaKavanagh (4. Juli 2014)

Also die gezeigte Tabelle reicht mir, da brauche ich keine Orginal Excel Datei. Das einzige was ich noch bräuchte ist halt eine Liste mit Produktnamen und Tätigkeitsnamen.


----------



## Rho (4. Juli 2014)

boss3D schrieb:


> Blöd ist es halt schon, wenn man zwar genau weiß, was zu tun ist, aber es dann kaum umsetzen kann


Ich kann mich irren, aber die Umsetzung ist doch zumeist die eigentliche Schwierigkeit.



boss3D schrieb:


> Ich versuche zwar schon seit mittlerweile 4 Tagen, mir selbst von "0 weg" php beizubringen


Schade um die vier Tage... 



boss3D schrieb:


> übers Internet (mit seinem Halbwissen an jeder Ecke) ist das einfach nur verwirrend


Dafür bietet sich in der Regel ein gutes Buch an. Wobei, PHP mag da eine Außnahme sein.



boss3D schrieb:


> wie wenn man's von einem Lehrer auf einer Uni unterrichtet bekommt.


Das meiste in der Richtung wirst du dir letztendlich selbst beibringen müssen. Gewöhne dich daran.






TessaKavanagh schrieb:


> Zunächst legst du dir also eine Tabelle mit Tätigkeiten und eine Tabelle mit Produkten in der Datenbank an. Die Angaben der Checkboxen die du jetzt bisher "fest" in der html stehen hast ordnest du in der Tabelle für Tätigkeiten entsprechend ein. Du hast dabei mindestens folgende Spalten
> id/name/produkte/
> 
> als Beispiel wären die Einträge dann eben id = 1 / Name = Taetigkeit 1 / Produkte= 1|2|4|6|9
> ...


 
Ist das Schema für die Tätigkeitentabelle dein Ernst?


----------



## boss3D (4. Juli 2014)

@ TessaKavanagh
Excel-File kommt noch heute. Ich richte es gerade her. Kommt dann hier im Anhang rein.

[EDIT]



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        


^^ Die einzelnen Zellen in den Spalten Tätigkeiten und Produkte waren ursprünglich Dropdowns, falls das was zur Sache tut

@ DarkMo
Jetzt haben wir soviele Ansätze diskutiert, dass ich schon gar nicht mehr weiß, welchen ich denn jetzt beginnen oder weiterverfolgen soll. Ich schau mir morgen mal deine Idee mit der Tabelle an. Klingt ja eigentlich ganz gut, zumindest solange ich es effizienter und dynamischer umsetzen kann als meinen ersten Versuch. 

@ Rho
Die Entscheidung ist nun mal auf eine html/php Lösung gefallen. Das wird sich nicht mehr ändern, und deine ständigen pseudo-sarkastischen Kommentare dazu sind leider wenig hilfreich.


----------



## Rho (4. Juli 2014)

Und das klappt bisher ja auch ganz ausgezeichnet. 

Mal davon abgesehen, war mein Kommentar bezüglich Buch, um eine Sprache von Grund auf zu lernen völlig ernst gemeint.
Das Datenbankschema, zu dem ich einen Kommentar abgegeben habe, ist übrigens wirklich völlig Banane. Ganz ohne "Pseudosarkasmus".


----------



## boss3D (4. Juli 2014)

Ich hatte aus deinem letzten Posting eh nur die eine Meldung bzgl. html/php Lsg. gemeint. Jedenfalls lernen hier alle aktiv mitarbeitenden was und gerade das macht die Sache m. E. so interessant. Also mir macht's Spaß, php zu lernen und ich habe bei dem Projekt zum Glück keinen Zeitdruck. 

Wenn man sich in was Neues einarbeiten muss, wird selten der erste Versuch gleich ein Meisterwerk. Deswegen versuchen wir ja auch immer noch, den bestmöglichen Lösungsansatz zu finden. Was trägst du dazu bei, außer immer wieder negative und somit sinnlose Kommentare einzustreuen?
Wenn du dich nicht konstruktiv beteiligen willst, warum sparst du dir dann nicht die Zeit, überhaupt hier zu posten?

_PS: Excel ist jetzt im vorigen Posting angehängt._


----------



## Rho (4. Juli 2014)

Auf Fehler und Probleme hinzuweisen finde ich durchaus konstruktiv.
Meine Hauptmotivation ist allerdings, dass ich den Thread einfach unterhaltsam finde.

Hättest du dich für irgendwas anderes als PHP entschieden, hätte ich dich sicher auch mehr unterstützt. PHP tue ich mir allerdings in meiner Freizeit nicht freiwillig an. 

Du solltest dir jedenfalls erstmal ein halbwegs vernünftiges Datenbankschema überlegen.


----------



## DarkMo (5. Juli 2014)

also ich mag php seeeehr ^^ weis garnich, wie man das nich leiden kann


----------



## Rho (5. Juli 2014)

Wie auch immer. Auf das Endergebnis bin ich schon sehr gespannt.


----------



## boss3D (5. Juli 2014)

Rho schrieb:


> Auf Fehler und Probleme hinzuweisen finde ich durchaus konstruktiv.


Konstruktiv ist für mich, seiner Kritik auch Verbesserungsvorschläge folgen zu lassen ...


DarkMo schrieb:


> also ich mag php seeeehr ^^ weis garnich, wie man das nich leiden kann


Dem schließe ich mich mittlerweile an. Ist zwar immer noch mühevoll, aber es macht Spaß, sich da einzuarbeiten. 


Rho schrieb:


> Du solltest dir jedenfalls erstmal ein halbwegs vernünftiges Datenbankschema überlegen.


In meinem Kopf habe ich schon eine ziemlich genaue Idee, was ich haben will. Ich weiß allerdings noch nicht, ob das in der Form realisierbar ist, oder ob ich wieder eine andere Lösung brauche.

Jedenfalls hätte ich mir gedacht, ich brauche erstmal mehrere "kleine" DBs. 
- Eine heißt derzeit "homepage" (ja, nicht ganz aussagekräftig, der Name) und nimmt alle User, die sich, bevor sie sich einloggen können, registrieren müssen, auf. --> id, passwort, username
- Eine andere heißt "produkte" und enthält eben alle 20 Produkte. --> id, produktname
- Eine weitere heißt "taetigkeiten" und enthält die 11 Tätigkeiten. --> id, taetigkeit

Und am Ende sollen (so vermute ich) ALLE Daten in EINER DB landen, die dann in ein vernünftig strukturiertes Excel-Dokument exportiert werden kann.
- Deswegen vielleicht eine DB "projektzeiterfassung" anlegen?! --> ??? (Spalten)

^^ Im Grund stelle ich mir das ungefähr so vor, dass die "kleinen" DBs die jeweiligen Daten aus dem online-Formular aufnehmen. Und dann, sofern möglich, liefern die "kleinen" DBs diese an die eine große "Über-DB" weiter.
Oder, um uns vielleicht Arbeit zu ersparen, könnte man vielleicht auch einfach gleich nur die eine große DB, die bereits Spalten für Produkte, Tätigkeiten, Zeit, etc. enthält, erstellen und dann eben die Daten aus den einzelnen Formularfeldern (dropdowns, checkboxen, whatever, ...) immer nur an die jeweilige Spalte in der großen DB übertragen. 
So eine "große DB" müsste es dann eben für jeden einzelnen User geben. Vielleicht sogar noch dynamisch erstellt, sobald sich dieser registriert.

K. A. was davon oder inwieweit sich das so umsetzen lässt, aber soweit jedenfalls meine Vorstellung von dem ganzen ...

Was die Umsetzung betrifft: Daten in php aus DBs holen, ist mir schon einigermaßen klar. Zuerst Verbindungsaufbau mit mysql_connect(), dann eben die Spalte ($row) auswählen, und mit der id auf die Daten zugreifen. Wie das jetzt umgekehrt geht, mit Daten an eine DB senden, weiß ich noch nicht so genau, aber vermutlich recht ähnlich. In meinem registrier-php-Script (heißt eigentlich eintragen.php) passiert ja schon genau das. Nur stammt der Code halt wieder aus dem Web und ich habe ihn nur entsprechend angepasst, damit er für das Projekt passt. Aber das finde ich da schon an, wie das zu machen ist. 
--------------

Ich möchte zumindest die "Useroberfläche" jetzt erstmal nach der Idee gestalten:


DarkMo schrieb:


> wieso setzt du das ganze nicht vergleichbar der exel tabelle um?
> 
> ich stell es mir gerade so vor:
> du baust die tabelle wie die exel dinges das vorgibt nach.
> ...


Wie das dann "im Hintergrund" ausschauen muss, da hätte ich bitte gerne ein paar Kommentare zu meiner Idee (siehe über Trennlinie in diesem Posting).

@ DarkMo
Hattest du beim dynamischen Teil gemeint, dass da html-dropdowns angelegt werden, die für ihre Auswahlmöglichkeiten auf die produkte- bzw. taetigkeiten-DB zurückgreifen (also deren Inhalt anzeigen)? Oder eben checkboxen, die in der Anzahl der Inhalte der jeweiligen DB dynamisch angelegt werden?

BTW: Läuft das nicht am Ende wieder auf Tessa's Idee raus, dass ich mehrere Seiten brauche? Ich lasse mir bspw. erstmal dynamisch die checkboxen für Tätigkeiten erstellen. Dann wählt der MA bspw. 3 aus, und jetzt brauche ich eine Möglichkeit, ihm die Produkt-Auswahlmöglichkeiten so anzuzeigen, dass er genau angeben kann, in welcher Tätigkeit er an welchem Produkt beschäftigt war. Ergo Seite 2? usw. ?


----------



## Rho (6. Juli 2014)

boss3D schrieb:


> Konstruktiv ist für mich, seiner Kritik auch Verbesserungsvorschläge folgen zu lassen ...


Da du bisher für Vorschläge meinerseits absolut nicht empfänglich warst, sah ich darin keinen tieferen Sinn. 



boss3D schrieb:


> Dem schließe ich mich mittlerweile an. Ist zwar immer noch mühevoll, aber es macht Spaß


Mag überraschend kommen, aber es gibt Sprachen die sind nicht mühevoll und machen trotzdem Spaß.



boss3D schrieb:


> Jedenfalls hätte ich mir gedacht, ich brauche erstmal mehrere "kleine" DBs.
> - Eine heißt derzeit "homepage" (ja, nicht ganz aussagekräftig, der Name) und nimmt alle User, die sich, bevor sie sich einloggen können, registrieren müssen, auf. --> id, passwort, username
> - Eine andere heißt "produkte" und enthält eben alle 20 Produkte. --> id, produktname
> - Eine weitere heißt "taetigkeiten" und enthält die 11 Tätigkeiten. --> id, taetigkeit



*seufz*

Mit "kleine DBs" meinst du hoffentlich Tabellen. Falls du wirklich planst für jeden Mist eine eigene Datenbank anzulegen, solltest du dein Vorhaben nochmal überdenken.
Du hast dann also eine Tabelle mit Namen _Homepage_, in der die Daten der Benutzer gespeichert werden. Ganz verrückte Idee, warum nennst du die Tabelle nicht einfach _User_? 
Die Tabellen _Produkt_ und _Taetigkeit_ sind ja so weit in Ordnung. Du solltest dir aber noch überlegen, wie du die Beziehung zwischen Produkten und Tätigkeiten in deinem DB-Schema abbilden willst. So weit ich das mitgekriegt habe, kann man für ein bestimmtes Produkt ja auch nur ganz bestimmte Tätigkeiten auswählen. Dafür brauchst du also noch eine weitere Tabelle.




boss3D schrieb:


> Und am Ende sollen (so vermute ich) ALLE Daten in EINER DB landen, die dann in ein vernünftig strukturiertes Excel-Dokument exportiert werden kann.
> - Deswegen vielleicht eine DB "projektzeiterfassung" anlegen?! --> ??? (Spalten)


Ja, richtig erkannt. Du brauchst dann natürlich auch noch eine oder mehrere Tabellen um die Eingaben der Benutzer in der DB zu speichern.




boss3D schrieb:


> ^^ Im Grund stelle ich mir das ungefähr so vor, dass die "kleinen" DBs die jeweiligen Daten aus dem online-Formular aufnehmen. Und dann, sofern möglich, liefern die "kleinen" DBs diese an die eine große "Über-DB" weiter.
> Oder, um uns vielleicht Arbeit zu ersparen, könnte man vielleicht auch einfach gleich nur die eine große DB, die bereits Spalten für Produkte, Tätigkeiten, Zeit, etc. enthält, erstellen und dann eben die Daten aus den einzelnen Formularfeldern (dropdowns, checkboxen, whatever, ...) immer nur an die jeweilige Spalte in der großen DB übertragen.


Eventuell hilft es dir, das ganze mal in einem kleinen Diagramm darzustellen, in dem dein gesamtes Datenbankschema sichtbar ist.



boss3D schrieb:


> So eine "große DB" müsste es dann eben für jeden einzelnen User geben. Vielleicht sogar noch dynamisch erstellt, sobald sich dieser registriert.


Das ist ja mal völliger Quark. Es reicht doch einfach zu jeder Zeiterfassung die User-Id zu speichern um die Verbindung zwischen User und Datum herzustellen.


----------



## DarkMo (6. Juli 2014)

also mir scheint gerade auch, dass du eine völlig falsche vorstellung von datenbanken hast. da kann man rho nur unumstritten recht geben: für jedes pisselding ne eigene db? das is nich nur unnötig, das geht doch völlig am prinzip vorbei ^^ ich teile die hoffnung, dass du nicht db's meinst, sondern tabellen. du kannst in einer db doch zig tabellen erstellen. du kannst zwar mehrere db's per php ansteuern, aber wie gesagt - wozu? das lässt sich locker in einer db realisieren. nen grobes konzept (soweit ich das bisher blicke) könnte so aussehen:

EINE db mit namen zeiterfassung (zum bsp)
darin die folgenden tabellen mit stichpunktartig genannten spalten:

taetigkeiten
- id
- name

produkte
- id
- name (oder bezeichnung oder oder)

prod_taet
- id
- teatigkeit (per id)
- produkt (per id)

user
- id
- name
- pw (md5)
(- eventuell sowas wie status (admin, abteilungschef... ginge schon in richtung rechtesystem))

zeiten
- id
- teatigkeit (per id)
- produkt (per id)
- user (per id)
- bemerkung
- zeit
- datum
- erstellt


sinn des ganzen:
produkte und taetigkeiten sollte klar sein. erstmal grundsätzlich speichern, was es so gibt. das kann man dann für die dropdowns (selectboxen - hab bei meinem tabellen bsp glaube ausversehen normale inputs genommen) auslesen und diese damit befüllen. ändert wer was in der db, wird das automatisch und eben dynamisch übernommen. bsp code gabs ja auch schon. würde man dann halt die einzelnen <option> tags dynamisch generieren lassen.

prod_taet soll eine verknüpfung sein. da steht drin, welche produkte zu welche tätigkeiten gehören. wir haben meinetwegen eine tätigkeit klogang (taet id 1) mit dem produkt wurst (prod id 1), und ein weiteres dabei nutzbares produkt wäre.. naja, ne ^^ (prod id 2) dann würde in der tabelle eben stehen:
1 1 1 (tabellen id, teatigkeit mit id1 -> klogang, produkt mit id1 -> wurst)
2 1 2 (tabellen id, wieder teatigkeit mit id1 -> klogang, produkt mit id2 -> nuja)

hat man eine 2. tätigkeit und kann hier auch ne wurst als produkt nutzen, wäre das auch kein thema:
3 2 1

gut, man möge das blöde bsp verzeichen, aber mir wollte ums verr... nix besseres einfallen grad 

so, user betrifft dann schon ein loginsystem. ohne das, braucht man auch die tabelle nich. speichert halt den (login)namen und sein pw. kann man auch das registrierungsdatum und ggf persönliche einstellungen din speichern (also nich unbedingt relevant denk ich mal), aber so sollte es fürs gröbste völlig ausreichend sein.

jow, und zeiten erfasst halt die einzelnen einträge. also das ist quasi der kern der db. alles andere drum herum sind grundinfos szs. hier wird jetzt das gespeichert, was quasi auch in der excel tabelle steht. ein kleines organisatorisches prob ergibt sich aber (was ich beim tabellen bsp schon vermutet hatte): bei deinem bsp bild hast du in einer zeile teils 3 zeiteintragungen - das ginge mit diesem system nicht. eine zeile, eine zeit für ein datum. man könnte das jetzt nochmal aufbrechen, dass man die tätigkeit mit dem produkt und der bemerkung unter einer id speichert in der tabelle eintrag meinetwegen und das aus der tabelle zeiten rausnimmt. und in zeiten kommt dann wieder ein verweis zu eben jenem eintrag (per id) rein. dann kann man für einen eintrag auch mehrere zeiten für verschiedene daten speichern. müsste man dann aber irgendwie aufpassen, dass man ned für ein datum mehrere zeiten angeben kann oder so. aber das sind glaube feinheiten für später.


und wegen den dropdowns und javascript: du kannst es mMn auf 2 varianten lösen: entweder nimst du immer eine volle produkte-liste her und löscht selektiv alles, was nich zur tätigkeit passt, oder du baust für jede tätigkeit ein eigenes dropdown menü,  was du dann in ein div packst mit der id der tätigkeit, welches erstmal unsichtbar ist. wird eine tätikeit gewählt, änderst du einfach nur das entsprechende div (anhand der id) soweit ab, dass es sichtbar wird (und alle anderen unsichtbar). dat funzt jedenfalls ganz gut so ^^


----------



## TessaKavanagh (6. Juli 2014)

So mein Wochenende ist momentan etwas stressig, sodass ich noch nicht zum Basteln gekommen bin. Aber DarkMo hat dir ja einen vernünftigen Ansatz bezüglich Datenbanken geliefert. Hier muss aber m.E. noch ergänzt werden das eine Verschlüsselung der Passwörter mit md5 nicht ratsam ist. Ich würde hier ehr zu sha512 raten. Außerdem solltest du das Passwort mit einem hardgecodeten Salt verstärken. Zusätzlich benutzt du dann noch eine zufällig generierte Zeichenfolge(für jeden user) die du ebenfalls im Klartext in die DB speicherst (Das dient dazu das wenn zwei Nutzer das gleiche Passwort benutzen trotzdem ein einzigartiger Hash generiert wird.), so werden Angriffe mit Rainbow Tables nahzu unmöglich.


----------



## boss3D (6. Juli 2014)

OKay, vielen Dank! Dass ich in einer DB beliebig viele Tabellen haben kann, habe ich einfach nicht gewusst. Wenn's geht, dann kann ich natürlich den Ansatz von DarkMo verfolgen. 

@ Tessa
Klingt schlau, aber ich hebe mir das erstmal für später auf. Als erstes soll überhaupt erstmal das ganze Ding stehen und funktionieren, dann kümmere ich mich um die Feinheiten.
-------------

So hätte ich jedenfalls jetzt begonnen, das Formular möglichst ähnlich der Excel-Tabellen aufzubauen (die ganzen "a"s sind nur da, weil sonst die Zeile nicht vernünftig angezeigt würden), aber ich sehe immer noch nicht, wie ich da jetzt drum herum kommen soll, nicht für jedes Feld ein eigenes dropdown oder eine eigene textbox erstellen zu müssen. Was dazu führen würde, dass ich dann am Ende vielleicht ~50 solche html Elemente habe, die ich alle mühevoll einzeln per php ansprechen und auswerten müsste. 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Die schönste Version wäre es m. E., nur eine einzige Zeile zu erzeugen und darunter einen "+" Button oder irgendsowas einzufügen. Wenn der MA auf diesen klickt, kommt einer weitere Zeile hinzu. Aber da weiß ich wieder nicht, ob sich das so dynamisch realisieren lässt ...


----------



## DarkMo (6. Juli 2014)

na du baust doch schon wieder ne statische tabelle. das was ich dir gezeigt hatte (mit dem dynamischen teil bla) war doch genau das, was du im letzten satz meinst  wenn du die ganze sache frisch startest, dann hast du den tabellen kopf mit den spalten überschriften und gleich darunter die add-zeile - mehr nicht. addest du diese zeile, hast du eben wieder den tabellenkopf, gefolgt von deinem eintrag und dann erst die add-zeile.

du kannst die tabelle natürlich auch in der form hier präsentieren und füllst eben von oben her nur die mit zeugs, wo es was zu füllen gibt. also das die tabelle immer 20 zeilen (oder so hat), aber eben erstmal leer ist. die erste zeile wird gleich von der add-zeile belegt. addest du etwas, rückt die add zeile szs eins runter (danach wieder 18 leere zeilen) und davor ist die geaddete zeile.


----------



## boss3D (6. Juli 2014)

Das Bild war eh nur "symbolisch" gedacht. So wollte ich's eh nicht lassen ... 

Ich habe jetzt die EINE DB "projektzeiterfassung" mit allen von dir vorgeschlagenen Tabellen angelegt, allerdings kämpfe ich gerade damit, meinen Registriervorgang (eintragen.php) so abzuändern, dass die Daten (username, passwort), die ein MA eingibt, jetzt nicht mehr in DB "homepage" (Tabelle: users) landen, sondern in "projektzeiterfassung" (Tabelle: user). 

Eigentlich würde ich meinen, alles bedacht zu haben, aber ich kriege folgenden Error:


> *Warning*:  mysql_num_rows() expects parameter 1 to be resource, boolean given in *C:\xampp\htdocs\db\eintragen.php* on line *17*
> Fehler beim Speichern des Benutzernamens.




```
<?php
$verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");

mysql_select_db([COLOR=blue][B]"projektzeiterfassung"[/B]) or die ("Datenbank konnte nicht ausgewählt werden.");

$username = $_POST["username"];
$passwort = $_POST["passwort"];
$passwort2 = $_POST["passwort2"];

if ($passwort != $passwort2 OR $username == "" OR $passwort == "") {
    echo "Eingabefehler. Bitte alle Felder korrekt ausfüllen. <a href=\"eintragen.html\">Zurück</a>";
    exit;
}
$passwort = md5($passwort);

$result = mysql_query("SELECT id FROM [COLOR=blue][B]user[/B] WHERE username LIKE '$username'");
$menge = mysql_num_rows($result);

if ($menge == 0) {
    $eintrag = "INSERT INTO [COLOR=blue][B]user[/B] (username, passwort) VALUES ('$username', '$passwort')";
    $eintragen = mysql_query($eintrag);

    if ($eintragen == true) {
        echo "Benutzername <b>$username</b> wurde erstellt. <a href=\"login.html\">Login</a>";
    } else {
        echo "Fehler beim Speichern des Benutzernamens. <a href=\"eintragen.html\">Zurück</a>";
    }
} else {
    echo "Benutzername schon vorhanden. <a href=\"eintragen.html\">Zurück</a>";
}
?>
```
Bin gerade noch am googeln, wodurch das passieren könnte ...

[EDIT]
Hab's schon. Dafür bin ich jetzt bei ...


> *Notice*:  Trying to get property of non-object in *C:\xampp\htdocs\db\login.php* on line *16*
> Benutzername und/oder Passwort waren falsch.


... im nächsten Schritt.

[EDIT2]
So, auch erledigt. Dann schaue ich mir das jetzt mal mit der dynamischen Zeilenerstellung an ... 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Irgendwie so: Der Button soll ein php Script aufrufen, das nichts anderes macht, als eine Tabellen-Zeile gemäß dem Excel-Schema zu bauen.


----------



## DarkMo (6. Juli 2014)

wozu willst du denn irgendwelche externen scripte aufrufen? die hauptnutzung für sowas liegt eigentlich bei der ausgliederung von größerem code. zur separierung oder so. also bspw konstantendefinitionen/globals, oder meinetwegen funktionen, die nicht im hauptfile mit drin stehen sollen, damit die nicht alles zumüllen, oder eben auch klassen, die man als eigene php erstellt, um die übersichtlichkeit zu gewährleisten. doch aber nich um nen 2zeiler auszulagern.

hab dir btw mal ganz fix meine idee hardcoded erstellt (also plain html):



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



du hast einfach deinen tabellen kopf (erste zeile) ganz oben, dann eben die einträge aufgelistet, die schon in der db stehen (hier 2 lustige zeilen) und darunter eine weitere zeile, in der man einfach einen neuen datensatz anfügen kann - fertig. dahinter die entsprechenden buttons. das lässt sich alles in nen paar zeilen code bewerkstelligen, da muss man nix auslagern ^^ bin jetz aber auch gleich erstmal für nen tag nich da, daher nur sone larifari beispiel lösung.


----------



## XPrototypeX (6. Juli 2014)

@boss3D

soll ich dir mal eine mögliche Lösung in Java + GWT coden um dir zu zeigen wie eine wahrscheinlich bessere und schnellere Lösung aussehen könnte?


----------



## boss3D (6. Juli 2014)

@ DarkMo
Nur am Rande erwähnt: Die derzeit vorhanden Daten (also Excel-Dokumente) müssen nicht auch noch in die DB wandern. Die Lösung hier wird für zukünftige Daten (die aber nach dem selben Schema aufgebaut sein werden) entwickelt. Zeile 1 und 2 unterhalb des Headers in deinem Beispiel bräuchte es daher nicht. Zeile 3 sollte eigentlich gleich nach dem Header kommen, bzw. dann, wenn man auf meinen "neue Zeile einfügen" Button klickt.

Wie allerdings alleine die 3. Zeile ein "Zweizeiler" im Code werden soll, sehe ich nicht. ATM stelle ich mir das eher in Richtung 50 Zeilen vor, aber mal schauen.

@ XPrototypeX
Anschauen tue ich es mir gerne, wenn du es machen willst. Würde mich auch tatsächlich interessieren, aber ich glaube trotzdem nicht, dass mich was anderes vom aktuellen Ansatz abbringen wird.


----------



## TessaKavanagh (6. Juli 2014)

Vielleicht noch als Anmerkung. Die Befehle mysql_* sind in der Aktuellen PHP Version deprecated, die werden also zukünftig komplett entfernt. Wenn du dich also wirklich einarbeiten willst, solltest du zumindest nach dem Erstellen der Scripte alles auf mysqli_* oder PDO ändern. Der Vorteil an einem PDO Aufruf ist das du Ihn Datenbankübergreifend verwenden kannst. Die Syntax unterstützt nicht nur mysql -


----------



## boss3D (6. Juli 2014)

^^ Hab's gerade testweise überall geändert, aber nur damit ist es definitiv nicht getan. Da kommen dann Errors, dass plötzlich Parameter fehlen würden (während bei mysql ohne "i" alles funktioniert). Ich hebe mir das für später auf und bastle jetzt erstmal am dynamischen Einfügen von Zeilen weiter ...

[EDIT]
Ich krieg's gerade um's Verrecken nicht hin, dass meine beiden Buttons zu unterschiedlichen php Scripten führen. Beim "Bestätigen" Button soll das formular.php aufgerufen werden, das dann irgendwann dafür sorgen soll, dass alle Daten an die DB übertragen werden.
Und beim "Neue Eingabezeile hinzufügen" Button soll dynamictable.php aufgerufen werden, das die neue Zeile erstellt. 

In meinem html Dokument habe ich folgende Zeile:

```
<form action="formular.php" method="post">
```
Also komme ich sowieso erstmal zum formular.php.

Die beiden Buttons am Ende sind so eingefügt:

```
<div class="submit"><input type="submit" id="1" value="Neue Eingabezeile hinzufügen"></div><br>
<div class="submit"><input type="submit" id="2" value="Bestätigen"></div>
```
Die Entscheidung, welches php Script nun ausgeführt werden soll, habe ich daher in formular.php reingebastelt:

```
<?php
    if (isset($id) && ($id == 1)) {
        include('projektzeiterfassung2.php');
    } else {
        include('dynamictable.php');
    }
?>
```
Allerdings komme ich jetzt immer zu dynamictable.php, egal welchen der beiden Buttons ich drücke ... 

[EDIT2]
Jetzt hab ich's:

```
<?php
    if (isset($_POST['line'])) {
        include('dynamictable.php');
    } else {
        include('projektzeiterfassung2.php');
    }
?>
```
Über den Namen geht's, nicht über die id. Das muss man auch mal wissen ...

In dynamictable.php schreibe ich jetzt jedenfalls meinen Code rein, der EINE Zeile für die Tabelle erzeugt. Und dabei muss ich dann rausfinden, wie das nun wirklich läuft, dass in dropdowns der Inhalt bestimmter DB-Tabellen angezeigt wird.

[EDIT3]
Langsam nervt's! Jetzt merke ich gerade, dass dann meine neue Zeile nicht im html-File an den Header angehängt wird, sondern dann sinnlos in einem neu aufgerufenen php Script erstellt wird ...


----------



## Rho (6. Juli 2014)

Glückwunsch. Entwickelt sich bisher alles ja wie von mir vermutet. Dir Fehlt es einfach an jeder Ecke an Grundlagen. Sei es RDBMS, PHP, Javascript oder HTML.
Ich vermute mal, du hast dir zu dem Thema auch noch immer kein Bucher bzw. Bücher besorgt. Im Internet mal schnell nach etwas Suchen klappt super, aber nur wenn man schon eine Basis hat, auf der man aufbauen kann. Ansonsten führt das ganz schnell ins Chaos, weil man gar nicht wirklich versteht, was man da gerade an Code in sein Projekt kopiert hat.


----------



## TessaKavanagh (7. Juli 2014)

Das es mit MYSQLI_* nicht getan ist, sollte eigentlich klar sein. Das ist ja eine geänderten Syntax mit eigenen/neuen Funktionen .


----------



## boss3D (7. Juli 2014)

@ Rho
Ach, was ... alles halb so wild. Hab gerade DarkMo's Schleifen ein bisschen "kreativ umgestaltet" und schon hab ich mein dynamisches dropdown. 

```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");    
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
    
    echo '<select name="product">';
    foreach ($products as $product) {
        echo '<option value="'.$product['produkt'].'">'.$product['produkt'].'</option>';        
    }
    echo '</select>';
?>
```
Jetzt brauche ich halt noch das gleiche für Tätigkeiten und dann muss ich mir eben überlegen, wie ich's schaffe, dass die neue Zeile mit den dropdowns im html Dokument unterhalb des Headers eingefügt wird, anstatt auf einer neuen Seite ...

BTW: Für ~3 Wochen Arbeit ein ~50 € Buch besorgen kommt mir ein bisschen "overkill" vor. Das kann ich dann machen, wenn ich mal ein weitaus umfangreicheres Projekt zu diesem Thema machen muss (was aber in naher Zukunft nicht der Fall sein wird).

@ Tessa
Wie gesagt: Sobald überhaupt erst mal alles steht und läuft, kümmere ich mich dann gerne um die Feinheiten.

[EDIT]
Na bitte ...

```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");    
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }
    
    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
        
    echo '<select name="taetigkeit">';
    foreach ($taetigkeiten as $taetigkeit) {
        echo '<option value="'.$taetigkeit['taetigkeit'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
    echo '</select>';
    
    echo '<select name="product">';
    foreach ($products as $product) {
        echo '<option value="'.$product['produkt'].'">'.$product['produkt'].'</option>';
    }
    echo '</select>';  
    
    echo '<input name="beschreibung" type="text" size="50" maxlength="250">';
    
    echo '<input name="montag" type="text" size="10" maxlength="5">';
    echo '<input name="dienstag" type="text" size="10" maxlength="5">';
    echo '<input name="mittwoch" type="text" size="10" maxlength="5">';
    echo '<input name="donnerstag" type="text" size="10" maxlength="5">';
    echo '<input name="freitag" type="text" size="10" maxlength="5">';
    echo '<input name="samstag" type="text" size="10" maxlength="5">';
    echo '<input name="sonntag" type="text" size="10" maxlength="5"><br><br>';
?>
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## boss3D (7. Juli 2014)

So, und hier ist das Teil auch schon:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Bin ich doch noch zu der "Ehre" gekommen, mich mit Javascript zu befassen. 

```
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Projektzeiterfassung</title>
[COLOR=royalblue]<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }
    
    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
    }
</script></head> 
<body>
<form action="formular.php" method="post">
    <br><h1>Projektzeiterfassung</h1>
    <table>
        <tr>
            <th>Tätigkeit</th>
            <th>Produkt</th>
            <th>Beschreibung</th>
            <th>MO</th>
            <th>DI</th>
            <th>MI</th>
            <th>DO</th>
            <th>FR</th>
            <th>SA</th>
            <th>SO</th>
    </table><br>    
    [COLOR=royalblue]<div id="content"></div>
    <div class="submit"><a href="javascript:setRequest()">Neue Eingabezeile hinzufügen</a></div><br>    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form>
</body>
</html>
```
Jetzt muss ich nur noch irgendwie rausfinden, wie ich das href in einen html-Button einbauen kann (sodass das auch funktioniert. Bisschen rumprobiert hätte ich ja schon). Einen Link will ich nicht haben ...

Ach ja, und wie ich die Breite der dropdowns und texareas "dynamisch" angeben kann. Sodass die gleich breit wie die zugehörigen Tabellen Header werden. Aber mit CSS komme ich ja nicht zum dynamictable.php Script?!

[EDIT]
Ah, ok. Mehr ist's nicht ... 

```
<div class="submit"><input type="button" [COLOR=royalblue]onClick="javascript:setRequest()" value="Neue Eingabezeile hinzufügen"></div><br>
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## TessaKavanagh (7. Juli 2014)

Du Kannst alles mir CSS Formatieren unabhängig davon wo der Code steht. Ich persönlich erstelle einfach eine style.css und binde diese per include am Anfang des Scriptes. Dann hast du in jedem Dokument Zugriff auf deine zentral definierten CSS Formate. Warum packst du die "neue" Zeile nicht in die selbe Tabelle wie den Header? dann passt sich diese direkt an den Header an.

Als letzte Zeile verwendest du einfach die Dropdowns und Eingabefelder (jeweils in einer eigenen Zelle der Tabelle) und Schon ist alles gleichmäßig groß.

<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Projektzeiterfassung</title>
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();

        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }

    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
    }
</script>
</head> 
<body>
<form action="formular.php" method="post">
    <br><h1>Projektzeiterfassung</h1>
    <table>
        <tr>
            <td>Tätigkeit</td>
            <td>Produkt</td>
            <td>Beschreibung</th>
            <td>MO</td>
            <td>DI</td>
            <td>MI</td>
            <td>DO</td>
            <td>FR</td>
            <td>SA</td>
            <td>SO</td>

</tr>



hier gibst du jetzt einfach den Inhalt der Datenbank per PHP aus. (Dabei erzeugst du keine neue Tabelle sondern lediglich die richtigen zeilen und "spalten" also <tr><td>Inhalt</td><td>Inhalt</td></tr><tr><td>Inhalt2</td><td>Inhalt2</td></tr>  usw.) Als kleiner Tipp wenn du das Anzeigen einer Zelle erzwingen willst bietet sich   an. Das ist ein erzwungenes Leerzeichen 



    </table><br>    
    <div id="content"></div>
    <div class="submit"><a href="javascript:setRequest()">Neue Eingabezeile hinzufügen</a></div><br>
    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form>
</body>
</html>


----------



## boss3D (7. Juli 2014)

TessaKavanagh schrieb:


> Warum packst du die "neue" Zeile nicht in die selbe Tabelle wie den Header? dann passt sich diese direkt an den Header an.


 An das hätte ich schon gedacht, aber da kommt nichts vernünftiges dabei raus, weil er dann die eine Zeile als Ganzes unter das erste Header-Feld stellt:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Drum hätte ich jetzt probiert, das ganze unabhängig vom Header zu formatieren, aber _style="whatever"_ direkt im html Dokument zeigt keine Wirkung und über CSS könnte ich nur auf _<div id="content"></div>_ zugreifen, wenn ich dem Teil auch noch _class="scr"_ hinzufüge. Aber auch dabei kommen nur verpfuschte Versionen dessen raus, was ich habe möchte ...

[EDIT]
Kann sein, dass wir bei deinem EDIT eh ans selbe denken, aber ich hätte vorgehabt, den User erstmal nur Zeile für Zeile, so viel er eben braucht, seine Daten eingeben zu lassen. Dann soll er auf "Bestätigen" klicken. Der Button führt ihn dann zu einer zweiten Seite, wo ihm eine Tabelle mit seinen ausgewählten/eingegeben Daten angezeigt wird. Hier kann er wiederum bestätigen --> Daten werden in DB geschrieben, ODER er kann auf einen "Edit" Button klicken und kommt wieder zurück zu Tabelleneingabe, wo hoffentlich noch seine Daten angezeigt werden sodass er diese editieren kann.

Ich denke, du meinst genau das, nur eben das User-Ergebnis auch gleich auf der Daten-Eingabeseite ausgeben?!

Bevor ich das angehe, würde ich aber noch gerne zwei kleine Problemchen beheben:
1) Eben die optische Anpassung dieser dynamischen Zeile an den statischen Header
2) Bei Klick auf den neue-Zeile-Button soll jedes weitere Mal eine weitere neue Zeile kommen. ATM tut sich bei leerer Zeile nichts und bei ausgefüllter wird einfach nur der Inhalt gelöscht. Was soll ich da machen? Ich denke so in Richtung Endlosschleife mit if/break, auch wenn ich noch nicht konkret weiß, wie und was ...


----------



## TessaKavanagh (7. Juli 2014)

Ja weil du es falsch machst. Du musst jedes Feld der "Zeile" in eine eigene Tabellenspalte schreiben  also jedes Input Feld in ein <td>Inhalt</td> setzen  oder die gesamte Zeile mit colspan="10" als Attribut versehen.


----------



## boss3D (7. Juli 2014)

Und genau das geht eben nicht, weil ich nur dieses eine Teil habe:

```
<tr><td><div id="content"></div></td></tr>
```
^^ Das hier fügt die gesamte Zeile ins html-Dokument ein.

Am ehesten würd's helfen, irgendwie "stretch Zeile to Bildschirmbreite" sagen zu können (es soll ja schön dynamisch werden, wie auch der Header in dieser Hinsicht). Aber außer "center" greift in CSS nichts von dem, was ich bisher probiert habe.


----------



## TessaKavanagh (7. Juli 2014)

Also jetzt mal für Dumme warum geht das nicht?

Du ersetzt also <div id="content"> durch die ganzen Inputfelder richtig?

<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");    
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }


echo '<form action="formular.php" method="post">';
echo '<br><h1>Projektzeiterfassung</h1>';
echo '<table>';
echo '<tr>';
echo '<td>Tätigkeit</td>';
echo '<td>Produkt</td>';
echo '<td>Beschreibung</td>';
echo '<td>MO</td>';
echo '<td>DI</td>';
echo '<td>MI</td>';
echo '<td>DO</td>';
echo '<td>FR</td>';
echo '<td>SA</td>';
echo '<td>SO</td>';
echo '</tr>';

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

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

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

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

Einfach so ersetzen bitte.

Dazu zusätzlich folgenden Code nutzen:


    <div id="content"></div>

<br>
    <div class="submit"><a href="javascript:setRequest()">Neue Eingabezeile hinzufügen</a></div><br>
    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form>


----------



## boss3D (7. Juli 2014)

^^ Mit exakt diesem/deinem Code kriege ich das hier raus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Da sind ja meine Versuche noch näher dran ...


----------



## TessaKavanagh (7. Juli 2014)

Habe den Code oben jetzt nochmal editiert. Jetzt muss es eigentlich gehen probiere es bitte nochmal.


----------



## boss3D (7. Juli 2014)

Das wird eher schlimmer als besser ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Vergessen wird das erstmal und kümmern wir uns bitte darum:
Bei Klick auf den neue-Zeile-Button soll jedes weitere Mal eine weitere  neue Zeile kommen. ATM tut sich bei leerer Zeile nichts und bei  ausgefüllter wird einfach nur der Inhalt gelöscht. Was soll ich da  machen? Ich denke so in Richtung Endlosschleife mit if/break, auch wenn  ich noch nicht konkret weiß, wie und was ...                         

Die Optik kann ich am Ende des Projekts immer noch richten.


----------



## TessaKavanagh (7. Juli 2014)

und nochmal Edit des Codes oben jetzt aber hoffe ich 

bezüglich des neuen Problems sehe ich nirgendwo eine Funktion die die Daten in die Datenbank schreibt. Außerdem sehe ich keine Funktion die entsprechenden Daten aus der Datenbank zu einer Zeile auszugeben. Folglich kann da m.E. nichts passieren.


----------



## boss3D (7. Juli 2014)

Jein ...

Header und Zeile hängen zusammen und erscheinen beide erst beim Klicken auf den Link, der eigentlich ein Button sein sollte. Ansonsten würd's optisch okay ausschauen, aber wenn die Zeile jetzt am Header hängt, wie willst du dann weitere Zeilen OHNE Header anfügen?

Wie gesagt: Lassen wir das lieber vorerst und kümmern uns bei meinem ursprünglichen Code um das Einfügen weiterer Zeilen.


----------



## TessaKavanagh (7. Juli 2014)

PHP ist Dynamisch. Du bindest die Ausgabe der Datenbank Daten einfach im Script zwischen Header und Abschlusszeile ein. Damit erscheint jede neue Zeile entsprechend zwischen dem Header und der Abschlusszeile, da sehe ich kein Problem da du einfach eine Zeile zwischen den bereits vorhandenen Einfügst.


----------



## DarkMo (7. Juli 2014)

boss3D schrieb:


> @ DarkMo
> Nur am Rande erwähnt: Die derzeit vorhanden Daten (also Excel-Dokumente) müssen nicht auch noch in die DB wandern. Die Lösung hier wird für zukünftige Daten (die aber nach dem selben Schema aufgebaut sein werden) entwickelt. Zeile 1 und 2 unterhalb des Headers in deinem Beispiel bräuchte es daher nicht. Zeile 3 sollte eigentlich gleich nach dem Header kommen, bzw. dann, wenn man auf meinen "neue Zeile einfügen" Button klickt.


 ich glaube, du missverstehst mich hier ganz gewaltig und tessa und ich versuchen dir seit ein paar seiten im grunde das selbe zu erzählen ^^

diese besagten 2 zeilen sind KEINE alten daten. aber ich mein - wie kann man das nich verstehn sry ^^ bin grad etwas am ende mit meinem latein. das gezeigte bsp ist quasi der stand einer "frischen installation" mit leerer db PLUS schon 2 gemachten einträgen. ich mein, irgendwann füllt sich nunmal die db, und das muss angezeigt werden. das sollte also quasi nur beispielhaft eine ansicht sein, die man nach 2 gemachten einträgen sieht. besser kann ichs nicht erklären :/

also du beginnst mit einer leeren tabelle, die sich mit jedem gemachten eintrag füllt. und hier wurden halt schon 2 einträge gemacht.


und nochmal wegen dem folgenden:
wozu willst du irgendwelche anderen php dateien erstellen? wenn du das in ne funktion auslagerst - mag ja sein. aber alles andere ist doch unnötig. du brauchst an und für sich NUR diese eine datei (bei dir wohl formular.php genannt). im jetzigen stadium ist das völlig ausreichend.

gut, nächster punkt: wieso funtzen die buttons nicht. bzw wieso kann ich die nicht unterscheiden... die haben keine namen. die id nutzt nix, die brauchen einen namen (name="*edit*" -> if(isset($_POST['*edit*'])) echo 'editieren'; ).

wegen der tabelle: mir scheints so, als würdest du laufend neue tabellen erstellen, statt die eine (mit dem festen tabellenkopf) einfach weiter zu nutzen. das geht doch ganz easy:

```
<table>
  // tabellenkopf
  <tr>
    <td>Tätigkeit</td><td> // ... usw usf
  </tr>
  // der dynamische teil, mit der ausgabe der schon eingetragenen daten
  <tr>
    // sql anfrage (einträge)...
    while($row...) <td>$row[Teatigkeit]</td><td> // ... usw usf
  </tr>
  // die zeile zum adden EINES neuen datensatzes
  <tr>
    <td><select...>
    // sql-anfrage (tätigkeiten)...
    while($row...) <option value="$row[ID]">$row[Name]</option>
    </select></td>
    <td> // ... usw usf
  </tr>
</table>
```
mehr ist das doch garnicht.


----------



## TessaKavanagh (7. Juli 2014)

So stelle ich mir das in etwa vor. Der Code ist mit dem Editor erstellt und die Datenbank Struktur war mir nichtganz klar, das müsstest du also überprüfen. Aber das Ablaufschema sollte im Prinzip funktionieren 


```
<?php

$verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden"); 
mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

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

$products = array();
$sql_p = "SELECT * FROM produkte;";
$res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
if (mysql_num_rows($res_p))
while ($row_p = mysql_fetch_assoc($res_p)) {
$products[count($products)] = $row_p;
}

if(isset($_POST['submit'])){$submit = $_POST['submit'];}else{$submit = 0;}

switch ($submit) {
    case 0:
        // Normale Ausgabe

echo '<form action="formular.php" method="post">';
echo '<br><h1>Projektzeiterfassung</h1>';
echo '<table>';
echo '<tr>';
echo '<td>Tätigkeit</td>';
echo '<td>Produkt</td>';
echo '<td>Beschreibung</td>';
echo '<td>MO</td>';
echo '<td>DI</td>';
echo '<td>MI</td>';
echo '<td>DO</td>';
echo '<td>FR</td>';
echo '<td>SA</td>';
echo '<td>SO</td>';
echo '</tr>';

	// Abfrage der Datenbank + Erstellen der Tabellenzeilen
	
	$sql = "zeiten";
	$nr = 1;

	$abfrage = "SELECT * FROM `$sql`";
	$ergebnis = mysql_query($abfrage);
	while($row = mysql_fetch_object($ergebnis))
   	{
   	if($ergebnis->teatigkeit != "" AND $ergebnis->teatigkeit != 0)
	{
	echo "<tr><td>".$ergebnis->taetigkeit."</td><td>".$ergebnis->produkt."</td><td>".$ergebnis->beschreibung."</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>";
	}
	else
	{
	

echo "<tr><td><select name='taetigkeit_".$nr."'>";

foreach ($taetigkeiten as $taetigkeit) {
echo '<option value="'.$taetigkeit_".$nr."['taetigkeit'].'">'.$taetigkeit_".$nr."['taetigkeit'].'</option>';
}
echo '</select></td>';

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

echo '<td><input name="beschreibung_".$nr." type="text" size="50" maxlength="250"></td>';
echo '<td><input name="montag_".$nr."" type="text" size="10" maxlength="5"></td>';
echo '<td><input name="dienstag_".$nr." type="text" size="10" maxlength="5"></td>';
echo '<td><input name="mittwoch_".$nr." type="text" size="10" maxlength="5"></td>';
echo '<td><input name="donnerstag_".$nr." type="text" size="10" maxlength="5"></td>';
echo '<td><input name="freitag_".$nr." type="text" size="10" maxlength="5"></td>';
echo '<td><input name="samstag_".$nr." type="text" size="10" maxlength="5"></td>';
echo '<td><input name="sonntag_".$nr." type="text" size="10" maxlength="5"></td></tr>


$nr++;
	}


   	}


	// Ende Abfrage der Datenbank + Erstellen der Tabellenzeilen



</table><br><br>';

<br>

<div class="submit"><input type="hidden" name="submit" value="2"><input type="submit" name="confirm" value="Bestätigen"></div>
</form>
<form>
<div class="submit"><input name="insert_count" type="text" size="2" maxlength="2"><input type="hidden" name="submit" value="1"><input type="submit" name="add_new" value="Neue Zeilen Hinzufügen"></div>
</form> 


	// Ende Normale Ausgabe
        break;
    case 1:
	// Neue Zeilen hinzufügen        

$sql = "zeiten";
$insert_count = $_POST['insert_count']

$result = mysql_query("SELECT COUNT(id) FROM `$sql`");
$count_id_tmp = mysql_fetch_row($result);
insert_count = $count_id_tmp[0];
$id++;

for($a = 1; $a <= $insert_count; $a++)
{
$eintrag = "INSERT INTO `§sql`
(id, teatigkeit, produkt, bemerkung)
VALUES
('$id', '', '','')";

$eintragen = mysql_query($eintrag);
$id++;
}
unset($_POST['submit']);


	// Ende Neue Zeilen hinzufühen
        break;
    case 2:
        // Daten in Datenbank Eintragen

$nr = 1;
$sql = "zeiten";

$abfrage = "SELECT id FROM `$sql` WHERE taetigkeit = ''";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
   {
   
	$id = $row->id;

$taetigkeit = $_POST['taetigkeit'];
$product = $_POST['product'];
$beschreibung = $_POST['beschreibung'];


$aendern = "UPDATE `$sql` Set taetigkeit = $taetigkeit WHERE id=$id";
$update = mysql_query($aendern);

$aendern = "UPDATE `$sql` Set product = $product WHERE id=$id";
$update = mysql_query($aendern);

$aendern = "UPDATE `$sql` Set beschreibung = $beschreibung WHERE id=$id";
$update = mysql_query($aendern);


$nr++;
   

}

unset($_POST['submit']);





	// Ende Daten in Datenbank Eintragen
        break;






?>
```


----------



## DarkMo (7. Juli 2014)

nutz doch einfach den code-tag oder gar den php tag. da bleiben einrückungen erhalten und bei php-tag gibts sogar syntax highlight


----------



## XPrototypeX (7. Juli 2014)

Also ich hab mal während Dr. House gucken ne Stunde Zeit gefunden. 

Die Anwendung kann auf btn drück Zeilen erstellen. Jede Spalte ist editirbar und die Daten der Tabelle können auf Knopfdrück zum Server gesendet werden. 

Die Anwendung hat 2 Methoden um mit den Server zu kommunizieren. LoadData (Beim start wird die ausgeführt und liefert eine liste an Daten zurück die z.B aus einer DB kommen) und eine SaveData Methode um die Daten der Tabelle auf den Server zu senden und dort zu speichern. Die war.7z muss auf einem tomcat deployed werden. Dazu einfach die war Datei in WebAnwendung umbennen und das 7z in eine zip Datei wandeln und nach .war umbennen. Tomcat entpacken und die .war unter WebApps einfügen. Dann die startup.bat im ordner /bin ausführen. Im browser dann localhost/WebAnwendung aufrufen. Ist praktisch ein anderes XAMPP. 

Um den src dode zu nutzen braucht ihr eclipse mit dem gwt plugin. Wenn ihr das habt erstellt ein neues GWT Projekt mit dem namen WebApp und überschreibt den src ordner mit dem angehängten. So sollte alles auf die schnelle sein.


----------



## Rho (7. Juli 2014)

Einfach großartig. Immer wieder unterhaltsam. Darf man Fragen, was du eigentlich studierst und in welchem Semester du bist?



boss3D schrieb:


> BTW: Für ~3 Wochen Arbeit ein ~50 € Buch besorgen kommt mir ein bisschen "overkill" vor. Das kann ich dann machen, wenn ich mal ein weitaus umfangreicheres Projekt zu diesem Thema machen muss (was aber in naher Zukunft nicht der Fall sein wird).



Ja, Bücher sind echt Overkill. Da stehen so viele Details und Erklärungen drin. Am Ende versteht man vielleicht sogar noch ein bischen von dem, was man macht. Lieber weiterhin fleißig Code-Stücke zusammenkratzen und notdürftig anpassen, in der Hoffnung, dass dann irgendwann mal irgendwie alles funktionieren möge. Mal ganz abgesehen davon, dass das Buch und das Wissen, das du dir damit aneignest ja nicht nur für dieses eine Projekt gültig sind. Oder hast du danach nie wieder vor irgendetwas in der Richtung zu machen?

Im Übrigen bezweifle ich langsam, dass dir drei Wochen reichen werden.



XPrototypeX schrieb:


> Die war.7z muss auf einem tomcat deployed werden. Dazu einfach die war Datei in WebAnwendung umbennen und das 7z in eine zip Datei wandeln und nach .war umbennen. Tomcat entpacken und die .war unter WebApps einfügen. Dann die startup.bat im ordner /bin ausführen. Im browser dann localhost/WebAnwendung aufrufen. Ist praktisch ein anderes XAMPP.



Ich habe so meine Zweifel, dass er diese "Hürde" nehmen wird. Falls er es überhaupt versucht.


----------



## XPrototypeX (7. Juli 2014)

Naja der COde ist vielleicht nicht unbedingt Anfänger freundlich. Man könnte aber eine Menge dabei lernen. Diese Hürden es einzurichten hat man einmal dann kann man es immer wieder verwenden. Allerdings muss man es wollen. Ich würde tippen er studiert wirtschaftsinformatik.


----------



## boss3D (8. Juli 2014)

DarkMo schrieb:


> ich mein, irgendwann füllt sich nunmal die db, und das muss angezeigt werden.


Okay, jetzt weiß ich, was du meinst. Ich hätte allerdings nicht vorgehabt, dem MA bei neuen Eingaben auch immer alles anzuzeigen, das er schon in seiner DB stehen hat. Deswegen haben mich die Zeilen irritiert. 
Meine Idee wäre gewesen, den MA im Formular ausschließlich Daten eingeben zu lassen und ihm nach Klick auf "Bestätigen" seine gesamte DB anzuzeigen.


DarkMo schrieb:


> und nochmal wegen dem folgenden:
> wozu willst du irgendwelche anderen php dateien erstellen? wenn du das in ne funktion auslagerst - mag ja sein. aber alles andere ist doch unnötig. du brauchst an und für sich NUR diese eine datei (bei dir wohl formular.php genannt). im jetzigen stadium ist das völlig ausreichend.


Ja, hast eh recht, aber für mich persönlich ist es derzeit noch leichter, alles möglichst zu "zerteilen". Klingt jetzt vielleicht etwas paradox, aber so weiß ich, dieser Code in diesem File macht genau das, und jener in diesem anderen File genau das, etc. ... Wenn ich einen langen Code (vielleicht auch noch ein Gemisch aus html, php und Javascript) habe, verliere ich bei dem Zeug hier den Überblick. Ich hätte eher zum Schluss dann probiert, alles zusammenzufügen, das man zusammenfügen kann.


DarkMo schrieb:


> gut, nächster punkt: wieso funtzen die buttons nicht. bzw wieso kann ich die nicht unterscheiden


Bei mir machen beide genau das richtige. Mein Problem ist, dass sie allerdings nur 1 Mal funktionieren. Bei "Bestätigen" ist das ja noch egal, aber beim anderen Button kann ich so keine weiteren Zeilen einfügen.

Die beiden Codes von euch schau ich mir jetzt an.
----------

@ Rho
Mein Studium tangiert Datenbanken und Webseitenerstellung nur im Entferntesten. Wir hatten es gerade so "umfangreich", dass ich mich überhaupt noch erinnern konnte, da gab's ja was mit Apache und phpmyadmin ...
In meinem restlichen Studium werde ich damit auch sicher nichts mehr zu tun haben. Im Berufspraktikum auch nicht und im Arbeitsleben später kann ich es mir auch kaum vorstellen. Deswegen hole ich mir jetzt auch nicht für 3 Wochen Arbeit sauteure Bücher.

Und nein, es ist nicht Wirtschaftsinformatik. 

@XPrototypeX
Danke, ich schau's mir so bald ich Zeit habe an, aber wie gesagt: Ich bleibe bei der aktuellen Lösung über html und php. Sonst wäre ja jetzt schon eine Woche Arbeitszeit für nichts gewesen und ich würde wieder mind. eine weitere in die Einarbeitung in was ganz neues verlieren.


----------



## boss3D (8. Juli 2014)

@ Tessa
Dein Code hat mind. einen Syntaxfehler in Zeile 63, den ich um's Verrecken nicht anfinde. Irgendein " gehört durch ein , oder ; ersetzt, zumindest laut Fehlermeldung.


----------



## TessaKavanagh (8. Juli 2014)

```
echo "<tr><td><select name='taetigkeit_".$nr."'>";
```
// Das ist bereits geänderter Code ersetze mal Zeile 63 in der Hoffnung das ich richtig gezählt habe^^

könnte es diese Zeile gewesen sein? Wie ich sagte der Code ist weder getestet noch stimmen die SQL Abfragen mit deiner DB überein fürchte ich.

Das größte Problem ist für mich grade Zeile 63 zu identifizieren vielleicht kannst du mir die Zeile einfach mal komplett posten?.


----------



## boss3D (8. Juli 2014)

Die Zeile:

```
echo '<option value="'.$taetigkeit_".$nr."['taetigkeit'].'">'.$taetigkeit_".$nr."['taetigkeit'].'</option>';
```
_PS: Notepad++ wäre da sehr hilfreich bei den Zeilennummern.
_
Es waren übrigens auch sonst zig Syntaxfehler drinnen, aber ich denke/hoffe, alle anderen haben ich erwischt. Werden wir wissen, wenn der hier noch weg ist.

[EDIT]
Die Fehlermeldung ist ja auch völlig wirr. Ich kann ja nicht mitten in eine option-Zeile ein Komma oder einen Strichpunkt reingeben?!


----------



## DarkMo (8. Juli 2014)

wie gesagt, mit ' und " muss man aufpassen ^^ nutzt man " und will im string auch ein " schreiben, muss man es escapen. bsp:

```
echo 'anneli sagte "hallo" zu mir'; // will man " verwenden, ' bei echo nutzen
echo "Rene's neues Auto war toll"; // mit ' eben umgekehrt
echo "Beim Anblick von Rene's Auto dachte ich mir "Tolle Felgen""; // dat wird dann nix, da bei Tolle Felgen der string beendet wurde und er verlangt ein ; bspw
echo "Beim Anblick von Rene's Auto dachte ich mir \"Tolle Felgen\""; // daher: escapen ( \ davorschreiben, wie bei \n für newline...)
```


----------



## TessaKavanagh (8. Juli 2014)

Das wäre es wohl, aber ich habe hier momentan im wahrsten Sinne des Wortes nur Editor und Word2012 zur Verfügung.


```
echo "<option value='".$taetigkeit_.$nr."[\'taetigkeit\']'>".$taetigkeit_.$nr."[\'taetigkeit\']</option>";
```

Hoffe das passt jetzt. Du musst aber beachten das der Fehler vermutlich noch in anderen Zeilen vorliegt.


----------



## boss3D (8. Juli 2014)

Na, dass ist ja wieder ein Sch*** ...

```
echo "<option value="\'.$product_".$nr."[\'produkt\'].\'">'.$product[\'produkt\'].\'</option>";
```


```
[B]Parse error[/B]:  syntax error, unexpected ''.$product_".$nr."[\'produkt\'' (T_CONSTANT_ENCAPSED_STRING), expecting ',' or ';'
```
BTW: Wieso steht taetigkeit_ bei dir eigentlich nur so da, während $produkt_ mit $ eine Variable ist?

[EDIT]
Habe jetzt alle Fehler draußen, 7 Zeilen waren es. Aber jetzt blöde Frage: Was mache ich jetzt eigentlich mit dem Code? Ich habe den in meine dynamictable.php eingefügt, aber die Buttons machen gar nichts vernünftiges. 

Und auf der Webseite schaut's auch nicht so toll aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Wenn ich im html die <table> lösche, ist aber gleich gar nichts mehr da. Weder das grüne, noch das weiße. Und was ist mit dem Javascript? Drinnen lassen oder auch raus? Ich blicke bei dem ganzen Chaos gar nicht mehr durch wie die ganzen Codes zusammenhängen ...
----------------

Eigentlich hätte ja meine Lsg schon ganz das richtige gemacht, wenn ich es nur noch geschafft hätte, dass der neue-Zeile-Button mehr als einmal benutzbar ist. Aber deinen Code jetzt wieder in meinen integrieren ... da kommt echt nur noch Pfusch raus dabei.

Kann mir nicht einfach wer verraten, ob's für Buttons auf html Seiten sowas wie ein Reset gibt, sodass der seine Funktion danach wieder ausführen kann? Wäre mir immer noch das liebste, wenn ich an meinem Code weiterbasteln könnte. Den verstehe ich wenigstens.


----------



## TessaKavanagh (8. Juli 2014)

Siehe editierten Code oben  Damit solltest du ja dann auch in der Lage sein den Code bei product entsprechend anzupassen. Du musst ja nur abschreiben. Ich nehme an du hast den Code kopiert während ich am editieren war


----------



## DarkMo (8. Juli 2014)

ich finds irgendwie spannender, wie du einen button hinbekommst, der nur einmal funzt xD kannste deine php (bzw du hast ja mehrere) mal zippen? ich müsst ja eigentlich lernen, aber irgendwie intressierts mich doch ^^


----------



## TessaKavanagh (8. Juli 2014)

Ich nehme an das er die neue Zeile nirgendwo speichert. Dann kannst du den Button so oft klicken wie du willst  und im Ergebnis wirst du immer genau eine neue Zeile sehen nämlich die deren $_POST[''] Werte übertragen wurden. Weil ja die jetzt "alte" neue Zeile im neu aufgerufenen Script nicht wieder übergeben wird und nur eine genau eine neue erstellt wurde 

Ergo sieht es so aus als würde der Button nicht funktionieren. Er funktioniert aber wie geplant, nur das das Ergebnis hiervon die gleiche Seite ist wie die Seite zuvor.


----------



## boss3D (8. Juli 2014)

@ DarkMo



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



@ TessaKavanagh
Wie soll ich denn die ganze Zeile speichern? Ein $_POST[''] habe ich im gesamten Code gar nicht drinnen. In ne Variable kann man die ganze Zeile vermutlich nicht speichern?!


----------



## wbtprof (8. Juli 2014)

boss3D schrieb:


> Hallo!
> Für mich ist das absolutes Neuland. Ich habe mich nie wirklich mit Datenbanken, html oder PHP beschäftigt und habe auch keinerlei Programmier-Erfahrungen damit.



Das ist ja wohl so nicht korrekt. Neuland ist vielleicht das Internet für die deutsche Kanzlerin, aber wenn du das DBA2 oder das WBT2 Skriptum aufschlagen würdest könntest du die Aufgabe spielend lösen.

Grüße,
wbtprof


----------



## Rho (8. Juli 2014)

boss3D schrieb:


> Mein Studium tangiert Datenbanken und Webseitenerstellung nur im Entferntesten. [...] In meinem restlichen Studium werde ich damit auch sicher nichts mehr zu tun haben. Im Berufspraktikum auch nicht und im Arbeitsleben später kann ich es mir auch kaum vorstellen.


Wenn die ganze Thematik praktisch gar nichts mit deinem Studium und deiner beruflichen Zukunft zu tun hat, frage ich mich, warum man dich überhaupt mit dieser Aufgabe betraut hat. Man sagt der Putzfrau ja schließlich auch nicht, sie soll mal eben die Buchhaltung machen. Oder rechnet die Firma etwa gar nicht mit einem brauchbaren Ergebnis?

Du hättest dir die Themen DB und Webseitenerstellung übrigens weitgehend vom Hals halten könne, wenn du auf die Vorschläge eingegangen wärst und nicht stur diesen zum scheitern verurteilten PHP-Weg eingeschlagen hättest. Von Java verstehst du ja angeblich was.



boss3D schrieb:


> Und nein, es ist nicht Wirtschaftsinformatik.


Sondern? Malen nach Zahlen?


----------



## TessaKavanagh (9. Juli 2014)

So ich habe mehrere Punkte:

Punkt 4 kommt zuerst weil es mich jetzt mal brennend Interessiert  

4. @ WBTPROF

Du/Sie bist/sind nicht zufällig ein Dozent unseres Themenerstellers oder? und er belegt nicht zufällig auch genau die für das Projekt "nötigen" Kurse bei dir/Ihnen? Das ganze ist nicht rein zufällig auch noch eine Seminararbeit oder der gleichen? Wobei PHP eine Vorgabe der Aufgabenstellung ist? xD

1. Mein o.g. Code ist eigenständig, das heißt er sollte in keiner Weise in deinen Code integriert werden sondern als eigenständiges PHP Dokument "funktionieren". Ich schreibe bewusst "funktionieren" weil selbst wenn du den Code eigenständig ausführen würdest, müssten in der Datenbank immer noch die richtigen Tabellen mit den im Code Verwendeten Tabellennamen angelegt werden (sonst kann es nicht funktionieren).

Wie gesagt versuch mal ohne Testen und ohne Syntax Highliting im Editor einen fehlerfreien Code zu schreiben  Denn der blöde Word Standart Editor ist nicht grade eine Optimale Programierumgebung.

2. Ich versuche mal das Problem mit deinem "Button" auf eine ganz Simple Grundproblematik herunter zu brechen:


```
/*
Zu Beginn deines Scripts steht in deinem Quelltext <div="content">Ich bin ein Platzhalter</div>

Der Benutzer bekommt also "Ich bin ein Platzhalter" im Browser ausgegeben. 
*/

/*Dein JavaScript Code ist ein asynchroner Aufruf (AJAX) die Website wird also ohne neu laden verändert.
Deine Programmlogik besagt jetzt wenn du den Button klickst soll in der bestehenden angezeigten  Webseite im Bereich <div id="content"> Ich bin ein Platzhalter </div> der Gesamte Inhalt von <div id="content"></div> durch <tr><td>Hier steht die Tabellenzeile</td></tr> ersetzt werden.
Der Quellcode Lautet danach */
<div id="content"><tr><td>Hier steht die Tabellenzeile</td></tr></div>

/* Der Benutzer sieht entsprechend "Hier steht die Tabellenzeile" im Browser 

Wenn jetzt der Button zum zweiten mal angeklickt wird, dann wird in der bestehenden Website der Code wieder der gesamte Inhalt von <div id="content"><div> durch das Ergebnis der Erneuten AJAX Abfrage ersetzt.

aus <div id="content"><tr><td>Hier steht die Tabellenzeile</td></tr></div>
wird also <div id="content"><tr><td>Hier steht die Tabellenzeile</td></tr></div>

Das Ergebnis im Browser sieht für den Nutzer also genau so aus wie vorher. Der Button hat aber auch beim zweiten mal funktioniert. Die Logik im Code ist jedoch nicht dazu geeignet das gewünschte Ergebnis nämlich:
<div id="content"><tr><td>Hier steht die Tabellenzeile</td></tr><tr><td>Hier steht noch eine Tabellenzeile</td></tr></div>

zu erreichen.
Du müsstest den Code also entsprechend Anpassen das für den Fall das <div id="content"> bereits einen Inhalt hat dieser auch bestehen bleibt. z.B. "Nehme Inhalt aus <div id='Content>' ->speichere in Variable 'ausgabe' hänge das Ergebnis des http requests hinten an "ausgabe" an -> ersetze den Inhalt von<div id='content'></div> durch 'ausgabe' " 

*/
```

3. Das Problem ist m.E. das du versuchst Code 1 zu 1 zu kopieren ohne das du wirklich verstehst was dieser Code eigentlich macht/machen soll. Um sich in PHP, MYSQL, HTML einzuarbeiten muss man auch nicht zwangsweise ein Buch kaufen, es gibt auch im Internet genug Tutorials die einem die Grundlagen der Syntax und Logik beibringen können. Die Informationen sind zwar häufig veraltet, im Ergebnis würde das alles aber für dein Projekt reichen. Im Grundprinzip ist nämlich auch dein Projekt nicht mehr als eine Shoutbox, halt nur mit mehreren Eingabefeldern. 

Vermutlich könntest du dich 14 Arbeitstage in das Thema einlesen (die du nicht brauchen würdest) und das ganze dann am 15 Tag vormittags programmieren.


----------



## boss3D (9. Juli 2014)

TessaKavanagh schrieb:


> Du/Sie bist/sind nicht zufällig ein Dozent unseres Themenerstellers oder? und er belegt nicht zufällig auch genau die für das Projekt "nötigen" Kurse bei dir/Ihnen? Das ganze ist nicht rein zufällig auch noch eine Seminararbeit oder der gleichen? Wobei PHP eine Vorgabe der Aufgabenstellung ist?


K. A. welcher von diesen Leuten sich hinter dem Nick verbirgt, aber laut seiner Aussage soll er wohl mein Prof gewesen sein. Wie dem auch sei, das Fach ist bei mir lange genug her um nicht mehr alles taufrisch im Kopf haben zu müssen und ich habe mich seitdem auch nie wieder mit dieser Materie beschäftigen müssen. Außerdem ist der werte Herr "damals" auch noch wochen-/monate(?)lang aus gesundheitlichen Gründen ausgefallen sodass wir eh kaum zu was gekommen sind. 

Jedenfalls gehe ich hier mit niemandem mein Studium diskutieren. Es handelt sich definitiv NICHT um irgendeine Arbeit, die ich fürs Studium oder ein damit verbundenes Praktikum machen müsste, aber das habe ich bereits mindestens einmal geschrieben. Warum die in dieser Firma mich für die Aufgabe ausgewählt haben weiß der Kuckuck. Sind hier alles ITler, aber keiner mit mehr Ahnung in Datenbankerstellung als ich. So gesehen hätte es jeden treffen können, ich bin's geworden. Also versuche ich jetzt einfach, die Aufgabe nach bestem Wissen und Gewissen zu erledigen. Wer mir dabei konstruktiv helfen will, ist herzlich willkommen.
---------------

Deinen Code schaue ich mir jetzt gleich mal an, danke.


----------



## TessaKavanagh (9. Juli 2014)

Wie gesagt du benötigst für den Code mindestens die Tabelle "zeiten" mit den Spalten id / product / taetigkeit /beschreibung

und irgendwo im Code steht mal "produkt" habe ich grade gesehen das müsste natürlich auch "product" heißen.


----------



## boss3D (9. Juli 2014)

^^ Nein, ich meine den Beispielcode in deinem vorigen Posting. Ich will das jetzt mal mit der (mehrfachen) Zeilenerstellung hinkriegen ...


----------



## TessaKavanagh (9. Juli 2014)

```
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }
    
    function interpretRequest() {
        var ContNeu= request.responseText;
        var ContAlt = document.getElementByID('content').innerHTML;
        var content = ContAlt + ContNeu;
        document.getElementById('content').innerHTML = content;
    }
</script>
```

Ist jetzt geraten^^


----------



## boss3D (9. Juli 2014)

"new" kannst du, glaube ich, nicht als Variablenname nehmen, weil das ein Java(script) Schlüsselwort ist. Stattdessen z. B. "newContent". Jedenfalls passiert jetzt beim Klicken des Buttons nichts mehr. Ich weiß aber noch nicht, an welcher Zeile es scheitert.

[EDIT]
Das ist ja eh das gleich wieder, nur mit anderen Variablennamen?! Geht wieder nicht. Die erste Zeile scheint noch zu funktionieren, zumindest kann ich mir da den gesamten Tabellen-Code mit _alert(request.responseText) _anzeigen lassen. Aber danach tut sich nichts mehr, auch anzeigen nicht möglich.


----------



## TessaKavanagh (9. Juli 2014)

Code oben ist Editiert probier es mal jetzt. Habe es mit folgendem Grundprinzip getestet.


```
<html><head><title>Test</title>
<script type="text/javascript">

var Neu = "neuer <b>fetter<\/b> Text";
function Aendern () {
var old = document.all.meinAbsatz.innerHTML;
var save = old + Neu;
document.all.meinAbsatz.innerHTML = save;

}
</script>
</head><body>
<p id="meinAbsatz">Text</p>
<a href="javascript:Aendern()">Anderer Text</a>
</body></html>
```


----------



## boss3D (9. Juli 2014)

Ich habe bereits den editierten Code gemeint. Wenn ich's jetzt noch richtig in Erinnerung habe, war der aber eh vorher auch schon gleich, nur mit anderen Variablennamen?! Bist du dir eigentlich bei dem old + Neu sicher, dass man das einfach so addieren kann?


----------



## TessaKavanagh (9. Juli 2014)

Ja bin ich siehe den getesteten Beispielcode im Post von 9:28. Speicher den einfach mal als HTML Dokument und teste es. Das + Verketten die Variablen.


----------



## boss3D (9. Juli 2014)

Ja, als html funktioniert's. Komisch.

Ich bastle jetzt gerade am Code, der die Dateneingabe-Zeile auswertet und die Daten in die richtigen Tabellen in der DB einträgt. Den sollte ich dann ja leicht für weitere Zeilen wiederverwenden können, wenn wir das mal hinkriegen ...


----------



## TessaKavanagh (9. Juli 2014)

Mal getestet ob er sich vielleicht wirklich nur an dem NEW in der Variable aufhängt? Habe deswegen die Namen mal auf Neu und Alt geändert


----------



## DarkMo (9. Juli 2014)

was versucht ihr hier eigentlich gerade? krampfhaft ajax gelumbe? versteh den sinn gerade nich so sehr ^^


----------



## TessaKavanagh (9. Juli 2014)

Das AJAX gelumbe wie du es nennst hat er doch schon seit Anfang an in seinem Code und es ist dafür verantwortlich das sein mehr als eine Zeile erstellen nicht funktioniert . 

Ist jetzt nicht böse gemeint, aber realistisch gesehen wird es eine rein auf PHP/MYSQL basierende und funktionierende Lösung nur dann geben wenn jemand den vollständigen PHP Code und die Datenbank von Grund auf neu schreibt und beides hier zum Download bereitstellt.


----------



## DarkMo (9. Juli 2014)

rein php ohne ajax langt doch völlig. das ajax bringt doch nur noch mehr durcheinander wie eh schon *denk* einfach das formular bauen, also die tabelle mit der eingabezeile und beim buttondrücken wird die seite neu geladen, die formulardaten abgefragt und in die db gespeichert, woraufhin beim tabellenaufbau ganz automatisch plötzlich die neue zeile da rumgammelt. wieso muss man sichs da so unnötig kompliziert machen?


----------



## boss3D (9. Juli 2014)

@ Tessa
Nein, der Code geht einfach nicht. Und ich werd's schon hinkriegen, auch ohne dass mir wer eine Komplettlösung gibt, die ich weder jemals verlangt habe, noch haben wollen würde.

Jedenfalls bin ich im "Auswertungs-Code" gar nicht mehr so weit weg:

```
<?php    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $username = $_POST["username"];
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];
    $timestamp = time();
    $erstellt = date("d.m.Y", $timestamp);
    
    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$username'");
    $menge = mysql_num_rows($result);
    
    if ($menge == 0) {
        $eintrag_1 = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, erstellt) VALUES ('$taetigkeit', '$produkt', '$username', '$beschreibung', '$erstellt')";
        $eintragen = mysql_query($eintrag_1);
        if (isset($_POST["montag"])) {
            $montag = $_POST["montag"];
            $eintrag_2 = "INSERT INTO zeiten (datum) VALUES ('$montag')";
            $eintragen = mysql_query($eintrag_2);
        }
        if (isset($_POST["dienstag"])) {
            $dienstag = $_POST["dienstag"];
            $eintrag_3 = "INSERT INTO zeiten (datum) VALUES ('$dienstag')";
            $eintragen = mysql_query($eintrag_3);
        }
        if (isset($_POST["mittwoch"])) {
            $mittwoch = $_POST["mittwoch"];
            $eintrag_4 = "INSERT INTO zeiten (datum) VALUES ('$mittwoch')";
            $eintragen = mysql_query($eintrag_4);
        }
        if (isset($_POST["donnerstag"])) {
            $donnerstag = $_POST["donnerstag"];
            $eintrag_5 = "INSERT INTO zeiten (datum) VALUES ('$donnerstag')";
            $eintragen = mysql_query($eintrag_5);
        }
        if (isset($_POST["freitag"])) {
            $freitag = $_POST["freitag"];
            $eintrag_6 = "INSERT INTO zeiten (datum) VALUES ('$freitag')";
            $eintragen = mysql_query($eintrag_6);
        }
        if (isset($_POST["samstag"])) {
            $samstag = $_POST["samstag"];
            $eintrag_7 = "INSERT INTO zeiten (datum) VALUES ('$samstag')";
            $eintragen = mysql_query($eintrag_7);
        }
        if (isset($_POST["sonntag"])) {
            $sonntag = $_POST["sonntag"];
            $eintrag_8 = "INSERT INTO zeiten (datum) VALUES ('$sonntag')";
            $eintragen = mysql_query($eintrag_8);
        }
        
        if ($eintragen == true) {
            echo "Daten wurden in Datenbank geschrieben";
        } else {
            echo "Fehler beim Speichern der Daten. <a href=\"projektzeiterfassung1.html\">Zurück</a>";
        }
    }
?>
```
Liefter in der DB:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Mein if-Konstrukt für die Wochentage hat wohl noch einen Logikfehler, der erstmal nur unnötige Zeilen in der DB produziert. Wieso das Datum als 20.07.2009 ausgelesen wird, weiß ich auch noch nicht, finde ich aber noch raus ...


----------



## TessaKavanagh (9. Juli 2014)

Frag nicht mich, meinen Lösungsansatz mit PHP findest du 1-2 Seiten vorher. Allerdings wären auch da sicherlich noch Code Anpassungen nötig. Vielleicht teste ich Ihn Zuhause mal sobald ich Zeit finde, momentan ist alles neben der Arbeit zeitlich etwas stressig.

Edit: Du fragst ab Dienstag  nurnoch Dienstage ab anstelle von allen Wochentagen Also ändere nach $_POST['Dienstag'] den nächsten auf $_POST['Mittwoch'] 


Außerdem Stehen hinter VALUES bei dir alle Variablen in '  ' das Führt dazu das keine Zahlen sondern strings in die DB geschrieben werden. Je nachdem wie deine Datenbank Felder also Formatiert sind z.B. DATE oder INT kann die Tabellenzelle diese Daten gar nicht speichern.

Ich nehme an davon sind /zeit/ Datum /erstellt /User betroffen

Als Verbesserung lässt sich noch anmerken das du das Ganze auch auf ein Insert für alle Tage zusammen verkürzt werden kann in dem Montag bis Sonntag aus einem Array mit Wochentagen dynamisch in die SQL Funktion eingesetzt wird.


```
$wochentage = array();
$wochentage[] = "montag";
$wochentage[] = "dienstag";
$wochentage[] = "mittwoch";
$wochentage[] = "donnerstag";
$wochentage[] = "freitag";
$wochentage[] = "samstag";
$wochentage[] = "sonntag";

for($a = 0; $a < 7; $a++)
{
if (isset($_POST[$wochentage[$a]]) AND $_POST[$wochentage[$a]] != "") {
            $tag = $_POST[$wochentage[$a]];
            $eintrag = "INSERT INTO zeiten (datum) VALUES ($tag)";
            $eintragen = mysql_query($eintrag);
                                                      }
}
```

Es kann sein das in der Klammer beim POST ['$wochentag[$a]'] stehen muss, bin ich mir grade nicht sicher.

Beachten musst du auch das INSERT immer eine NEUE Zeile anlegt. Willst du in eine bestehende Zeile etwas Einfügen musst du den Befehl UPDATE verwenden und mit WHERE angeben in welche Zeile du etwas einfügen willst.

EDIT:

Die Bedigung isset($_POST["Montag - Sonntag"]) ist immer erfüllt sobald du das Formular absendest. Deswegen musst du abfragen Ob ein Inhalt da ist oder das Feld leer also "" ist.

Das Ergebnis daraus sollte sein das genau soviele Zeilen zusätzlich in die Db eingetragen werden wie du Wochentagsfelder im Formular mit Inhalt gefüllt hast.


----------



## boss3D (9. Juli 2014)

TessaKavanagh schrieb:


> Außerdem Stehen hinter VALUES bei dir alle Variablen in '  ' das Führt dazu das keine Zahlen sondern strings in die DB geschrieben werden. Je nachdem wie deine Datenbank Felder also Formatiert sind z.B. DATE oder INT kann die Tabellenzelle diese Daten gar nicht speichern.


Es funktioniert aber nur mit ' '. Ohne werden keine Daten in die DB geschrieben. 


TessaKavanagh schrieb:


> Als Verbesserung lässt sich noch anmerken das du das Ganze auch auf ein Insert für alle Tage zusammen verkürzt werden kann in dem Montag bis Sonntag aus einem Array mit Wochentagen dynamisch in die SQL Funktion eingesetzt wird.


Ja, das if-Konstrukt habe ich eh schon wieder rausgeschmissen. Da muss was besseres her. 

ATM kämpfe ich damit, den name des eingeloggten Users  aus der user-Tabelle auszulesen und in die zeit-Tabelle reinzuschreiben. Aber da kriege ich bis jetzt nur "Resource id #5". Vielleicht eh wegen dem ' '-Problem, das du oben erwähnt hast?!


----------



## TessaKavanagh (9. Juli 2014)

Mit was für einem Code Schnipsel versuchst du herauszufinden welcher User eingeloggt ist? Poste den bitte mal.  Arbeitest du mit Sessions um die Identität des Users auf andere Seiten zu übertragen?


----------



## boss3D (9. Juli 2014)

User trägt sich (erst- bzw. einmalig) in die DB ein:

```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $username = $_POST["username"];
    $passwort = $_POST["passwort"];
    $passwort2 = $_POST["passwort2"];

    if ($passwort != $passwort2 OR $username == "" OR $passwort == "") {
        echo "Eingabefehler. Bitte alle Felder korrekt ausfüllen. <a href=\"eintragen.html\">Zurück</a>";
        exit;
    }
    $passwort = md5($passwort);

    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$username'");
    $menge = mysql_num_rows($result);

    if ($menge == 0) {
        $eintrag = "INSERT INTO user (name, passwort) VALUES ('$username', '$passwort')";
        $eintragen = mysql_query($eintrag);

        if ($eintragen == true) {
            echo "Benutzername <b>$username</b> wurde erstellt. <a href=\"login.html\">Login</a>";
        } else {
            echo "Fehler beim Speichern des Benutzernamens. <a href=\"eintragen.html\">Zurück</a>";
        }
    } else {
        echo "Benutzername schon vorhanden. <a href=\"eintragen.html\">Zurück</a>";
    }
?>
```
Und ich versuche mir hier den namen zu holen und in eine andere Tabelle zu schreiben:

```
$sql_u = "SELECT name FROM user;";
    $res_u = mysql_query($sql_u) or die ("Get User failed.<br>".mysql_error());
    
...

    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$res_u'");
    $menge = mysql_num_rows($result);
    
...

    if ($menge == 0) {
        $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, erstellt) VALUES ('$taetigkeit', '$produkt', '$res_u', '$beschreibung', '$erstellt')";
        $eintragen = mysql_query($eintrag);
```
Über sessions habe ich schon was gelesen, war mir aber nicht sicher, ob ich das jemals brauchen würde ...

[EDIT]
Wenn ich folgende Zeile hinzufüge, kriege ich immerhin die korrekte User-ID in die andere Tabelle geschrieben. Ich will aber den Namen.

```
$user = mysql_num_rows($res_u);
```


----------



## TessaKavanagh (9. Juli 2014)

Sessions benutzt du immer dann wenn du Daten von einer Seite auch auf einer anderen Seite wieder brauchst.
Also User loggt sich mit Name + Passwort ein -> dabei wird eine SessionID generiert. Diese wird beim Aufruf einer neuen Seite mit übergeben. Auf der neuen Seite wird geprüft ob eine SessionID vorliegt. -> SessionID liegt vor, also handelt es sich um den eingeloggten USER.

Die SessionID kannst du z.B. auch temporär in die Datenbank speichern. Dann kannst du über

```
$result = mysql_query("SELECT name FROM user WHERE sessionid LIKE '$sessionid");
    $menge = mysql_num_rows($result);
```

Den Namen abfragen. Wobei ich noch nicht ganz verstehe warum du den Namen in der Datenbank speichern willst und nicht einfach die User id als sekundärschlüssel. Das hätte z.B. auch den Vorteil wenn du de Nutzernamen "Ändern" würdest z.B. nach einer Hochzeit würde der Name automatisch in allen anderen Einträgen mitgeändert. Da du dir bei der Ausgabe den Namen immer über die ID aus der User Tabelle ziehst und diesen nicht "fest als Text" bei jedem Eintrag in der Zeittabelle speicherst.


----------



## DarkMo (9. Juli 2014)

wozu? die id ist eindeutig und über diese kann man auch den namen wieder bekommen.

select * from zeiten, user where zeiten.id = user.id; (grob)


----------



## boss3D (9. Juli 2014)

Die id des Eintrags in zeiten mit der user-id zu vergleichen (du meintest doch eigentlich == , oder?) bringt gar nichts, die sind niemals gleich. Mein user "test" hätte bspw. id 1, mein aktuellster Eintrag in zeiten ist schon bei id 140 ...


----------



## DarkMo (9. Juli 2014)

ja is klar. ich meinte ja auch die eingetragene user-id in der zeiten tabelle und ned die primär-id.

edit: btw, das = statt == stimmt schon. bei sql wird so verglichen.


----------



## boss3D (9. Juli 2014)

Jetzt steig ich aus ... was meinst du?

Ich habe nur das hier:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



id in user ist "1" für "test", und id in zeiten geht derzeit von "139" weg aufwärts ...
(Die id in zeiten is BTW die id des Zeilen-Eintrages)


----------



## DarkMo (9. Juli 2014)

na bei dir würde es halt user heißen. also zeiten.user = user.id. da speicherst eben nicht test bei zeiten.user sondern eben dessen id - die 1. dann solltest du über $row['name'] den usernamen ausgeben können (anstelle von $row['user']).


----------



## TessaKavanagh (9. Juli 2014)

Brechen wir es mal ganz einfach runter. 

Du hast in deiner Datenbank zwei Tabellen.

Eine Tabelle heißt "User"
Eine Tabelle heißt "Zeiten"

Die id ermöglicht dir eine eindeutige Zuordung innerhalb der jeweiligen Tabelle (sogenannter Primärschlüssel).

Die Spalte id der Tabelle "Zeiten" (bei dir ca 1-140) identifiziert jetzt also die 140 Einträge in der Tabelle "Zeiten".
Die Spalte id der Tabelle "User" (Bei 10 Nutzern also 1-10) identifiziert jetzt also diese 10 Nutzer Einträge in der Tabelle "User".

Außerdem hat deine Tabelle "Zeiten" auch eine *Spalte* "User" (das ist der sogenannte Sekundärschlüssel).

Wenn jetzt also der Nutzer der in der Tabelle "User" in Zeile 1 steht den 141 Eintrag in der Tabelle "Zeiten" erstellt, dann trägst du in der Tabelle "Zeiten" in der *Spalte* "User" die Zahl "1" ein, denn diese 1 ist gleichzeitig die Id die dem Nutzer in der Tabelle "User" zugeordnet worden ist.

Wenn du dann später herausfinden möchtest wer den Eintrag erstellt hast fragst du im ersten Schritt per MYSQL in der Tabelle "Zeiten" die *Spalte* "User" ab. Das Resultat dieser Abfrage lautet 1. Im Zweiten Schritt fragst du dann in der Tabelle "User" die Spalte "Name" ab und zwar an der stelle wo die ID = 1 ist. 
Als Resultat erhälst du hierdurch den Namen des Nutzers der den Eintrag in Tabelle "Zeiten" erstellt hat.


----------



## boss3D (9. Juli 2014)

^^ Das verstehe ich, aber egal wie ich den Code jetzt zusammenbastle, ich kriege nie den Namen als Text raus. Entweder es kommt wieder "Resource id #5" oder seit Neuem jetzt "0" ... 

Beim Erstelldatum kämpfe ich auch immer noch. In jedem Tutorial liest man, dass das hier der richtige Code dafür wäre:

```
$timeget = time();
$erstellt = date("d.m.Y", $timeget);
```
Aber ich kriege damit immer den 20.07.2009 raus und habe keine Ahnung, wo zur Hölle dieses Datum herkommt.


----------



## DarkMo (9. Juli 2014)

Datum = NOW(); xD datum wird ein timestamp per spaltendefinition und als wertezuweisung beim insert oder so, gibste ganz einfach NOW() an. das ganze klappt auch mit date statt timestamp, wenn ichs richtig verstanden hatte. ich hatte mir vorhin auch mal dein zip angeschaut, da sind ja html's und php's wild gemischt - hä? ich hatte mit EINER php gerechnet xD jedenfalls blick ich da garnich durch sry :/


----------



## boss3D (9. Juli 2014)

Bei meinen ganzen Files hättest du mit localhost/eintragen.html beginnen müssen, dann hätten sich die Seiten der Reihe nach aufgerufen bzw. dich weitergeleitet ...
----------

[EDIT]
Mein manuell eingegebenes Datum landet noch nicht in der DB, vermutlich weil irgendwelche Formate nicht zusammenpassen?! In der DB habe ich DATE ausgewählt und eingegeben wird's auf der html Seite in eine textbox, also vermutlich als String?! Kann das gehen?


----------



## DarkMo (9. Juli 2014)

ok, frage: WAS soll bei dir date sein? so wie du es angelegt hast, soll es einfach die zeit sein, zu der der eintrag erstellt wurde oder? und wenn dem so ist, dann gibt man da rein garnix auf der seite an ^^ dann speicherst du einfach nur den jetzigen timestamp. also quasi so:

```
INSERT INTO <tabelle>
    (..., Datum)
VALUES
    (...,
    NOW());
```
da wird nix übergebenes reingespeichert. rufst dabei einfach die sql-interne funktion now auf, und der macht das dann schon.


----------



## TessaKavanagh (9. Juli 2014)

Willst du nicht das aktuelle Datum sondern ein anderes, baust du dir einfach mit mktime() einen Timestamp zusammen und speicherst diesen in einer INT in die Datenbank, den Timestamp kannst du dann bei der Ausgabe mit date() in jedes beliebige Format bringen.


----------



## boss3D (9. Juli 2014)

Du meinst "datum"?

In der DB-Tabelle "zeiten" habe ich u. a. "datum" und "erstellt". 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ "datum" ist das, was der User neben den Tageskürzeln eingeben kann. "erstellt" ist das Datum, an dem der MA das Formular ausgefüllt hat.

Und bei mir will er ums Verrecken nicht das Datum in die DB schreiben. Ich habe schon probiert: VARCHAR, DATE, DATETIME, TEXT
Im Code sehe ich keinen Fehler ...

```
<?php    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = mysql_query("SELECT * FROM zeiten, user WHERE zeiten.user = user.id;");    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array();
    $stunden[] = "montag";
    $stunden[] = "dienstag";
    $stunden[] = "mittwoch";
    $stunden[] = "donnerstag";
    $stunden[] = "freitag";
    $stunden[] = "samstag";
    $stunden[] = "sonntag";
    
    $datum = array();
    $datum[] = "mo";
    $datum[] = "di";
    $datum[] = "mi";
    $datum[] = "do";
    $datum[] = "fr";
    $datum[] = "sa";
    $datum[] = "so";
    
    $erstellt = date('d-m-Y');

    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$user'");
    $menge = mysql_num_rows($result);
    
    if ($menge == 0) {
        $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$erstellt')";
        $eintragen1 = mysql_query($eintrag);
    }
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "") {
            $dauer = $_POST[$stunden[$a]];
            $eintrag = "INSERT INTO zeiten (zeit) VALUES ($dauer)";
            $eintragen = mysql_query($eintrag);
        }
        if (isset($_POST[$datum[$a]]) and $_POST[$datum[$a]] != "") {
            $tag = $_POST[$datum[$a]];
            $eintrag = "INSERT INTO zeiten (datum) VALUES ($tag)";
            $eintragen = mysql_query($eintrag);
        }
    }
        
    if ($eintragen == true) {
        echo "Daten wurden in Datenbank geschrieben";
    } else {
        echo "Fehler beim Speichern der Daten. <a href=\"projektzeiterfassung1.html\">Zurück</a>";
    }
?>
```
@ Tessa
Am einfachsten wär's wohl, das Datum einfach als String auszulesen und auch so abzuspeichern. Aber das funktioniert nicht so, wie ich mir das vorgestellt hätte, falls es überhaupt geht?!


----------



## DarkMo (9. Juli 2014)

aahso. gut, dann meine ich mit now() bla die erstellt spalte. datum würde ich dann mit dem erwähnten mktime lösen.

generell würde ichs dann in etwa so aufbauen: beim tabellen aufbau ermittelst du den aktuellen tag und berechnest davon ausgehend, welche woche angezeigt werden muss und zusätzlich noch min und max timestamp der woche (also timestamp von mo um 0uhr bis timestamp von so um 24uhr. diese timestamps nutzt du zum auslesen der db einträge. also als filter variablen (where datum >= min and datum < max...). dann kannste das noch sortieren nach tätigkeit und produkt und so versuchen alle einzeleinträge (pro tätigkeit/produk-kombo können ja 7 einträge existieren - 7 zeiten) in einer zeile zusammen zu fassen. irgendwie so.


----------



## boss3D (9. Juli 2014)

Ne, automatisieren will ich das lieber nicht (aktuelle Woche anhand des aktuellen Datums ermitteln). Das gäbe dann Schwierigkeiten, wenn ein MA nachträglich Daten von letzter Woche oder noch früher eingeben will. Ich glaube nicht, dass ich davon ausgehen kann, dass die MAs immer brav ihre Daten am Ende des Tages oder der Woche eingeben ...

Außerdem habe ich ehrlich gesagt wenig Lust, mir für mktime wieder was kompliziertes zu basteln, das mir den eingegebenen String (?) "23.06.2014" (als Beispiel) in 23, 6 und 2014 zerlegt. 
Es müsste ja doch möglich sein, das einfach gleich als String zu speichern?!


----------



## DarkMo (9. Juli 2014)

ja gut, dachte das wäre selbsterklärend, dass man dann durch die wochen switchen kann ^^ aber so eine liste ist mMn eben besser/übersichtlicher.


----------



## TessaKavanagh (9. Juli 2014)

Du kannst einen Timestamp in ein Datum Formatieren und umgekehrt. Dafür gibt es in PHP fertige funktionen. Wenn du den String z.B. als 23.06.2014 in die variable $data speicherst kannst du ihn mit:


```
$datum = explode(".", $data)
```

in die Bestandteile 23, 4 und 2014 zerlegen. Der . wird dann als Trennzeichen genutzt.


----------



## boss3D (10. Juli 2014)

^^ Soweit der Code, aber durch die explode()-Zuweisung wird $datum offenbar zu einem array umgewandelt, das ich dann aber als String einzutragen versuche?! Blaue Zeile:

```
$data = array();
    $data[] = "mo";
    $data[] = "di";
    $data[] = "mi";
    $data[] = "do";
    $data[] = "fr";
    $data[] = "sa";
    $data[] = "so";

    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {
            $tag = $_POST[$data[$a]];
            $datum = explode(".", $tag);
            [COLOR=royalblue]$eintrag = "INSERT INTO zeiten (datum) VALUES ($datum)";            $eintragen = mysql_query($eintrag);
        }
    }
```
Wie sollte ich das am besten lösen? Mit VALUES ('$datum[$a]') kriege ich zwar den error weg, aber es wird wieder kein Datum in die DB geschrieben ...

[EDIT]
So könnte man den error (eigentlich Notice) auch wegbringen, aber in die DB wird dennoch nichts eingetragen, also muss der Fehler noch wo anders liegen?

```
$datum = implode(explode(".", $tag));
```
In der Tabelle "datum" habe ich jedenfalls DATE als Typ eingestellt. Sollte ich da was anderes wählen?

[EDIT2]
Okay, mit VARCHAR kriege ich meinen Eintrag, aber ohne Punkte. _*seufz*_


----------



## TessaKavanagh (10. Juli 2014)

Wieso packst du denn das explode() jetzt da in den Code o.0

Explode dient dazu einen String also z.B. "24.6.2014 "Anhand des Trennzeichens "." in die Bestandteile 24 und 6 und 2014 zu zerlegen.
Das Ergebnis ist ein Array mit den Indizis 0-2 und den jeweiligen werten. Das macht in dem Code oben vollkommen keinen Sinn, da du ja alles in eine Tabellenzelle schreiben möchtest.

Soweit ich das jetzt verstanden habe möchtest du das Datum im Format "tt.mm.jjjj" in die Datenbank eintragen richtig?

Wenn ja dann formatier bitte die Spalte "datum" in der Datenbank mal als "var char".

Des Weiteren gib doch bitte den Inhalt von einer der $_POST['mo - so'] variablen per echo aus damit ich sehen kann wie der Inhalt dieser formatiert ist und ob hier ggf. noch eine Umformung erfolgen muss.



> [EDIT]
> So könnte man den error (eigentlich Notice) auch wegbringen, aber in die DB wird dennoch nichts eingetragen, also muss der Fehler noch wo anders liegen?
> 
> PHP-Code:
> ...



Implode verbindet die Einträge eines Arrays zu einem String, Explode teilt einen String anhand eines festgelegten Zeichens in ein Array. 
Die Schreibweise 
	
	



```
implode(exlode("Trennzeichen",$variable));
```
 Neutralisiert sich also gegenseitig.


[Edit 2:]
Wenn ich jetzt raten soll und implodeexplode() bei dir zum Ergebnis 24062014 führt,  dann muss in der POST bereits 24.06.2014 stehen, da Explode sonst nicht funktionieren würde. 


Lösch also einfach die Zeile explode und das ganze sollte laufen.


----------



## boss3D (10. Juli 2014)

Da kommt ja so oder so nur Käse raus:

```
$data = array();
    $data[] = "mo";
    $data[] = "di";
    $data[] = "mi";
    $data[] = "do";
    $data[] = "fr";
    $data[] = "sa";
    $data[] = "so";
    
    $datum = array();
    for ($a = 0; $a <= 2; $a++) {
        $datum[$a] = explode(".", $data);
    }
```
[EDIT]

```
echo "{$_POST['mo - so']}";
```
liefter


> *Notice*:  Undefined index: mo - so


----------



## TessaKavanagh (10. Juli 2014)

```
$data = array();
    $data[] = "mo";
    $data[] = "di";
    $data[] = "mi";
    $data[] = "do";
    $data[] = "fr";
    $data[] = "sa";
    $data[] = "so";

    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {
            $tag = $_POST[$data[$a]];
            $eintrag = "INSERT INTO zeiten (datum) VALUES ('$tag')";
            $eintragen = mysql_query($eintrag);
        }
    }
```

Natürlich meinte ich das 


```
echo $_POST['mo'];
```
 oder 
	
	



```
echo $_POST['di'];
```
oder
	
	



```
echo $_POST['so'];
```
     und wenn du das Ausgibst trage bitte auch etwas in die Spalte die du per echo Ausgibst ein damit ein Inhalt vorliegt x-D


----------



## boss3D (10. Juli 2014)

Kommt das raus:


> 12.04.2003


Stimmt also. Das eigentliche Problem ist ja, das nun auch in dieser Form in die DB zu kriegen ...
[EDIT]

```
echo $tag;
```
 zeigt auch genau das an. Ich vermute, dass der Fehler nicht im Code, sondern beim Typ in der Tabelle liegt?! VARCHAR bringt jetzt natürlich nichts, DATE geht aber auch nicht. ???

Übrigens würde sich DATE das Datum in umgekehrter Schreibweise erwarten.


----------



## TessaKavanagh (10. Juli 2014)

Siehe code von mir im letzten Post Copy&Paste

[EDIT]

Wobei ich nicht denke, das du die Zeit wirklich als neue Zeile haben willst oder?

[Edit 2]

Da  stand noch einmal $tag und einmal $Datum, muss natürlich zweimal $tag oder zweimal $datum heißen

und VARCHAR ist schon OK und wird funktionieren.


----------



## boss3D (10. Juli 2014)

Damit kriege ich ein Datum in die DB rein, aber wieder ein falsches. Ich habe im Formular 12.04.2003 für MO eingegeben, in der DB steht jetzt aber 20.04.2014 ???

Dass alles in der selben Zeile landet, darum kümmere ich mich nachher dann noch mit UPDATE WHERE, wie von dir gestern vorgeschlagen.


----------



## TessaKavanagh (10. Juli 2014)

Wenn du es als Date formatierst erwartet er einen Timestamp. Du speicherst aber einen String also nimm bitte VarChar.


----------



## boss3D (10. Juli 2014)

Okay, als nächstes möchte ich jetzt alles in der selben Zeile haben,  aber da habe ich bei UPDATE WHERE das Problem, dass ich in der Zeile  keinen einzigen festen Wert habe außer der internen id, die der MA aber  nie sieht. Was soll ich jetzt also für WHERE nehmen?

```
for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "") {
            $dauer = $_POST[$stunden[$a]];
            $eintrag = "UPDATE zeiten SET zeit=$dauer WHERE ???";
            $eintragen = mysql_query($eintrag);
        }
}
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        


[EDIT]

```
$eintrag = "UPDATE zeiten SET zeit=$dauer WHERE id=302";
```
Über die id würd's schon gehen, aber die verändert sich ja ständig. Ich bräuchte also beim WHERE was dynamisches, nachdem ich ja keinen Fixwert in den Zeilen habe?!


----------



## TessaKavanagh (10. Juli 2014)

Warum bereitest du die Daten nicht entsprechend dieses Codes:


```
for ($a = 0; $a < 7; $a++) { 
        if (isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") { 
            $tag = $_POST[$data[$a]]; 
        } 
    }
```
zum Eintragen in die Datenbank vor? Das ganze natürlich bevor du überhaupt einen Datenbankeintrag erstellst.
Dann speicherst du Sie jeweils in einer Variable im Bsp. $tag und kannst mit einem einzigen INSERT Befehl alle Daten auf einmal in die Datenbank eintragen.

[EDIT]
Grade für das WHERE ist ja id häufig gedacht.    id=$id  geht übrigens auch Variablen heißt das Zauberwort .


----------



## boss3D (10. Juli 2014)

Ja, das ist schlau! Funktioniert auch, bis auf ein Problem: Das "erstellt" Datum geht mir dabei, warum auch immer, verloren (auch wenn ich's ins if in der Schleife reinschreibe). 

```
$erstellt = date('d-m-Y');

for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen = mysql_query($eintrag);
        }        
    }
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



BTW: Kann man in php "and" und "&&" schreiben? Ihr nehmt immer "and", aber bei mir hat "&&" auch schon funktioniert.


----------



## TessaKavanagh (10. Juli 2014)

```
for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('d-m-Y');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES   ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
$eintragen = mysql_query($eintrag);
        }        
    }
```

[EDIT]
Ja && ist eine alternative Schreibweise des logischen Operators AND in PHP
zusätzlich geht noch || das ist die Alternative Schreibweise zu OR


----------



## boss3D (10. Juli 2014)

Hab's oben noch editiert: Auch ein Reinschreiben in die Schleife wirkt nicht ... 

Hier mal alles:

```
<?php    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = mysql_query("SELECT * FROM zeiten, user WHERE zeiten.user = user.id;");    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array();
    $stunden[] = "montag";
    $stunden[] = "dienstag";
    $stunden[] = "mittwoch";
    $stunden[] = "donnerstag";
    $stunden[] = "freitag";
    $stunden[] = "samstag";
    $stunden[] = "sonntag";
    
    $data = array();
    $data[] = "mo";
    $data[] = "di";
    $data[] = "mi";
    $data[] = "do";
    $data[] = "fr";
    $data[] = "sa";
    $data[] = "so";
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('d-m-Y');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen = mysql_query($eintrag);
        }        
    }
?>
```


----------



## TessaKavanagh (10. Juli 2014)

```
<?php    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = mysql_query("SELECT * FROM zeiten, user WHERE zeiten.user = user.id;");    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag","dienstag","mittwoch","donnerstag","freitag","samstag","sonntag");   
    $data = array("mo","di","mi","do","fr","sa","so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
             $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>
```

Habe es etwas gekürzt und date() anders Formatiet, ansonsten verstehe ich es auch nicht, außer vielleicht date() nimmt aus irgend einem Grund grade gar nicht die Uhrzeit an, das kannst du prüfen wenn du es einfach mal $erstellt per echo ausgibst.


----------



## boss3D (10. Juli 2014)

Jetzt ist es wieder da. Lag dann wohl an date(), allerdings ging's ja bei mir früher auch ohne h-i-s. Komisch, aber jetzt egal.

Damit bleibt uns nur noch 3 Probleme und wir hätten das Eingabeformular komplett fertig (schaffen wir hoffentlich bis morgen Abend = Halbzeit). 

1) Statt dem MA-Namen (mit dem er sich registriert und dann einloggt) landet nur "Resource id #5" in der DB. Das kommt wohl aus Zeile 4 in unserem Code, aber was bitte ist daran falsch?
2) Den Fehler in deinem kleinen "Button-soll-neue-Zeilen-liefern"-Code finden. (Oder gleich eine andere Lösung als mein Javascript finden. DarkMo meinte ja, es ginge auch nur mit php.)
3) Optische Anpassung der Länge der einzelnen Felder der Zeile, gemäß dem Header

^^ Als erstes zum Namen ...


----------



## TessaKavanagh (10. Juli 2014)

Beachte das ich auch die Rheinfolge vorne geändert habe  um Sie mit der DB gleichzusetzen.


Das ist kein wunder, du fragst da ja jede Menge Daten ab. Das kann kein brauchbares Ergebnis werden. Ich frage mich derzeit woher du dir die Info überhaupt holst welcher Nutzer etwas einträgt. Das wäre Schritt 1 zum richtigen Ergebnis.


```
mysql_query("SELECT * FROM zeiten, user WHERE zeiten.user = user.id;");
```
 Damit fragst du alle Daten der Tabelle Zeiten ab bei denen die Spalte USER den Wert ID in der Tabelle USER hat. Was das bringen soll verstehe ich aber grade nicht x-D


----------



## boss3D (10. Juli 2014)

Ich könnte die Zeile sinnvollerweise so beginnen ...

```
$user = mysql_query("SELECT name FROM user WHERE ???");
```
... aber was soll ich dann bitte aus den beiden Tabellen vergleichen?

Das "zeiten.user = user.id;" bringt ja dann nichts mehr?! Über welche beiden Werte stelle ich einen Zusammenhang zwischen dem MA in "user" und den Einträgen in "zeiten" her?


----------



## TessaKavanagh (10. Juli 2014)

Na du musst doch erst einmal den Nutzer der eingeloggt ist und das Formular absendet identifizieren. Da scheitert es doch schon. Ich kann in deinem Script keinen Login finden anhand dessen du herausfinden kannst welcher "Nutzer" den Eintrag erstellt hast. Folglich wirst du sobald zwei Nutzer in der DB stehen keine eindeutige Zuordnung treffen können.


Auch ist dein Code momentan anfällig für Cross-Site-Scripting und MYSQL Incection, da wir alle Nutzereingaben ungeprüft behandeln. Das ist zwar zum verstehen wie PHP Funktioniert i.o., aber es ist ein Problem für den Produktiveinsatz dem wir uns vor Ende der Arbeiten ebenfalls annehmen müssen.


----------



## boss3D (10. Juli 2014)

Bei mir läuft's so ab:

1) Registrieren:

```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $username = $_POST["username"];
    $passwort = $_POST["passwort"];
    $passwort2 = $_POST["passwort2"];

    if ($passwort != $passwort2 OR $username == "" OR $passwort == "") {
        echo "Eingabefehler. Bitte alle Felder korrekt ausfüllen. <a href=\"eintragen.html\">Zurück</a>";
        exit;
    }
    $passwort = md5($passwort);

    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$username'");
    $menge = mysql_num_rows($result);

    if ($menge == 0) {
        $eintrag = "INSERT INTO user (name, passwort) VALUES ('$username', '$passwort')";
        $eintragen = mysql_query($eintrag);

        if ($eintragen == true) {
            echo "Benutzername <b>$username</b> wurde erstellt. <a href=\"login.html\">Login</a>";
        } else {
            echo "Fehler beim Speichern des Benutzernamens. <a href=\"eintragen.html\">Zurück</a>";
        }
    } else {
        echo "Benutzername schon vorhanden. <a href=\"eintragen.html\">Zurück</a>";
    }
?>
```
2) Login

```
<?php
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $username = $_POST["username"];
    $password = md5($_POST["password"]);

    $abfrage = "SELECT name, passwort FROM user WHERE name LIKE '$username' LIMIT 1";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_object($ergebnis);

    if ($row->passwort == $password) {
        $_SESSION["name"] = $username;
        header("Location: http://localhost/db/projektzeiterfassung1.html");
    } else {
        echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";
    }
?>
```
3) Formular ausfüllen und Daten an DB senden

```
<?php    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = mysql_query("SELECT name FROM user WHERE zeiten.user = user.id;");    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag","dienstag","mittwoch","donnerstag","freitag","samstag","sonntag");   
    $data = array("mo","di","mi","do","fr","sa","so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>
```
Die nötigen Daten, die wir brauchen, sind zu dem Zeitpunkt alle längst in der DB. Den User könnte man anhand seiner id oder seines Namens (vorrausgesetzt, es gibt keine zwei "Max Müller" in der Firma) identifizieren. Der selbe Name soll dann auch in der "zeiten" Tabelle bei den Einträgen dieses Users landen. 

In der DB können nach meiner Logik ruhig die Einträge ALLER MAs "kreuz und quer" landen, weil der "Admin" nachher ja anhand des Namens die Einträge filtern und sich z. B. nur jene eines einzigen MAs anzeigen lassen kann.


----------



## TessaKavanagh (10. Juli 2014)

Siehst du da ist ja der Login  den habe ich gebraucht, das hilft uns weiter.


```
<?php
    session_start();    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];    
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag","dienstag","mittwoch","donnerstag","freitag","samstag","sonntag");   
    $data = array("mo","di","mi","do","fr","sa","so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>
```

Der Name liegt doch in 
	
	



```
$_SESSION['name']
```
 schon vor, es besteht kein Grund ihn sich nochmal aus der DB zu holen.


----------



## boss3D (10. Juli 2014)

Ist die session also doch noch für was gut ... 
Sehr gut, jetzt sind alle Einträge über den Namen des jeweiligen MAs eindeutig identifizierbar. So habe ich mir das vorgestellt.

Dann müssten wir es jetzt noch schaffen, mehrere Eingabezeilen untereinander erzeugen zu können. Da hatten wir diesen erweiterten Code, in den du ein paar Zeilen ergänzt hast:

```
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }
    
    function interpretRequest() {
        [COLOR=royalblue]var ContNeu= request.responseText;
        var ContAlt = document.getElementByID('content').innerHTML;
        var content = ContAlt + ContNeu;
        document.getElementById('content').innerHTML = content;    }
</script>
```
Ich selbst kenne mich mit Javascript zuwenig aus als dass ich den Fehler finden werde. Wenn du ihn selbst nicht findest, brauchen wir eine andere Lösung. Wobei ich mich gerade frage, wie sich DarkMo das ohne Javascript, nur mit php, vorgestellt haben könnte.

[EDIT]
Hier das ganze Teil, auch mit Header-Erzeugung:

```
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Projektzeiterfassung</title>
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }
    
    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
    }
</script>
</head> 
<body>
<form action="formular.php" method="post">
    <br><h1>Projektzeiterfassung</h1>
    <table>
        <tr><th>Tätigkeit</th>
        <th>Produkt</th>
        <th>Beschreibung</th>
        <th width="150">MO <input name="mo" type="text" size="10" maxlength="10"></th>
        <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
        <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
        <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
        <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
        <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
        <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th></tr>
    </table><br>    
    <div id="content"></div>
    <div class="submit"><input type="button" onClick="javascript:setRequest()" value="Neue Eingabezeile hinzufügen"></div><br>
    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form> 
</body>
</html>
```


```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

    echo '<table>';

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

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

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

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

[EDIT2]
Genau so ...

```
<div class="submit"><input type="button" onclick=<script src="http://localhost/db/dynamictable.php>" value="Neue Eingabezeile hinzufügen"></div><br>
```
... funktioniert's nicht, aber ich vermute, dass es so ähnlich geht (was DarkMo statt dem Javascript gemeint hatte).


----------



## TessaKavanagh (10. Juli 2014)

Nur mit PHP ist auch nicht schwerer, der einzige Unterschied zur AJAX Lösung ist das die Komplette Seite neu geladen wird.

Sinngemäß sieht das dann von der Programmlogik so aus.

1. Eigenes Formular mit Eingabefeld für Zahl der zusätzlich zu erzeugenden Zeilen "zahl" einem hidden field, nennen wir es "gesendet" mit dem Wert 1 und einem Submit button.

2. Das Formular das Dokument in dem es selber steht auf.

3. Bei der Erstellung der Seite wird per $_POST['gesendet'] geprüft ob der Inhalt 1 ist.
Wenn die Bedingung TRUE ist dann erstelle so viele Formularzellen im Formular zum Werte eingeben wie in "zahl" angegeben.

4. Absenden drücken und weiterleiten zum Eintragen

5. Eintragen auf mehrere Datensätze anpassen.


----------



## boss3D (10. Juli 2014)

Ja, das war deine Lösung von vor ein paar Seiten weiter vorne, aber irgendwie gefällt mir das nicht. Was ist, wenn der MA unabsichtlich zu wenige Zeilen wählt? Dann kann er sich durch das ganze Zeugs nochmal durchklicken und ein zweites Formular für seine noch fehlenden Daten ausfüllen.

Ich fände es "dynamischer" wenn man einfach eine weitere Zeile nach der anderen einfügen kann, so lange man das eben will bzw. braucht. So eine Lsg wäre mir lieber ...


----------



## DarkMo (10. Juli 2014)

SELECT * FROM zeiten, user WHERE zeiten.user = user.id;

aaalso ^^
das dbms soll nun alle daten (*) aus den tabellen zeiten und user raussuchen. soweit klar. mit der where bedingung wird dann allerdings sicher gestellt, dass uns nur die userdaten beim ergebnis angefügt werden, die auch der gegebenen id entsprechen - nämlich genau der id, die in zeiten angegeben ist. hier beispieltabellen:

zeiten


*ID|Tätigkeit-ID|Produkt-ID|User-ID*

1|3|2|5
2|3|1|4
3|1|1|2
user


*ID|Name*

1|Ulla
2|Boss3D
3|Heinz
4|Tessa
5|Mo
wenn wir einfach sagen "SELECT * FROM zeiten;", bekommen wir (mit jeder abfrage, $res würde 3 zeilen ausgelesen haben) sowas raus:
$row = { ['ID'] => 1, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 2, ['User-ID'] = 5 };
$row = { ['ID'] => 2, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 1, ['User-ID'] = 4 };
$row = { ['ID'] => 3, ['Tätigkeit-ID'] = 1, ['Produkt-ID'] = 1, ['User-ID'] = 2 };

wenn wir diesen zahlensalat ausgeben, ist das zwar "syntaktisch" richtig, aber "semantischer" kauderwelsch ^^ daher holen wir uns also bspw noch die userdaten, und damit da nich alles mit allem gemixt wird, machen wir das NICHT bedingungslos. wir wollen für eine zeitenzeile NUR die userzeilen daten anfügen, die wir brauchen -> "SELECT * FROM zeiten, user WHERE zeiten.User-ID = user.ID;". ergebnis:
$row = { ['ID'] => 1, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 2, ['User-ID'] = 5, ['Name'] = 'Mo' };
$row = { ['ID'] => 2, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 1, ['User-ID'] = 4, ['Name'] = 'Tessa' };
$row = { ['ID'] => 3, ['Tätigkeit-ID'] = 1, ['Produkt-ID'] = 1, ['User-ID'] = 2, ['Name'] = 'Boss3D' };

wir sehen: nun haben wir zusätzlich die Name-spalte aus der user-tabelle. was wir jetzt hier nich so genau sehen: user und zeiten haben BEIDE eine spalte ID - wie mysql das hier im speziellen löst, weis ich leider nicht :/ eventuell nennt es die dinger in zeiten.ID um und fügt user.ID an - aber ich glaube, als ich das mal probiert hatte, funzte das nich. daher immer aufpassen, wenn ihr gleiche spaltennamen habt. notfalls müsst ihr die dann "umbenennen". zum bsp so hier:
"SELECT T1.Beispiel AS bla, T2.Beispiel AS blubb FROM table1 AS T1, table2 AS T2... ;"
auch hier hat man in beiden tabellen table1 und table2 jeweils eine spalte Beispiel, benennt diese aber jetzt jeweils um. in unserem row könnte man also nun mittels $row['bla'] auf table1.Beispiel zugreifen und mit $row['blubb'] auf table2.Beispiel. was man auch sieht: diese "aliases" kann man auch im sql string selbst verwenden. in der from-clausel gebe ich den tabellen die alias-namen T1 und T2 und spare mir in der select clausel damit schreibarbeit (statt table1 einfach T1 geschrieben). wenn man dann noch häufiger in der where clausel oder beim sortieren oder so den tabellen namen braucht, dann macht sich das bemerkbar ^^
nachteil: da man nich simpel * abfragt, also alles, muss man explizit alles angeben, was man braucht.

für unser bsp ist das aber erstmal zweitrangig, da uns die ID hier nen feuchten juckt ^^ wir könnten jetzt also schonmal den user-namen statt der id ausgeben lassen (statt $row['User-ID'] lassen wir eben $row['Name'] ausgeben), die tätigkeiten und produkte sind aber immernoch nur nummern. aber das können wir da ganz genauso machen:
"SELECT * FROM zeiten AS z, user AS u, *tätigkeiten AS t, produkte AS p* WHERE z.User-ID = u.ID* AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID*;"
*tadaa*
falls wir das problem haben, dass bei produkte und tätigkeiten die string-variante in der gleichnamigen spalte Bezeichnung liegt, dann können wir unser vorhandenes wissen jetzt produktiv nutzen:
"SELECT *t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName* FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p  WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID =  p.ID;"
eine ausgabe könnte dann in etwa so aussehen:
echo '<tr><td>'.$row['tBez'].'</td><td>'.$row['pBez'].'</td><td>'.$row['uName'].'</td></tr>';

will man nur die daten, die von enem betimmten user sind, dann muss man das ganze so verfeinern:
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName  FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p  WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID =  p.ID* AND z.User-ID = '".$aktueller_user."'*;"

will man weiterhin nur die daten in einem bestimmten zeitraum, dann kann das ganze so aussehen (das bsp müsste jetzt natürlich erweitert werden um die datum-spalte):
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName  FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p  WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID =  p.ID AND z.User-ID = '".$aktueller_user."'* AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende."'*;"

dazu wäre es aber sinnvoll und mMn einfacher, wenn man Datum als konstruierten timespamp (mktime() oder wie es hieß) speichert. also generell ein datums format der db, das man selber nachgebildet bekommt ^^ dann baut man sich eine funktion, die die aktuelle woche ermittelt (als zahl - wir sind jetzt gerade zum bsp in KW 28 ^^). vllt gibts die ja sogar schon von php aus. und dann baut man sich noch ne funke, die für eine kalenderwoche deren anfangs- und end-timestamp ermittelt. genau diese beiden werte werden dann an die db übergeben - das was ich hier oben fett markiert hatte zuletzt. sinn des ganzen: ich würde noch buttons anlegen, die eine woche vor und eine zurück "spulen" - ergo einfach die zahl der kalenderwoche incrementieren oder decrementieren. woche zurück button -> aus der 28 wird ne 27. die funktion, die uns die timestamps baut bekommt nun die 27 zum fressen und spuckt dementsprechend die zeiten der woche 27 aus, und nicht die der 28 und schwupps, wird unsere tabelle mit den daten der letzten woche aufgebaut. usw usf.

weiteres problem: ich gehe gerade davon aus, dass wir pro datum eine zeile in der db anlegen. also einen eintrag eben. wenn man in einer woche 3mal an einer tätigkeit/produkt-kombi gewerkelt hat, steht das in deiner exeltabelle alles in einer zeile. so wie ICH das lösen würde, würden aber jetzt dafür 3 zeilen in der tabele ausgegeben werden, eben weil wir 3 db-einträge vorgenommen haben. wir müssten die dann also am besten noch zusammenfügen. dafür würde ich unser ergebnis der db-anfrage noch sortieren. zuerst nach tätigkeiten, dann nach produkten. dann kann man davon ausgehen, das immer, wenn das produkt wechselt, man auch eine neue zeile beginnen kann. das ist natürlich ein kniffliger part und schwer zu beschreiben. aber vllt wisst ihr, was ich meine. unsere anfrgae müsste dann also so lauten:
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName  FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p  WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID =  p.ID AND z.User-ID = '".$aktueller_user."' AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende."* ORDER BY z.Tätigkeit-ID ASC, z.Produkt-ID ASC*';"

hier kannste probieren, ob dir ASC oder DESC besser gefällt. ist die sortierreihenfolge ^^ ASC ist default und kann daher auch weggelassen werden.


----------



## TessaKavanagh (10. Juli 2014)

> Ja, das war deine Lösung von vor ein paar Seiten weiter vorne, aber irgendwie gefällt mir das nicht. Was ist, wenn der MA unabsichtlich zu wenige Zeilen wählt? Dann kann er sich durch das ganze Zeugs nochmal durchklicken und ein zweites Formular für seine noch fehlenden Daten ausfüllen.
> 
> Ich fände es "dynamischer" wenn man einfach eine weitere Zeile nach der anderen einfügen kann, so lange man das eben will bzw. braucht. So eine Lsg wäre mir lieber ...



Jetzt denk doch mal ein bisschen Flexibel das ist genau das selbe. Einzig mit dem unterschied das du aus dem "Input" ein "hidden field" machst. Der Wert des hidden Fields "zeit" ist dann die PHP variable $nummer (also value="$nummer". Wenn jetzt folgende Bedingung eintritt 
	
	



```
if(isset($_POST['zeit'])){$nummer = $_POST['zeit'];}else{$nummer = 0;}
$nummer++;
```

Anhand von $nummer erstellst du per PHP die Zeilen. Im Ergebnis sieht das ganze so aus wie mit dem Javascript, nur das die Seite jedes mal neu geladen wird. Der Rest des Codes bleibt davon unberührt.

Denn es gilt für jedes mal absenden von Nummer erhöht sich der Wert um 1 folglich wird nach jedem Absenden eine Zeile mehr angezeigt. Sollte nicht abgesendet sein wird nur eine Zeile angezeigt.


----------



## DarkMo (10. Juli 2014)

hab hier mal in 10 mins nen gaaaanz simples php-only bsp gebaut (anhang). hat jetz natürlich keine echte db anbindung, sondern ich liefer mittels einem hiddenfield getrickst die anzahl der einträge immer mit. aber so kann man sich das ganz gut vorstellen *denk* bei der anzeige der tabelle mit all den daten wird diese zeilenanzahl natürlich durch die db selber (die liefert ja eine gewisse *anzahl *an einträgen zurück) bestimmt und man braucht nicht so rumtricksen. die forschleife zur dynamischen erstellung der tabelle würde dann eben durch die "while row = fetch res" *ganz grob* ersetzt werden und fertig is im groben der lack. unten bei add entry kommen eben deine paar inputfelder rein (tätigkeit auswählen, produkt auswählen, beschreibung, datum, zeit...). dann kann man eben eintrag für eintrag adden, wieder löschen (oder eben editieren - geht ja auch) und die grundzüge des ganzen dings stehen. kein ajax gefummel, keine 20 files, kein aufwand ^^

deswegen frag ich ja die ganze zeit, WAS ihr da eigentlich treibt ><


----------



## boss3D (10. Juli 2014)

@ DarkMo
Deine Erklärung zum SELECT FROM WHERE verstehe ich schon, allerdings haben wir dazu ein ganz anderes Problem: Ich habe in "zeiten" keine User-ID wie du das annimmst! Ja, es gibt darin eine ID, aber das ist die ID der jeweiligen Zeile. Die wird von phpmyadmin automatisch mit jedem weiteren Eintrag erhöht (derzeit sind wir bei 345) und steht in keinem Zusammenhang mit dem User oder dessen ID!

Damit dein Schema funktioniert, müsste ich erst noch in "zeiten" eine Spalte "user-id" einfügen. Diese könnte ich dann vermutlich auch über eine session-Variable abfragen?! Allerdings frage ich mich, ob wir das jetzt überhaupt noch brauchen, wo wir doch jetzt eh über den User-Namen Einträge eindeutig identifizieren können ...

Zu dem ganzen Rest: Ist heftig, sich da durchzulesen. Ich wil erstmal die Zeilenausgabe hinkriegen. Dann überlege ich mir alles andere, sonst wird's Chaos.


----------



## DarkMo (10. Juli 2014)

du hast schon chaos 

wieso brauchst du nen user? woher willst du sonst wissen, wem die einträge gehören? also das muss da schon mit rein, wenn du es user-basiert haben möchtest. der user loggt sich ein, dabei wird seine id aus der db ermittelt und du speicherst die irgendwo. am besten direkt in der session. mittels dieser id werden nun alle einträge gefiltert und nur die einträge aus der db geholt, die auch den eingeloggten user (per id) betreffen. du weisst zwar clientseitig gerade, wer da on ist (ich hab mirs login nich angesehn, ich gehe von was funktionierndem aus ^^), aber der server weis das doch ned.

solange man nicht die rechte hat, die daten aller user zu sehen (kein admin), dann braucht man den user eigentlich auch garnicht auszugeben. man sieht ja eh nur die eigenen. aber im falle des admins wäre es schon praktisch, bei einer gesamtübersicht.

also wie gesagt: mir ist atm nicht wirklich klar, wie du anhand des user namens _eindeutig _dessen einträge in der db ermitteln willst. du hast für ALLE user EINE zeitentabelle. alle daten aller user sind in dieser einen tabelle. in der du keinen vermerk hast, welche datensaätze zu welchem user gehören  für jeden user ne eigene zeitentabelle anlegen ist nicht nur unnötig kompliziert, das ist auch völliger blödsinn ^^


----------



## boss3D (10. Juli 2014)

Ob du's glaubst oder nicht, aber in meinem eigenen "Chaos" kenne ich mich bestens aus. 
Bei euren, v. a. deinen, Codes tue ich mir dafür schwer, zu verstehen, was das alles sein soll ...

So wie ich das sehe, kann ich sehrwohl nur über den Usernamen die Einträge eines MAs eindeutig ermitteln. Will sich der Admin (der später alles sehen können soll) z. B. alle Datenzeilen von Max Müller anzeigen lassen, dann braucht er sich ja nur alle Einträge aus der EINEN "zeiten" Tabelle "SELECT * FROM zeiten WHERE name="Max Müller";" anzeigen lassen. Wo ist das Problem? Du würdet es halt über die User-ID anstatt des User-Namens machen. Aber für den Namen habe ich eben schon eine Spalte in der Tabelle, für die ID müsste ich wieder eine hinzufügen (auch wenn's "kein" Aufwand wäre).

Und für jeden User eine "zeiten" Tabelle anzulegen hatte ich nie vor. Wie kommst du drauf? Wir haben die EINE, wo alle Einträge von allen MAs drinnen landen.

[EDIT]
Ich hätte jetzt versucht, mir die User-ID zu holen und auch in "zeiten" einzutragen, aber das will irgendwie nicht ...

```
$user = $_SESSION['name'];   
$id = "SELECT id FROM user WHERE name=$user;";
$userid = mysql_query($id) or die ("Get User-ID failed.<br>".mysql_error());
```


----------



## boss3D (10. Juli 2014)

Hab's jetzt so, aber ich kriege immer "0" als userid raus:

```
$user = $_SESSION['name'];   
$userid = mysql_query("SELECT id FROM user WHERE name='".$user."'") or die ("Get User-ID failed.<br>".mysql_error());
```
Dabei hätte mein "test" User schon id "1" ...


----------



## TessaKavanagh (10. Juli 2014)

@DarkMo

Wir/Ich versuche die von boss3D gestellten Fragen zu beantworten. Warum ich das tue? Weil ich hoffe das es "klick" macht und er den Zusammenhang und die Grundlagen von PHP versteht. Momentan habe ich aber noch das Gefühl das es sich hier mehr um das Zusammenkopieren von Code handelt um am Ende ein "funktionierendes" Script zu haben.

Das der aktuell verfolgte Lösungsansatz weder effizient noch praktisch ist brauchen wir nicht diskutieren.
Wichtig ist mir aber das boss3D verstehen soll wie PHP funktioniert und was er da zusammencodet. Sollte er dies innerhalb der Ihm gestellten Frist schaffen, dann wird er den Ansatz vermutlich verwerfen und nochmal von vorne Anfangen.

Das von Ihm anvisierte Projekt "Registrieren->Login->variable Anzahl an Datensätze erstellen->diese Anzahl In Datenbank Eintragen" könnte er dann zeitlich an einem Tag umsetzen.

Wenn er aber die grundlegende Funktionsweise hinter PHP nicht versteht, dann wird auch bis zum Ende dieses Projektes kein vollständig funktionierendes Script zustande kommen.

Die von dir vorgeschlagenen Ansätze mögen zwar effizient sein, doch wird boss3D mit PHP und MYSQL am Hochreck sicherlich nichts anfangen können. Denn Code muss man verstehen damit man damit arbeiten kann. Da Boss keine Erfahrung mit PHP hat, ist daher m.E. eben eine möglichst "einfache" Lösung angesagt.

Klar könnte vermutlich jeder von uns beiden Ihm jetzt einen funktionierenden objektorientierten Code um die Ohren hauen. Selbst wenn du diesen bis zum erbrechen Auskommentierst, wird er Ihn jedoch nicht verstehen weil noch die Grundlagen fehlen. Wenn du das ganze dann noch schön durch deine eigene Template Engine ziehst oder weil es soviel Spaß machst z.b. Zend Framework drüberbügelst. Ja dann haben wir ein "vernünftiges" Programm und/oder gezeigt wie toll man Coden kann, aber Boss weiterbringen (zumindest Wissenstechnisch) wird das nicht.


----------



## DarkMo (10. Juli 2014)

AAAAAH, du hast anstelle der id den namen, alles klar. das war das fehlende puzzle teil. aber wie tessa schon sagte: redundanz. das ist das gift jeder datenbank  die id des users wird sich kaum ändern, sein name kann sich aber durchaus ändern. speicherst du die id (es ist kein aufwand das zu ändern), brauchst du nur in der user-tabelle seinen namen einmal ändern, fertig. speicherst du den namen, musst du den kram überall ändern ><

zum edit, was geht da nich? eventuell musst du die ' noch um $user bauen. im übrigen stört mich diese "schnellschreibweise" xD ich unterbreche den string für variablen, das sieht man viel deutlicher. so siehts immer aus, als würde das nen fehler verursachen. so ala "klar kann das nich gehn, gibt ja keinen user der $user heißt


----------



## boss3D (10. Juli 2014)

@ Tessa
So schaut's aus. Ich brauche was, das ich verstehe ... und das ist ATM nur mein eigener Code (bestehend aus zig Files). Nur wenn ich mir alles halbwegs selber zusammenbastle, komme ich auch irgendwie weiter. Wenn ich jetzt irgendwelche langen Codes von euch hernehme, die schon fast alles machen, dann kenne ich mich gar nicht mehr aus und weiß auch nicht, wo und wie ich da weitermachen soll. Bei meinen eigenen erkenne ich wenigstens die Baustellen ...
--------------

Die userid würde ich mir jetzt aber schon gerne in "zeiten" auch noch vor jedem Eintrag hinzufügen, gemäß deinem Vorschlag, DarkMo. Aber siehe mein voriges Posting: Will irgendwie nicht ...


----------



## TessaKavanagh (10. Juli 2014)

```
$user = $_SESSION['name'];   
$id = "SELECT id FROM user WHERE name=$user";
$userid = mysql_query($id) or die ("Get User-ID failed.<br>".mysql_error());
```


Du hast versucht die Variable $user; abzufragen die Variable heißt aber $user   

Copy&Past is not your friend while Coding PHP.


----------



## boss3D (10. Juli 2014)

^^ So hatte ich's ja eh am Anfang, aber da kommt:


> Get User-ID failed.
> Unknown column 'test' in 'where clause'


Bei meiner letzten Version kriege ich immerhin schon mal ne Zahl, aber leider eben "0" ...


----------



## TessaKavanagh (10. Juli 2014)

Die Fehlermeldung liefert alles was wir brauchen.


```
$user = $_SESSION['name'];    
$id = "SELECT id FROM user WHERE name= '".$user."'";
$userid = mysql_query($id) or die ("Get User-ID failed.<br>".mysql_error());
```



Denn er denkt "test" ist ein Spaltenname also fehlen die '     '


----------



## boss3D (10. Juli 2014)

Ja, das habe ich eh schon alles so in meiner Version. Die "funktioniert" zwar, liefert aber eine falsche id ...

Hier nochmal mein Code (liefert id=0 statt id=1 für User "test"):

```
$user = $_SESSION['name'];   
$userid = mysql_query("SELECT id FROM user WHERE name='".$user."'") or die ("Get User-ID failed.<br>".mysql_error());
```


----------



## TessaKavanagh (10. Juli 2014)

Ok kannst du mal ein Screeni von der USER DB liefern?

und nimm bitte mal folgenden Code


```
$user = $_SESSION['name'];   
$ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'")
$row = mysql_fetch_object($ergebnis);
$userid = $row->id;
```


----------



## boss3D (10. Juli 2014)

User Tabelle?! 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## DarkMo (10. Juli 2014)

ok, ihr habt scho wieder zig dinger gepostet, daher zieh ich mein edit mal raus ^^


@tessa,
mein codebeispiel ausm anhang ist mehr als simpel ^^ einfach nur echos  überall und das wars im groben schon. 3 ifs und ne forschleife runden  alles ab. das problem ist (aus meiner sicht), dass  "Registrieren->Login->variable Anzahl an Datensätze  erstellen->diese Anzahl In Datenbank Eintragen" kein simples porjekt  ist   das ist schon weiter gedacht. am besten fängt man gaaaaanz simpel an.  eben wie beim bsp. die grundlagen sind da, und jetzt wird verfeinert.  anstelle des hiddencounters wird die db-abfrage eingebaut und diese  ausgegeben, statt dem sinnlos "$i. Eintrag" geblubber. dann wird bei den  if's für add und del button der code ausgebaut, dass man eben genau  jene funktionen erreicht. auch noch sehr sehr simpel. schon hat man die  basics umgebaut auf ein funktionierendes db-basic "prog". jetzt kann man  schonmal mit css die tabelle ordentlich darstellen, geht ja fix und  ändert sich ned alle fötz lang ^^

weiterhin kann man dann ein javascript für die dropdowns bauen, das wird  schon anspruchsvoller. also dass eben die produkte sich an die  tätigkeiten anpassen bla. is bissl gefummel, aber machbar. dann kann man  eine edit funktion einbauen. entweder löst mans so, dass man in jeder  zeile inputfelder hat, die per css einfach nich so aussehen, und per add  klick werden die mit ner weiteren javascript funke "plötzlich" zu  echten inputs (einfach die css class wechseln lassen) - kann aber  durchaus anspruchsvoll sein, ist aber sicher ein hübsches ergebnis -  oder man machts wieder per php und der buttonklick (name bspw edit)  lässt die seite erneut laden, nur dass diesmal die gewünschte zeile eben  mit inputs generiert wird zum editieren. weiterer klick (button name  nun bspw editfinal) und es wird in die db geschrieben. wäre das thema  auch erledigt. wie schon in nem anderen post angemerkt, kann man sich  überlegen, ob man die zusammengehörigen zeilen zusammenfassen mag. ich  geh ja grad von der simplen aber effektiven lösung aus, dass jedes datum  einen eigenen eintrag erzeugt, auch wenn sie in der exeltabelle in der  selben zeile stehen würden. und diesen unterschied ausmärzen, wäre ein  weiterer schritt.

das kann man dann immer weiter fortführen, schritt für schritt. da kann  man dann auch drüber nachdenken, wie man eine "multi-add" funktion, wie  boss sie scheinbar jetzt schon versucht umzusetzen - tatsächlich  umsetzen kann.

generell, würde ich eine schritt für schritt methode vorschlagen wollen.  html und css sind ja hoffentlich kein problem, das jetz in php zu  integrieren sollte das kleinste problem sein. aus html-mit-css wird  einfach echo "html-mit-css". also anfangs auf diese elemente beschränken  und bei den einfachen geschichten, kann man auch schonmal mit js  experimentieren und das zusätzlich reinbauen. man kann durch php ja auch  je nach situation und bedürfnis dynamisch seinen js-code basteln. so  als bsp. es is ja überhaupt nix anderes wie in allen anderen sprachen  auch, wo man frei schnautze irgendwelche bunten texte dynamisch  zusammenkleistert. nur das hier der text halt html usw ist. und wenn man  das dann mal lauffähig hat, kann man auch gerne mal überlegen, ob man  da mal bissl umbaut und probiert das ganze mit ajax zu gestalten, so  dass nich laufend die seite neu geladen werden muss.

aber gleich zu anfang son krudes zeugs... das kann doch nix werden ><




und wegen "ellenlangen codes" - nich angeschaut? hier ist der ganze quellcode 

```
<?php
  echo '<html><head><title>beispiel</title></head><body>';
  
  $count = 0;
  $output = ' ';
  
  if(isset($_POST['count'])) $count = $_POST['count'];
  if(isset($_POST['btnAdd'])) { $count++; $output = 'Simulation: Eintrag in DB erstellt!'; }
  if(isset($_POST['btnDel'])) { $count--; $output = 'Simulation: Eintrag aus DB gelöscht!'; }

  echo '<p>'.$output.'</p>';
  
  echo '<form action="zeit.php" method="post">';
  echo '<table border="1">';
  echo '  <tr>';
  echo '    <td>eine Tabelle</td>';
  echo '    <td border="0"></td>';
  echo '  </tr>';
  
  for($i = 0; $i < $count; $i++) {
    echo '  <tr>';
    echo '    <td>'.($i + 1).'. Eintrag</td>';
    echo '    <td><input type="submit" value="del" name="btnDel"></td>';
    echo '  </tr>';
  }

  echo '  <tr>';
  echo '    <td>add Entry</td>';
  echo '    <td><input type="submit" value="add" name="btnAdd"></td>';
  echo '  </tr>';
  echo '</table>';
  echo '<input type="hidden" value="'.$count.'" name="count">';
  echo '</form>';
  
  echo '</body></html>';
?>
```
die datei war nur als anschauungsbsp mitgeliefert, da man vom reinen code halt ned unbedingt sieht, was es macht.


----------



## boss3D (10. Juli 2014)

DarkMo schrieb:


> das problem ist (aus meiner sicht), dass  "Registrieren->Login->variable Anzahl an Datensätze  erstellen->diese Anzahl In Datenbank Eintragen" kein simples porjekt  ist   das ist schon weiter gedacht.


Ich muss das machen, was der Auftraggeber haben will und da gehört ein Login-System dazu. Dass ich keine wirklichen php-Kentnisse habe, weiß er eh, aber die Aufgabe ist nun mal so. Deswegen habe ich ja auch so "lange" für das Projekt Zeit, eben um mich einarbeiten zu können.


DarkMo schrieb:


> aus html-mit-css wird  einfach echo "html-mit-css"


Damit habe ich schon ein bisschen rumprobiert, hat aber nie wirklich funktioniert. Entweder mein style="whatever" wurde einfach nicht übernommen, oder er hat mir in den Dropdowns die obersten Einträge gelöscht.


DarkMo schrieb:


> und wegen "ellenlangen codes" - nich angeschaut? hier ist der ganze quellcode


Da hatte ich eigentlich den von Tessa mit dem Switch gemeint. Deinen habe ich mir schon angeschaut, aber ich bin noch damit beschäftigt, die Probleme in meinem zu lösen. 

Mein Ziel wäre jetzt eben, bis morgen Abend das gesamte Eingabeformular fertig zu haben. Dazu braucht's eben noch eine optische Formatierung der Zellenbreite der dynamischen Zeile und das mehrfache Funktionieren meines Buttons. Dann ist Halbzeit. Am WE will ich mich dann richtig in deine/eure Beispiele reindenken.
Und ab nächster Woche bin ich dann hoffentlich so weit, dass ich die zweite Halbzeit zum Basteln des "Gegenstücks" hernehmen und das dann hoffentlich auch weitestgehend selber schaffen kann. Das soll dann eine zweite Website nur für den Admin werden, auf der dieser Daten aus der DB von allen MAs abfragen und sich anzeigen lassen kann. Da sollte ich dann auch noch einen export-to-Excel reinbasteln, sodass das dann in Excel hoffentlich wieder halbwegs vernünftig dargestellt wird.


----------



## TessaKavanagh (10. Juli 2014)

Ok also das mit dem kein Simples Projekt, das Login etc. 

wenn ich so an mein Anfänge zurückdenke, dann ist es das vermutlich wirklich nicht. Ich habe damals mit einer News Funktion für eine Website angefangen.  (Eintag erstellen -> in DB Eintragen -> Aus DB Ausgeben -> Nach 9 Neuen Einträgen Eintrag löschen.)

Ich habe auch beruflich nie was mit Programmieren zu tun gehabt x-D. Das was ich weiß habe ich eben durch Coden "gelernt". Jedes Projekt wieder ne Stufe schwerer oder eben effizienteren Code und seit nunmehr 2 Jahren arbeite ich jetzt an einem Browsergame.


----------



## boss3D (10. Juli 2014)

Es kommt zwar keine Fehlermeldung, aber irgendwas haben "wir" trotzdem verpfuscht. Es landen nämlich keine Einträge mehr in der DB. Hier nochmal alles:

```
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;  
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag","dienstag","mittwoch","donnerstag","freitag","samstag","sonntag");   
    $data = array("mo","di","mi","do","fr","sa","so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, user, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$user', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>
```
[EDIT]
Stimmt schon. "user" hatte ich in der "zeiten" Tabelle schon gelöscht, wo wir die Identifikation jetzt nur noch über die ID machen, allerdingst stand der noch im INSERT drinnen. _*facepalm*
--------------

_Also gut, wie soll ich jetzt wirklich zu einer mehrfachen Zeilenausgabe kommen? Javascript? Was anderes?

Am einfachsten wär's wohl, den Fehler in Tessa's vier Zeilen zu finden, wenn das sonst prinzipiell so ginge ...

```
function interpretRequest() {
        var ContNeu= request.responseText;
        var ContAlt = document.getElementByID('content').innerHTML;
        var content = ContAlt + ContNeu;
        document.getElementById('content').innerHTML = content;
    }
```



DarkMo schrieb:


> oder man machts wieder per php und der buttonklick  (name bspw edit)  lässt die seite erneut laden, nur dass diesmal die  gewünschte zeile eben  mit inputs generiert wird zum editieren.


Was ist denn hier eigentlich das genaue Problem bei mir? Der Button funktioniert ja, allerdings ersetzt er immer die eine Zeile, die er beim ersten Klicken erstellt, mit einer weiteren, anstatt die darunter anzufügen. Blöd gefragt, aber kann ich nicht einfach "an der richtigen Stelle" irgendwo ein <br> einfügen und das Problem wäre gelöst???

Oder irgendwo ne kleine "Abfrage" basteln, die ermittelt, wo auf der Hompage die erste Zeile endet, und dann dem Javscript sagt "Füge die nächste Zeile an Position+1 ein"?


----------



## DarkMo (10. Juli 2014)

boss3D schrieb:


> Ich muss das machen, was der Auftraggeber haben will und da gehört ein Login-System dazu. Dass ich keine wirklichen php-Kentnisse habe, weiß er eh, aber die Aufgabe ist nun mal so. Deswegen habe ich ja auch so "lange" für das Projekt Zeit, eben um mich einarbeiten zu können.


mir gings eher um das "variable Anzahl an Datensätze  erstellen" ^^ geht sicherlich, aber sowas is immer ne ganze ecke denkarbeit. wobei man hier warscheinlich mit diesem namens.array zeugs arbeiten kann. das mit dem login is sicher auch ned leicht, aber mMn eben eine notwendigkeit, das zweifel ich daher überhaupt nicht an 



boss3D schrieb:


> Damit habe ich schon ein bisschen rumprobiert, hat aber nie wirklich funktioniert. Entweder mein style="whatever" wurde einfach nicht übernommen, oder er hat mir in den Dropdowns die obersten Einträge gelöscht.


das is halt auch so ein punkt - wieso? wenn ich echo "hallo welt" schreibe, dann kommt da einfach kein "allo welt" bei raus ^^ also da muss irgendwas anderes schief laufen. vllt nen < oder so vergessen, passiert mir auch oft. hatte bei meinem bsp den form-tag nicht abgeschlossen und mich gewundert, warum er alles in eine zeile klatscht ^^



boss3D schrieb:


> Da hatte ich eigentlich den von Tessa mit dem Switch gemeint. Deinen habe ich mir schon angeschaut, aber ich bin noch damit beschäftigt, die Probleme in meinem zu lösen.


hier stellt sich mir eben die grundsätzliche und dringende frage: lohnt sich das überhaupt? das is alles so dermaßen verwurschtelt und unnötig kompliziert :/ also wenn das immernoch so aussieht wie das, was du da mal angehängt hattest.



boss3D schrieb:


> Mein Ziel wäre jetzt eben, bis morgen Abend das gesamte Eingabeformular fertig zu haben. Dazu braucht's eben noch eine optische Formatierung der Zellenbreite der dynamischen Zeile und das mehrfache Funktionieren meines Buttons. Dann ist Halbzeit. Am WE will ich mich dann richtig in deine/eure Beispiele reindenken.


das sind zum bsp probleme, bei denen ich mich einfach nur frag, wie du das hinbekommst  wie gesagt, alles viel zu verwurschtelt, da blickt doch keiner mehr durch ^^ also das is jetz mein problem dabei, ich hab keinen blassen, was das alles sein soll, wieso weshalb warum. ich kann dir daher auch nicht wirklich speziefisch irgendwo helfen. ich find den ganzen code einfach schrecklich ><



boss3D schrieb:


> Und ab nächster Woche bin ich dann hoffentlich so weit, dass ich die zweite Halbzeit zum Basteln des "Gegenstücks" hernehmen und das dann hoffentlich auch weitestgehend selber schaffen kann. Das soll dann eine zweite Website nur für den Admin werden, auf der dieser Daten aus der DB von allen MAs abfragen und sich anzeigen lassen kann. Da sollte ich dann auch noch einen export-to-Excel reinbasteln, sodass das dann in Excel hoffentlich wieder halbwegs vernünftig dargestellt wird.


 wozu brauchst du ein gegenstück? wenn es nur mitarbeiter und den admin gibt, ist das ne ganz simple geschichte: erweitere deine user-tabelle um die spalte "Rechte" oder wie auch immer und gib dem admin da ne 1 und den anderen allen ne 0. und abhängig davon baust du dann die seite auf. zum bsp sowas:

```
// get user data - irgendwo ganz oben
$admin = false;
if($row['Rechte'] == 1) $admin = true;

// ...

// select table-content - also die einträge zum anzeigen
if($admin) $sql = "SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName   FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p  WHERE  z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID =  p.ID AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende."';"
else $sql = "SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName   FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p  WHERE  z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID =  p.ID AND  z.User-ID = '".$aktueller_user."' AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende."';"
// der "user-filter" wird beim admin weggelassen bspw
$res = ....
// baue tabelle mit abfrage-daten...
```
das wäre jetzt ein simples beispiel. oder wenn es "erweiterbar" sein soll, isses von der logik her vllt günstiger, dem admin die 0 zu geben. kleinste zahl = höchste rechte oder so.


----------



## DarkMo (10. Juli 2014)

nur mal für mich zum mitmeiseln: WAS willst du jetzt genau hier bewirken?

```
function interpretRequest() {
  var ContNeu= request.responseText;
  var ContAlt = document.getElementByID('content').innerHTML;
  var content = ContAlt + ContNeu;
  document.getElementById('content').innerHTML = content;
}
```
also ich hab mir das (vom zuhören) so zusammen gereimt:
du möchtest deiner tabelle mit dem button-klick eine zeile hinzufügen. der buttonklick ruft allerdings eben diese js funktion auf und lädt nicht die seite neu (und sendet somit auch nicht das formular). ist das richtig?

dann die nächste frage: was ist content für ein element? also irgendwas bei dir hat ja ein id="content" dran - was?

und die vorerst letzte frage: was ist request.responseText; ^^ was für daten holt er sich da? woher?


----------



## boss3D (10. Juli 2014)

DarkMo schrieb:


> hier stellt sich mir eben die grundsätzliche und dringende frage: lohnt sich das überhaupt? das is alles so dermaßen verwurschtelt und unnötig kompliziert :/ also wenn das immernoch so aussieht wie das, was du da mal angehängt hattest.


Der Code von Tessa war mir auch zu kompliziert, aber ich habe den dann eben deswegen eh nicht verwendet. Ihr/Sein Code macht halt mehrere Dinge auf einmal, die ich auf mehrere Files verteilt habe (und dadurch noch die Übersicht habe).


DarkMo schrieb:


> das sind zum bsp probleme, bei denen ich mich einfach nur frag, wie du das hinbekommst  wie gesagt, alles viel zu verwurschtelt, da blickt doch keiner mehr durch


Ich finde das jetzt nicht unüberschaubar.

Hier, ganz einfach --> dynamictable.php macht nichts anderes, als einfach die gesamte Zeile zu bauen (ist sogar Code von dir drinnen ):

```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

    echo '<table>';

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

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

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

    echo '<td><input name="montag" type="text" size="10" maxlength="5""></td>';
    echo '<td><input name="dienstag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="mittwoch" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="donnerstag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="freitag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="samstag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="sonntag" type="text" size="10" maxlength="5"></td></tr></table><br>';
?>
```
Und in projektzeiterfassung1.html wird der Inhalt dieses ganzen php-Files einfach nur durch das Javascript reingeholt und dann an der Stelle von "content" ausgegeben:

```
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Projektzeiterfassung</title>
<br><script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var ContNeu= request.responseText;
            var ContAlt = document.getElementByID('content').innerHTML;
            var content = ContAlt + ContNeu;
            document.getElementById('content').innerHTML = content;
        }
    }
    
    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
    }
</script>
</head> 
<body>
<form action="formular.php" method="post">
    <br><h1>Projektzeiterfassung</h1>
    <table>
        <tr><th>Tätigkeit</th>
        <th>Produkt</th>
        <th>Beschreibung</th>
        <th width="150">MO <input name="mo" type="text" size="10" maxlength="10"></th>
        <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
        <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
        <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
        <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
        <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
        <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th></tr>
    </table><br>    
    <div id="content"></div>
    <div class="submit"><input type="button" onClick="javascript:setRequest()" value="Neue Eingabezeile hinzufügen"></div><br>
    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form> 
</body>
</html>
```



DarkMo schrieb:


> wozu brauchst du ein gegenstück? wenn es nur mitarbeiter und den admin gibt, ist das ne ganz simple geschichte: erweitere deine user-tabelle um die spalte "Rechte" oder wie auch immer und gib dem admin da ne 1 und den anderen allen ne 0. und abhängig davon baust du dann die seite auf.


Okay, so geht's natürlich auch. Aber warum einfach, wenn's auch kompliziert geht? 
--------------

Jedenfalls wäre das jetzt meine aktuelle Frage:


boss3D schrieb:


> Was ist denn hier eigentlich das genaue Problem  bei mir? Der Button funktioniert ja, allerdings ersetzt er immer die  eine Zeile, die er beim ersten Klicken erstellt, mit einer weiteren,  anstatt die darunter anzufügen. Blöd gefragt, aber kann ich nicht  einfach "an der richtigen Stelle" irgendwo ein <br> einfügen und  das Problem wäre gelöst???
> 
> Oder irgendwo ne kleine "Abfrage"  basteln, die ermittelt, wo auf der Hompage die erste Zeile endet, und  dann dem Javscript sagt "Füge die nächste Zeile an Position+1  ein"?


--------------


DarkMo schrieb:


> nur mal für mich zum mitmeiseln: WAS willst du jetzt genau hier bewirken?


Ich glaube, Tessa's Idee damit war, die eine Zeile zu speichern und beim nächsten Button-Klick dann schon zwei Zeile ausgeben, wobei die obere die ursprüngliche Zeile überschreibt?! Damit habe ich aber trotzdem 2. Und dann so weiter mit weiteren Zeilen?! Wobei die vom User schon in Zeile eingegebene Daten natürlich nicht verloren gehen sollten! Wird das in dem Code irgendwo gespeichert, was schon in einer Zeile steht? K. A.


DarkMo schrieb:


> du möchtest deiner tabelle mit dem button-klick  eine zeile hinzufügen. der buttonklick ruft allerdings eben diese js  funktion auf und lädt nicht die seite neu (und sendet somit auch nicht  das formular). ist das richtig?


Nach meinem Verständnis, ja.


DarkMo schrieb:


> dann die nächste frage: was ist content für ein element? also irgendwas bei dir hat ja ein id="content" dran - was?


Was meinst du mit "Element"? Ich habe mir das immer als "Platzhalter" vorgestellt, der durch den Inhalt von dynamictable.php, die durch das Javascript aufgerufen wird, ersetzt wird?!


DarkMo schrieb:


> und die vorerst letzte frage: was ist request.responseText; ^^ was für daten holt er sich da? woher?


Ich habe keine Ahnung, ich kann kein Javascript. Der Code ist aus dem Web, und dann von Tessa zu erweitern versucht worden. Ich weiß nur, dass der Code in der originalen Version (also vor Tessa's Erweiterung) funktioniert.


----------



## DarkMo (10. Juli 2014)

aaaaah, jetz versteh ich auf anhieb so manches problem  wie gesagt, absolut unnötig kompliziert. du nutzt php und lässt dir irgendwelchen krempel durch JAVASCRIPT?! reinladen? bitte? xD

zumal du den "tabellenkopf" als ne abgeschlossene tabelle behandelst und den "inhalt" der tabelle als neue tabelle untendrunter klatscht - is doch klar, dass dir hier keinerlei einheitliche formatierung gelingt. ich hab grad dieses tisch->kopf syndrom xD

und bitte frag jetzt nicht, wie du ohne js dein php krams da rein bekommen sollst. benenn deine htm in php um, belass alles wie es ist bis auf eines: mach aus

```
<div id="content"></div>
```
einfach ein

```
<?php
   include('meinen-php-kram');
?>
```

das ändert noch rein garnix an deinen problemen, aber du hast schonmal das selbe gekonnt ohne js. wenn du jetzt anstatt des includes einfach deinen code direkt da reinbastelst - fertig. haste immernoch html und php getrennt, aber eben in einem. das is wie gesagt völlig unnötig. nun zu der tabelle:
dein </table> aus der ehemaligen htm verschiebst du UNTER deinen content div. bei deinem php teil hingegen löscht du die table-tags. damit sollte das problem schonmal gelöst sein, nun hast du EINE tabelle und fertig.

jetzt ergibt sich zumindest schonmal ne weitere antwort: was ist dieses content teil ^^ gut, jetzt bleibt mir eben die frage, was ist dieses request gedöhns. wenn da ne tabellenzeile rein soll, dann wird das so nich gehn (ob das überhaupt geht? kA ^^). ich bin gespannt


----------



## boss3D (10. Juli 2014)

Na, das schaut doch endlich mal was z'gleich ... 

```
<!doctype html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Projektzeiterfassung</title>
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var ContNeu= request.responseText;
            var ContAlt = document.getElementByID('content').innerHTML;
            var content = ContAlt + ContNeu;
            document.getElementById('content').innerHTML = content;
        }
    }
    
    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
    }
</script>
</head> 
<body>
<form action="formular.php" method="post">
    <br><h1>Projektzeiterfassung</h1>
    <table>
        <tr><th>Tätigkeit</th>
        <th>Produkt</th>
        <th>Beschreibung</th>
        <th width="150">MO <input name="mo" type="text" size="10" maxlength="10"></th>
        <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
        <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
        <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
        <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
        <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
        <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th></tr>    
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

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

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

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

    echo '<td><input name="montag" type="text" size="10" maxlength="5""></td>';
    echo '<td><input name="dienstag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="mittwoch" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="donnerstag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="freitag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="samstag" type="text" size="10" maxlength="5"></td>';
    echo '<td><input name="sonntag" type="text" size="10" maxlength="5"></td></tr><br>';
?>
    </table><br>
    <div class="submit"><input type="button" onClick="javascript:setRequest()" value="Neue Eingabezeile hinzufügen"></div><br>
    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form> 
</body>
</html>
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Was ich jetzt aber noch nicht verstanden habe: Das "<div id="content"></div>" sollte ich durch den php-Code ersetzen?! Damit kann ich auch das Javascript rausschmeißen, oder? Ohne das "content" tut das eh nichts mehr. Allerdings, wie soll ich jetzt wirklich weitere Zeilen dazukriegen?


----------



## DarkMo (10. Juli 2014)

boss3D schrieb:


> Was meinst du mit "Element"? Ich habe mir das immer als "Platzhalter"  vorgestellt, der durch den Inhalt von dynamictable.php, die durch das  Javascript aufgerufen wird, ersetzt wird?!


 ich bin da jetzt auch kein hecht mit, aber soweit bin ich da schon durchgestiegen:
du hast bei html ja verschiedene tags - also besagte "elemente". ein div-container (wie bei dir genutzt) ist zum bsp so ein element. per javascript kann man dadrauf eben zugreifen. man kann parameter ändern (zum bsp die css-klasse abändern) oder auch den inhalt ändern (was hier versucht werden soll) -> das wäre das innerhtml. also <div>innerHTML</div>. WIE man jetzt auf dieses element zugreift... da gibts wohl verschiedene wege. ich glaube man kann in einer art "array-verfahren" zugreifen - also nach der reihenfolge des auftauchens im html-"code". meinetwegen sowas hier: <div></div><p></p> - da kann man mittels (erfunden) document (meint eben die html seite), also document.element[0] -> auf das div zugreifen, mit [1] hätte man das p ding. wie gesagt, ich glaube, so in der art geht das. auch kann man sich so durch ne art hierarschie durcharbeiten. also ein p im div, da müsste man quasi document.div.p - so in etwa drankomen. das ist alles sicher weit entfernbt von der wahrheit, aber so in etwa kann man sichs galube vorstellen. das is halt alles ebbes umständlich und meistens wird eben das mit der id genutzt. du gibst deinem teil da einfach ne id (<div id="bla">...</div>) und kannst dann mittels document.getElementByID("bla") drauf zugreifen - fettich issed. document.getElementByID("bla").innerHTML wäre dann eben in diesem bsp einfach ... ^^

gut, was bedeuted das jetzt also? du hast dieses div und da sollen deine zeilen rein. einfachste lösung: du baust da jetz immer ne tabelle rein mit einer eingabezeile. bei 3 "zeilen" haste halt 3 tabellen mit je einer zeile. das geht definitiv - aber schön is was anderes. grundfunktionsweise: du baust dir einmal hardcoded eine tabelle als string und speicherst das eben in ner variablen. das ersetzt dann das ContNeu. das soll nämlich das sein, was immer hinzugefügt wird. kannst es ja mal ganz simpel in der art testen:

```
var ContNeu= "<table><tr><td>test</td></tr></table>";
var ContAlt = document.getElementByID('content').innerHTML;
var content = ContAlt + ContNeu;
document.getElementById('content').innerHTML = content;
```
bei jeden klick (sofern das funzt) sollte er eine tabelle mit einer zelle in der test steht reinmeiseln. eine unter die andere. bei den inputs kannst du dann wie gesagt mal testen, ob es einfach mit name="name[]" funzt. sollte eigentlich. aber da haste dann halt wie gesagt immer einzeltabellen. kannst ja mal googlen, ob man tabellenzeilen mittels js adden kann. wenn nich, müssmer mal schauen, was wir machen. ich muss aber erstmal los :/

edit: wegen dem content div - lass es testweise erstmal drin, damit wir weiter spielen können. dein php zeugs, was das ersetzen sollte, ist ja (dacht ich) eher für die ausgabe der db daten, dein content-div aber für die erstellung der eingabemaske.


----------



## TessaKavanagh (10. Juli 2014)

Also das Tisch Kopf hatte ich schon früher. Da ist aber noch ein Denkfehler von dir drinn Mo 

Denn wenn er sein JavaScript verwendet braucht er genau dieses <div id="content">Platzhalter</div>
Sein JavaScript ist eben AJAX das heißt er führt einen HTTP Request aus ohne dabei die Seite neu zu laden, das Ergebnis des Requests wird dann im Platzhalter (<div id="content"></div>) in die bestehende Website eingesetzt. Der von Ihm verwendete Befehl (document.getElementById('content').innerHTML = content hat aber die Angewohnheit das er den gesamten Inhalt des Platzhalters ersetzt und eben nichts an diesen anhängt.
Das PHP Script wird nicht in die Seite included, es wird lediglich am Server ausgeführt und das Ergebnis in ein bestehendes "html" Dokument Clientseitig eingesetzt.
Ein Include würde hingegen den PHP Code in ein bestehendes PHP Dokument einbinden und das Gesamtergebnis ausgeben. Also alles Server Seitig.

Ergo musst du in diesem Fall die gesamte Website neu laden damit der User das Ergebnis sehen kann.(hierdurch würden auch die Nutzer eingaben verloren gehen, außer du pufferst Sie entsprechend zwischen. Das tut er aber bisher nirgends.)

Der Code oben wurde von mir so angepasst das er den Inhalt der Bereits zwischen den DIV tags steht in einer Variable Speichern soll und diese Variable dann mit dem Ergebnis des PHP Scripts verketten soll. Um im Ergebnis danach zwei Zeilen zu haben. Vorher wurde von Ihm ja immer die bereits bestehende Zeile durch eine neue (optisch) gleiche Zeile ersetzt. Was so aussah als würde der Button nur einmal funktionieren, denn die erste Zeile entstand ja erst nach erstmaligem betätigen des Buttons, da gab es noch keine Zeile zu ersetzen.

Mir gefällt diese Lösung übrigens nicht 


```
<html><head><title>Test</title>
<script type="text/javascript">

var Neu = "neuer <b>fetter<\/b> Text";
function Aendern () {
var old = document.all.meinAbsatz.innerHTML;
var save = old + Neu;
document.all.meinAbsatz.innerHTML = save;

}
</script>
</head><body>
<p id="meinAbsatz">Text</p>
<a href="javascript:Aendern()">Anderer Text</a>
</body></html>
```

Das gleiche Prinzip, aber keine Ahnung warum es oben nicht klappt. Das Beispiel geht jedenfalls.


----------



## boss3D (10. Juli 2014)

@DarkMo
Deine Code-Version funktioniert auch nicht.





DarkMo schrieb:


> edit: wegen dem content div - lass es testweise erstmal drin, damit wir weiter spielen können. dein php zeugs, was das ersetzen sollte, ist ja (dacht ich) eher für die ausgabe der db daten, dein content-div aber für die erstellung der eingabemaske.


Blöd ist halt jetzt nur, dass wir den gesamten Code von dynamictable.php praktisch zwei mal nutzen. Einmal haben wir ihn in projektzeiterfassung.html, das ja jetzt "projektzeiterfassung.php" heißt, reinkopiert. Und darin rufen wir ihn aber durch das Javascript nochmal auf. 

Ich schaue mir jetzt Tessa's Code an.


----------



## DarkMo (10. Juli 2014)

so, wieder da. was macht denn der php code der da eingebaut wird? ich dachte, der erstellt die tabelle, die anzeigt, was in der db alles drin steht. und das muss so oder so beim seitenladen einmal durchn server rödeln. die eingabe per js zu basteln is ja an sich ok, aber hat doch rein garnix mit dieser "php tabelle" zu tun.

wie gesagt, dieses ganze konstrukt is doch einfach nur zum an die decke laufen >< wozu brauch man überhaupt unbedingt "20" eingabezeilen? kann man doch auch alle nacheinander eingeben. unnötig kompliziert *find*


----------



## TessaKavanagh (10. Juli 2014)

@DarkMo es gibt bisher keine Tabelle um die Datensätze auszugeben er nutzt die Tabelle um alle Daten EIN zu geben.


----------



## DarkMo (10. Juli 2014)

na das muss man auch erstmal wissen. und wozu wird da jetzt ne php tabelle genommen, wenn das doch per js gelöst werden soll? naja, egal wie, ich finds unsinnig und schade, dass man damit zeit verschwendet :/


----------



## DarkMo (10. Juli 2014)

ihr macht mich kirre hier. schauts euch mal an:

zeit.php

```
<?php
  echo '<html>
          <head>
            <title>beispiel</title>
            <script src="zeit.js" type="text/javascript"></script>
          </head>
          <body>';
  
  $db_count = 0;
  $output = '';
  
  if(isset($_POST['db_count'])) $db_count = $_POST['db_count'];
  if(isset($_POST['btnAdd'])) {
    $count = $_POST['count'];
    foreach($_POST['input'] as $in) {
      $output .= 'Simulation: Eintrag "'.$in.'" in DB erstellt!<br>';
    }
    $db_count += $count;
  }
  if(isset($_POST['btnDel'])) {
    $db_count--;
    $output = 'Simulation: Eintrag aus DB gelöscht!<br>';
  }

  echo '<p>'.$output.'</p>';
  
  echo '<form action="zeit.php" method="post">';
  echo '<table border="1" id="content">';
  echo '  <tr>';
  echo '    <td>eine Tabelle</td>';
  echo '    <td>Einträge</td>';
  echo '  </tr>';
  
  for($i = 0; $i < $db_count; $i++) {
    echo '  <tr>';
    echo '    <td>'.($i + 1).'. Eintrag</td>';
    echo '    <td><input type="submit" value="del" name="btnDel"></td>';
    echo '  </tr>';
  }

  echo '  <tr>';
  echo '    <td>selbe Tabelle</td>';
  echo '    <td>Inputs</td>';
  echo '  </tr>';
  echo '</table>';
  echo '<input type="hidden" value="'.$db_count.'" name="db_count">';
  echo '<input type="hidden" value="0" name="count" id="count">';

  echo '<input type="submit" value="Add Entry" name="btnAdd"> <button type="button" onclick="javascript:add_line();">Add Input</button>';
  
  echo '</form>';
  
  echo '  </body>
        </html>';
?>
```

zeit.js

```
function add_line() {
  var count = parseInt(document.getElementById('count').value) + 1;
  var add = '<tr><td><input type="text" name="input[' + (count - 1) + ']"></td><td>' + count + '</td></tr>';
  var div = document.getElementById('content');
  div.innerHTML += add;
  document.getElementById('count').value = count;
}
```

mein letztes bsp erweitert. ohne echte db anbindung natürlich nich sehr ordentlich umsetzbar, was die einträge in der tabelle betrifft, aber ich denke, der weg ist erkennbar 

grundaufbau:
ich hab meine bisherige tabelle, die die daten aus der db anzeigt erweitert um die variablen inputs. add input fügt eine tabellenzeile hinzu (die müsstest natürlich an deine wünsche anpassen, ist hier exemplarisch) (kein seitenreload) und add entry haut alle diese daten in die "db" (hier ist dann seitenreload).


----------



## boss3D (11. Juli 2014)

So sicher bin ich mir gerade nicht mehr, dass mein Button tatsächlich funktioniert. Ich habe jetzt testweise verschiedene Javascripte damit aufzurufen probiert, aber es ist gar keines ausgeführt worden?!

Jedenfalls habe ich das ganze Zeug jetzt mal rausgeschmissen und überlege wieder weiter, wie ich neue Tabellenzeilen hinzufügen lassen könnte ...

[EDIT]
Yes! Langsam wird's! Wer hätte gedacht, dass es mit so wenig Code gehen würde ... 

```
<script type="text/javascript">
    function add_row() {
        var nummer = 1;
        var table_id = "t1";
        var trhtml = document.getElementById(table_id).insertRow(nummer);
        tdhtml = document.createElement("td");
        tdhtml.innerHTML = 'content';
        trhtml.appendChild(tdhtml);
    }
</script>

<div class="submit"><input type="button" onClick="javascript:add_row()" value="Neue Eingabezeile hinzufügen"></div><br>
```
Liefert:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Jetzt muss ich es nur noch schaffen, dass statt "content" eben meine Zeile eingefügt wird, und dann das ganze noch so umzudrehen, dass die neuen Zeile darunter und nicht darüber angehängt werden. 
Letzteres passiert, vermute ich, durch die Table-ID (im Code habe ich jetzt <table id="t1">). Dadurch wird die neue Zeile immer an den Header angehängt.

[EDIT2]
Endlich mal ein Javascript, das ich auch verstehe. Jetzt muss ich 'content' durch den Code meiner Zeile ersetzen, der in dynamictable.php steht. Fragt sich nur, wie ich die vom Javascript aufrufen lassen kann.


----------



## TessaKavanagh (11. Juli 2014)

Mein Vorschlag:

Du tauscht die Rheinfolge der Buttons aus und machst für "newLine" ein eigenes Formular auf. In deinem Code oben würde der Ausschnitt dann so aussehen:

```
echo '</table><br>';
    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
    echo '</form> ';
    // Hier endet das "alte" Formular.
    //Ab hier beginnt das Formular um eine neue Zeile zu erstellen.
    echo '<form action="formular.php" method="post">';

    echo '<div class="submit"><input type="hidden" name="add" value="'.$add.'">';
    echo '<input type="button" name="newLine" value="Neue Eingabezeile hinzufügen"></div><br>';
    echo '</form> ';

?>
```
Dieser Codeteil ersetzt:

```
?>
    </table><br>
    <div class="submit"><input type="button" name="newLine" value="Neue Eingabezeile hinzufügen"></div><br>
    <div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>
</form>
```

Dann musst du natürlich noch die Daten auswerten.


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

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

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

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

Das ersetzt:

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

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

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

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


----------



## boss3D (11. Juli 2014)

Die einfachste Lsg habe ich, denke ich, schon gefunden, siehe voriges Posting. Ich glaube nämlich, wenn ich es schaffe, meine dynamictable.php im Javascript aufzurufen (bei innerHTML), dann kann ich den ganzen php Code wieder aus dem urspünglichen html File rausschmeißen?!

Fragt sich nur, wie ich dynamictable.php ins Javascript reinkriegen soll. Da bin ich gerade am googlen ...


----------



## TessaKavanagh (11. Juli 2014)

Dir ist aber schon klar das PHP eine Serverseitige Scriptsprache ist und JavaScript eine Clientseitige?

Das hat zur folge das du NIE PHP Code in einem JavaScript ausführen kannst. Dir steht maximal das interpretierte Ergebnis also im Endeffekt was die echo""; befehle erzeugen dieses Codes zur Verfügung. Aber nie der Code an sich. Denn den gibt der Server nicht an den Nutzer raus.

Das ist genau das was das ursprüngliche JavaScript gemacht hat AJAX(Asynchrones Javascript) es hat ein http Request an den Server gesendet. Der Server hat darauf hin den Code in der PHP Datei geparst/interpretiert und hat das Ergebnis dann an das JavaScript gesendet. Das Java Script hat das Ergebniss des Codes dann in die Seite eingebaut.

Wenn du das also mit JavaScript lösen willst, dann kommst du um eben diese Konstruktion nicht herum, denn du kannst den PHP Code schlicht und einfach nicht direkt in JavaScipr einbinden.


----------



## boss3D (11. Juli 2014)

Ja, das ist mir schon klar. Deswegen kann ich ja auch nicht "innerHTML='dynamictable.php';" sagen, wäre ja auch zu schön gewesen ...

Wir haben es ja mit dem alten Javascript Code geschafft, die dynamictable.php aufzurufen. Deswegen versuche ich gerade, mir eine "Mischung" aus den beiden Javascripten zu basteln. Das alte schafft's, das php-Script aufzurufen, das neue schafft's, mehrere Zeilen an die Tabelle anzufügen. Nur, wie kombinieren? 

Bis jetzt bin ich nur auf Käse gekommen, aber ich hoffe, das wird noch ...

```
<script type="text/javascript">
    var request = false;

    function setRequest() {
        request = new XMLHttpRequest();
        
        if (!request) {
            alert("Kann keine XMLHTTP-Instanz erzeugen");
            return false;
        } else {
            var url = "dynamictable.php";
            request.open('post', url, true);
            request.send(null);
            request.onreadystatechange = interpretRequest;
        }
    }
    
    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
    }
</script>
```


```
<script type="text/javascript">
    function add_row() {
        var table_id = "t1";
        var trhtml = document.getElementById(table_id).insertRow(1);
        tdhtml = document.createElement("td");
        tdhtml.innerHTML = 'hola';
        trhtml.appendChild(tdhtml);
    }
</script>
```
[EDIT]
Das ist mir schon klar. Ich hätte es jetzt mal so probiert ...

```
<script type="text/javascript">
    function add_row() {
        var table_id = "t1";
        var trhtml = document.getElementById(table_id).insertRow(1);
        var url = "dynamictable.php";
        tdhtml = document.createElement("td");
        tdhtml.innerHTML = request.open('post', url, true);;
        trhtml.appendChild(tdhtml);
    }
</script>
```
... aber da funktioniert dann wieder die Mehrfacherstellung nicht mehr.


----------



## boss3D (11. Juli 2014)

So irgendwie ...

```
<script type="text/javascript">
    var table_id = "t1";
    var trhtml = document.getElementById(table_id).insertRow(1);    
    var url = "dynamictable.php";
    
    function add_row() {        
        request.open('post', url, true);
        request.send(null);
        request.onreadystatechange = interpretRequest;
        
    function interpretRequest() {
        var content = request.responseText;
        document.getElementById('content').innerHTML = content;
        tdhtml = document.createElement("td");
        tdhtml.innerHTML = content;
        trhtml.appendChild(tdhtml);
    }
</script>
```
^^ Aber genau so geht's nicht.


----------



## TessaKavanagh (11. Juli 2014)

Fassen wir mal zusammen. Selbst wenn du es mit dem jetzigen JavaScript irgendwann schaffen solltest das er die Tabellenzeilen anfügt und somit mit jedem Klick eine neue Zeile erstellt wird, hast du immer noch das Problem das weder dein INSERT Code noch die Struktur des daraus erstellten Formulars derzeit dazu geeignet ist die Daten die daraus entstehen in der DB zu speichern.

Fazit:
Solltest du die Tabelle entsprechend erstellen, kannst du danach deinen PHP Code wieder umschreiben, denn er ist aktuell nicht darauf ausgelegt mehrere Einträge in die DB zu schreiben. Außerdem heißen alle deine Inputfelder gleich und du verwendest kein Array. Ergo kann die Post Variable gar nicht alle Daten erfassen und an das PHP Script übertragen.

Oder mit anderen Worten, das was du da versuchst ist alles andere als die einfachste Lösung


----------



## boss3D (11. Juli 2014)

Ich habe nur leider bis jetzt noch keine andere Lösung zum mehrfachen Einfügen meiner Zeile gesehen, die ich auch verstanden hätte ...

Wenn ich wüsste, wie genau ich es mit php machen könnte, hätte ich das längst gemacht. Aber ihr postet hier immer irgendwelche Codes, die was weiß ich alles machen, mit meinem aber gar nicht zusammenpassen, und ich soll mir dann die Zeilen raussuchen, die das machen was ich gerade brauche, und dann so verändert bei mir einfügen, dass ich das selbe Ergebnis kriege. Und auskennen tue ich mich am Ende gar nicht mehr ...

Auf jeden Fall stört mich der ganze php Code in meinem projektzeiterfassung-File extrem, das ja ursprünglich ein html File war. Ich möchte das wieder irgendwie getrennt haben. Bei dem ganzen Codegemisch habe ich schon bald gar keinen Überblick mehr, was eigentlich was macht.

Und mich nervt das immer noch, dass ich da überhaupt so kompliziert rumbasteln muss. Warum reicht's denn nicht, einfach irgendwo <?php include("dynamictable.php");<br> ?> zu sagen? Es geht ja nur drum, dass der Button neue Zeilen unterhalb bestehender einfügt und die nicht ständig überschreibt.

BTW: Was sollte eigentlich der Sinn deines Codes aus Posting #205 sein? Bei "Bestätigen" produziert er 3 Fehler und bei "Neue Zeile hinzufügen" macht er gar nichts ...

Ich bin jedenfalls kurz davor, meine dynamische Zeile einfach 20 Mal statisch ausgeben zu lassen. Bis ~SA Abend probiere ich noch rum, aber wenn's dann immer noch nicht geht, habe ich keine Zeit mehr, mich weiter damit zu befassen. Ab nächster Woche will ich dann schon die Auswertung der Daten durch den Admin machen. Wenn das sich zeitlich nicht mehr ausginge, wär's weitaus schlimmer.


----------



## TessaKavanagh (11. Juli 2014)

Hast du dir meinen Code oben mal angeschaut? Der Basiert auf deinem CODE ohne JavaScript . Er erweitert das ganze um Ein Formularfeld eine POST abfrage und eine Forschleife und er nutzt die dynamiktable.php zur Zeilenerstellung.


----------



## boss3D (11. Juli 2014)

^^ Ja, siehe ab "BTW". Habe noch rumeditiert.


----------



## TessaKavanagh (11. Juli 2014)

Das er bei Bestätigen Fehler produziert ist logisch, denn das Script zum eintragen in die DB ist noch nicht angepasst um mehrere Einträge zu verarbeiten.

Kannst du mir mal sagen wie die Datei in der der code steht heißt?

[EDIT] 

Kannst du hinter $add++; mal ein echo $add; machen? Nicht das $add ein string ist.


----------



## boss3D (11. Juli 2014)

Ja, irgendwelche Variablen hast du wieder zu arrays gemacht, die ich natürlich nicht hatte, und deswegen kriege ich jetzt wieder haufenweise Index Fehler ...

projektzeiterfassung.php


Spoiler





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

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

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

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

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

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr><br>';
    } 
    echo '</table><br>';
    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
    echo '</form> ';
    // Hier endet das "alte" Formular.
    //Ab hier beginnt das Formular um eine neue Zeile zu erstellen.
    echo '<form action="formular.php" method="post">';

    echo '<div class="submit"><input type="hidden" name="add" value="'.$add.'">';
    echo '<input type="button" name="newLine" value="Neue Eingabezeile hinzufügen"></div><br>';
    echo '</form> ';
?> 
</body>
</html>
```



dynamictable.php


Spoiler





```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

    echo '<table>';

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

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

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

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



Und hier in projektzeiterfassung2.php kriege ich jetzt wegen Zeile 11, 12 und 13 die Index Fehler, weil da die Variablen natürlich keine arrays sind:


Spoiler





```
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;  
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag", "sonntag");   
    $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>
```


----------



## TessaKavanagh (11. Juli 2014)

Warum Garnichts passiert ist jetzt auch klar das Formular ruft ja "formular.php" auf, die Datei heißt aber "projektzeiterfassung.php"  Das muss natürlich dann action="projektzeiterfassung.php" heißen.

Das Eintragen ist schnell geändert. Darum kümmern wir uns sobald die Tabelle richtig aufgebaut wird.


----------



## boss3D (11. Juli 2014)

Ich blicke da gar nicht mehr durch... Die Seite soll sich jetzt selbst aufrufen? Außerdem haben wir zweimal action="formular.php" im Code stehen; wo soll ich's denn ändern?

[EDIT]
Ist eh egal, welches ich ändere. Passiert trotzdem in beiden Fällen nichts.

Ich persönlich hätte ja eher vermutet, dass ich "formular.php" irgendwo durch "dynamictable.php" ersetzen muss, aber da kommt auch nur Schmarren raus.


----------



## TessaKavanagh (11. Juli 2014)

Ja die Seite soll sich selber Aufrufen, genau das ist ja der Sinn der Sache, denn jedes mal wenn sich die Seite selber wieder aufruft erhöht sich 'add' um 1. Dadurch wird bei jedem Aufruf eine Tabellenzeile mehr ausgegeben.


[EDIT]

AHHHHHH Bäng Kopf Tisch!

Alter Falter Das unten ist ein Button und kein Submit -.- Wie blöd bin ich denn. 

Also beim zweiten Formular.php

Gehört projektzeiterfassung.php rein

Außerdem muss aus dem type="Button" ein type="Submit" werden.


----------



## boss3D (11. Juli 2014)

Wie gesagt: Passiert aber nichts bei "Neue Zeile hinzufügen". Der Button fügt jetzt nichtmal mehr eine ein, die sich selbst immer wieder überschreibt. Der hat wohl gänzlich seine Funktion durch deine Änderungen verloren?!


----------



## TessaKavanagh (11. Juli 2014)

Siehe Post über deinem der ist editiert. Stichwort Submit statt button


Denn der Button sendet das Formular ja garnicht ab, denn es ist eben kein Submit Knopf xD


----------



## DarkMo (11. Juli 2014)

meinen code habt ihr aber schon gesehn oder?  das ist GENAU das, was gesucht wird. kein ajax, keine unnötigen dinger, nur die funktionierende grundlage. mein vorschlag wäre ja gewesen: übernimm die grundlage und baue deinen db krams und formular-auswertungs kram ein und du hast schonmal ne ganze menge geschafft. ich hab das extra so gebaut, dass man nur noch 1 2 schritte weiter gehen muss. alles benötigte ist faktisch vorhanden.

aber ich sehe es halt wie du: komplett-code fetzt nich  daher hab ichs dir beispielhaft und dennoch funktionierend gebastelt. und kompliziert is daran doch garnix. das $db_count kann raus, das is ja nur nen workaround um das "db-verhalten" zu simulieren (also halt die anzahl der angezeigten einträge). wenn das auf sql umgebaut is, braucht man die ned mehr. die normale $count variable muss aber drin bleiben. und statt der textausgaben für löschen und adden musst du halt deine insert/delete's reibauen. achja: und natürlich die tabelle anpassen und somit auch im javascript dass add-teil erweitern und mit entsprechenden inputs/selects versehen.

also quasi: nicht meinen code in deins einbauen, sondern deinen in meinen ^^


----------



## TessaKavanagh (11. Juli 2014)

Aber an diesen 1-2 Schritten scheitert es doch bereits  Im übrigen ist der Code den er aktuell verwendet nichts anderes. Nur das er vollständig ohne JavaScript auskommt. Wenn man aber versucht ein Formular mit einem type="Button" statt einem type="Submit" zu versenden, dann kann das ja nicht klappen x-D (Ok der geht auf meine Kappe).

Dann brauchst er nur noch 1-4 for Schleifen im aktuellen Eintragescript und das ganze steht.


----------



## boss3D (11. Juli 2014)

Okay, dann funktioniert zumindest mal das mit der Zeile, aber die Tabelle fährt uns immer weiter runter. Mit jeder weiteren Zeile wird der Abstand zur Überschrift größer. 

Gibt's auch eine Möglichkeit, dass sich die Seite auf den Ursprungszustand (nur Header und Buttons) "resetet", wenn ich z. B. im Firefox auf den kreisförmigen Pfeil in der Adressleiste klicke?


----------



## TessaKavanagh (11. Juli 2014)

Muss ein <br> sein was in einer Schleife steht und da nicht hingehört.


Ob die Funktion des Zurückbuttons gewährleistet werden kann bin ich mir grade nicht sicher. wir können das ganze aber mit GET statt POST und ohne 2. Formular lösen wenn du willst. Die Anzahl der Spalten sind ja keine sensiblen Daten.

Mir schwebt da so etwas was vor wie Zeile Plus/Zeile Minus


----------



## DarkMo (11. Juli 2014)

boss3D schrieb:


> Okay, dann funktioniert zumindest mal das mit der Zeile, aber die Tabelle fährt uns immer weiter runter. Mit jeder weiteren Zeile wird der Abstand zur Überschrift größer.
> 
> Gibt's auch eine Möglichkeit, dass sich die Seite auf den Ursprungszustand (nur Header und Buttons) "resetet", wenn ich z. B. im Firefox auf den kreisförmigen Pfeil in der Adressleiste klicke?


 ich versteh gerade nur bahnhof... für mich klingt das wie "wieso ergibt 1+1 2? das soll 3 ergeben!" ^^ wenn man tabellenzeilen hinzufügt... ja dann fügt man eben tabellenzeilen hinzu


----------



## boss3D (11. Juli 2014)

Jap. Das mit dem "Reset" wäre noch interessant, wenn das ginge.

Ansonsten:
Du hast ...
- name="taetigkeit'.$a.'"
- name="product'.$a.'"
- name="beschreibung'.$a.'"
... gemacht, also einen Index angehängt. 

Der fehlt mir jetzt natürlich hier:
- $taetigkeit = $_POST["taetigkeit"];
- $produkt = $_POST["product"]; 
- $beschreibung = $_POST["beschreibung"]; 

Aber die Schleife habe ich ja in projektzeiterfassung2.php nicht. Wie kriege ich den Index jetzt trotzdem mit rüber?

@ DarkMo
Das Problem hast du komplett falsch verstanden, aber ist schon egal; hat sich schon gelöst. 

[EDIT]
Ich seh's schon kommen: Ich muss mir da jetzt in projektzeiterfassung2.php ein Schleifenkonstrukt reinbasteln, das mit ifs abfragt, in welcher Zeile wir gerade sind und welche Felder davon Inhalte haben, oder?


----------



## TessaKavanagh (11. Juli 2014)

Ja aber die Überschrift steht Oberhalb der gesamten Tabelle.

```
<h1>Überschrift</h1> 

Hier ist ein Abstand der immer größer wird


<table> Zeilen der Tabelle die immer eine mehr wird </table>
```


Also wenn du das mit dem zurück haben willst, dann müssen wir den Funktionierenden Code nochmal geringfügig Ändern.
Welche Zeilen du ersetzen musst Poste ich dir dann. Wir simulieren quasi ein abgesendetes Formular ohne das das Formular tatsächlich existiert.

Ich bin jetzt aber gleich erst mal für eine  Stunde Weg. Weswegen ich dir das erst danach Erkläre. Die Lösung ist sogar einnfacher als das bisherige 2. Formular nebenbei kannst du dann sogar das neue Zeile über das bestätigen setzen wenn du willst.^^

Das mit dem Index lösen wir nach dem gleichen Schema wie beim erstellen der POST variablen also mit einer for Schleife. Zeige ich dir dann ebenfalls.


----------



## DarkMo (11. Juli 2014)

ah ok, ja da wird wohl besagtes <br> mitgebaut. wegen dem index: du musst halt (siehe meinen code - der btnAdd teil) das ganze mittels schleife abarbeiten. aber der index wird da doch anders gebildet oO wenn du ein formular-feld hast mit einem namen ala input[], dann greift man darauf über $_POST['input'][$index] zu. wenn man jetzt sagt $taetigkeit=$_POST['taetigkeit']; (bei der namensvergabe taetigkeit[]), dann greift man eben über $taetigkeit[$index] darauf zu und nicht über $taetigkeit.$index (oder was du da gebaut hattest ^^).


----------



## TessaKavanagh (11. Juli 2014)

Ja aber das eine ist das Array $_POST['teatigkeit'] dessen Einträge du mit [$irgendeinezahl] ansprichst. Was ich hier verwendet habe sind die variablen $_POST['teatigkeit1'] $_POST['teatigkeit2'] etc. Der unterschied dürfte ja klar sein.



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

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

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



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

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

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

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr><br>';
    } 
    echo '</table><br>';
// Hinzufügen und entfernen
    echo '<button name="add" type="button" value="Zeile hinzufügen" onclick="projektzeiterfassung.php?add='.$add.'">';
    echo '<button name="rem" type="button" value="Zeile entfernen" onclick="projektzeiterfassung.php?rem='.$add.'">';

echo '<input type="hidden" name="add" value="'.$add.'">';
// Hinzufügen und Entfernen Ende
 

   echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
    
    echo '</form> ';
// Hier endet das "alte" Formular.

?> 
</body>
</html>
```


[EDIT]

Als nächstes die projektzeiterfassung2.php


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

    	

    $add = $_POST['add'];

    for($b = 1; $b <= $add; $b++)
{
    $taetigkeit = $_POST['taetigkeit'.$b.''];
    $produkt = $_POST['product'.$b.'']; 
    $beschreibung = $_POST['beschreibung'.$b.''];    
    
    $stunden = array("montag".$b."", "dienstag".$b."", "mittwoch".$b."", "donnerstag".$b."", "freitag".$b."", "samstag".$b."", "sonntag".$b."");   
    $data = array("mo".$b."", "di".$b."", "mi".$b."", "do".$b."", "fr".$b."", "sa".$b."", "so".$b."");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }

unset($data);
unset($stunden);
}
?>
```


----------



## boss3D (11. Juli 2014)

^^ Okay, danke. Der weitere Weg ist mir jetzt wieder klar. Ich bin jetzt auch schon zuhause und muss mich erstmal um ein paar andere Dinge kümmern. Weiß noch nicht, ob ich heute noch zum Weiterprogrammieren kommen werde.

Aber eines gäb's noch, das mich brennend interessieren würde: Tessa, kannst du bitte zu erklären versuchen, warum das jetzt nötig(?) war, für die Mehrfachausgabe der Zeile so eine komplizierte Lösung mit verstecktem Feld und Schleifen zu basteln? Und warum meine simple Idee ...


boss3D schrieb:


> Warum reicht's denn nicht, einfach irgendwo  <?php include("dynamictable.php");<br> ?> zu sagen? Es geht  ja nur drum, dass der Button neue Zeilen unterhalb bestehender einfügt  und die nicht ständig überschreibt.


... nicht gegangen wäre (oder wäre es eh gegangen)?

Der Button hatte ja bei mir immer schon das richtige gemacht, allerdings hat er eben die Zeile immer an der selben Position eingefügt und dadurch immer wieder überschrieben. Warum konnte ich da nicht einfach "irgendwo" mit <br> sagen, dass die nächste eben immer eine Position darunter eingefügt werden soll?


----------



## TessaKavanagh (11. Juli 2014)

Beim klicken des "Button" mit dem ursprünglichen JavaScript hat der User dem Server gesagt (http Request) führe bitte die Datei "dynamictable.php" aus. Als Resultat dieses Codes ist dann die HTML ausgabe einer Zeile entstanden die zu diesem Zeitpunkt nur der Server kennt.
Soweit ist noch alles Klar nehme ich an.

Dieser http Request ist aber nicht so wie wenn du eine neue Seite aufrufst. Dann bekommt der User vom Server eine zum anzeigen fertige Seite zugeschickt also den gesamten Quelltext den du siehst wenn du dir in der Datei den Quelltext anzeigen lässt.
Sondern der Server antwortet jetzt nur auf diesen speziellen Request und bekommt dann als String "Hallo ich bin eine Tabellenzeile" vom Server zugeschickt. Diese wird dann in variable gespeichert. Das ist nur ein Bruchstück aus dem o.g. Quelltext.

Bisher kann der Nutzer diesen noch überhaupt nicht sehen. Deshalb muss das JavaScript jetzt noch wissen wo es beim User denn die Textzeile "Hallo ich bin eine Tabellenzeile" in die Website einbauen soll. Das hast du Ihm mit dem Befehl: document.getElementByID('content').innerHTML(variable);

Dieser Befehl macht im ersten Schritt nichts anderes als im Quelltext der Website nach einem Objekt zu suchen welches die id='content' hat.
In deinem Beispiel war das ein div Container <div id='content'>PLATZHALTER</div> 
Im Zweiten Schritt sorgt das innerHTML dann dafür das der Gesamte Inhalt dieses Objektes im bisherigen Fall wäre das PLATZHALTER durch den Inhalt von variable = "Hallo ich bin eine Tabellenzeile" ersetzt wird.
Jetzt steht im Quelltext also <div id='content'>Hallo ich bin eine Tabellenzeile</div>
Würdest du den Button jetzt erneut anklicken wiederholt sich der ganze Vorgang nur das du in dem o.g. Schritten jeweils PLATZHALTER durch "Hallo ich bin eine Tabellenzeile" ersetzen musst. Du ürdest daher "Hallo ich bin eine Tabellenzeile" durch "Hallo ich bin eine Tabellenzeile" ersetzen. Im Ergebnis sieht die Website ab dem zweiten mal also aus wie vorher. Würde die Zeile "Hallo ich bin eine Tabellenzeile<br>" lauten, dann wäre diese eben durch die Zeile "Hallo ich bin eine Tabellenzeile<br>" ersetzt worden. Jeglicher Text und Code der zwischen dem Öffnenden und schließenden Tag steht wurde in deinem Script ersetzt. Denn das ist genau das was innerHTML macht.

Jetzt kommen wird zum einbinden von PHP Code z.B. include mit dieser Methode.

Wie ich bereits oben erwähnt habe ist PHP eine Serverseitige Sprache, JavaScript eine Clientseitige. Würdest du jetzt also dem JavaScipt sagen ersetze PLATZHALTER durch "<?php include="zielpfad"; ?>" würde auf deiner Website als Ausgabe statt einer Tabellenzeile <?php include="zielpfad"; ?> stehen.
Der Browser weiß nämlich nicht was er mit PHP anfangen soll, da er diese Sprache nicht kennt. Er würde das einfach als Text ansehen und als solchen auf dem Bildschirm anzeigen und da du ja die Website nicht neu geladen hast und JavaScript Clientseitig ist, weiß auch der Server garnicht das die Website jetzt anders aussieht als er sie ursprünglich erstellt hat- Er kennt nämlich nur die Website in der dort statt <?php include="zielpfad"; ?> das Wort PLATZHALTER steht.


----------



## DarkMo (11. Juli 2014)

ihr habt mein bsp echt nich angeschaut oder? da funzt GENAU das. nur nutze ich nicht das div als platzhalter, sondern geb der tabelle selbst die id "content". was passiert dann hier? ich speicher den bisherigen inhalt der tabelle (also alles zwischen <table> und </table> -> besagtes innerHTML, hier eben des tabel-tags und nicht des div-tags) und füge diesem einfach eine neue tabellenzeile hinzu. wie gesagt, schaut euch das bsp bitte an. wozu mach ich mir die arbeit, wenns alle ignorieren >< eure fragerei is sionnlos, da längst beantwortet.

desweiteren: wozu zum geier braucht man hier php? die tabellenzeile sieht IMMER gleich aus. da is nix dynamisch. ich habs bei mir eben exemplarisch mit einem einzelnen inputfeld gemacht. das auszubauen ist ja nun keine kunst *hoff* ^^

das prob bei dem div ist ganz einfach, dass ihr da für jede tabellenzeile immer eine komplette tabelle mit je einer zeile ausgeben müsst. das lässt sich blöd formatieren und ist unnütz.
wegen dem hidden-counter:
die js-funke liest diesen wert aus, addiert dazu 1 und schreibt ihn wieder zurück, sobald man ne neue zeile added. ich hab hierfür als butten extra <button type="button"> genommen, weil dieser das formular eben NICHT sended. das braucht man für diese js-funke ja ned. is ja der sinn von js, dass man die seite eben nicht neuladen muss, um was zu ändern. daher is nen button, der das formular abschickt und die seite neu "berechnen" lässt doof, wenn nich gar hinderlich. gut, das hidden-field (also <input type="hidden" value="$count" name="count">) enthält also genau die anzahl der zu addenden zeilen. drückt man jetzt den eintragen button, bestätigt also seine eingabe, dann wird die seite neu geladen, das php-script checked die eingaben und kann anhand der mitgelieferten count angabe ($_POST['count']) rausfinden, wieviele datensätze denn nun geliefert wurden. man kann das vllt auch weglassen und ein while(isset($_POST['teatigkeit'][$i])) { ...; $i++; } probieren, das müssts eigentlich auch tun, aber nuja. so gehts auch. das andere wäre eventuell aber sogar die effizientere lösung.

aber wie gesagt, schaut euch/du dir bitte nochmal mein letztes bsp an. wie gesagt, das is nen 4zeiler js code und nen winziger php code der all das macht, was hier krampfahft versucht wird umzusetzen >< und das viel eleganter und einfacher *find*


----------



## TessaKavanagh (12. Juli 2014)

Ich habe mir den code durchaus angeschaut und jetzt zum aber.

Der TE ist nicht und wird auch nicht dazu in der Lage sein den Code entsprechend so anzupassen das eine vollständige Tabellenzeile entsteht.
Das das Script zwar immer den Inhalt anfügt ist auch klar. Ein Beispiel dafür wie man das mit inner HTML in JS Lösen kann hatte ich ebenfalls gepostet.

Sein Vorschlag mit dem include() per JS ist hingegen schlichtweg unmöglich, das kann nicht funktionieren. Das macht schließlich auch dein JS nicht (Das kann man aus deinem Text oben m.E. missverstehen). 

Das Script zum eintragen in die Datenbank musst du jetzt ebenfalls entsprechend anpassen (mit einer zusätzlichen For schleife kommst du da nämlich nicht alleine weiter weil du ein Array verwendet hast.)

Er muss daher nicht nur sagen bitte führe die Anweisung xx mal aus, sondern er muss zusätzlich noch die richtigen indizis ansprechen.
Alles in allem sehe ich persönlich den TE momentan nicht in der Lage diese Anpassungen durchzuführen.


----------



## DarkMo (12. Juli 2014)

TessaKavanagh schrieb:


> Der TE ist nicht und wird auch nicht dazu in der Lage sein den Code entsprechend so anzupassen das eine vollständige Tabellenzeile entsteht.


ööh, aus ner einzellen-tabellenzeile ne ... 10 zellen (oder wieviels war) machen ist zuviel? ^^ das is doch wohl das simpelste überhaupt. das is die var add... zeile aus der .js - einfach erweitern und fertig.



TessaKavanagh schrieb:


> Das macht schließlich auch dein JS nicht (Das kann man aus deinem Text oben m.E. missverstehen).


dann war das wirklich missverständlich. ich hatte ja glaube extra noch gesagt, dass man dazu eben KEIN php braucht.



TessaKavanagh schrieb:


> Das Script zum eintragen in die Datenbank musst du jetzt ebenfalls entsprechend anpassen (mit einer zusätzlichen For schleife kommst du da nämlich nicht alleine weiter weil du ein Array verwendet hast.)
> 
> Er muss daher nicht nur sagen bitte führe die Anweisung xx mal aus, sondern er muss zusätzlich noch die richtigen indizis ansprechen.
> Alles in allem sehe ich persönlich den TE momentan nicht in der Lage diese Anpassungen durchzuführen.


 auch hier wieder: ist doch alles exemplarisch schon vorgegeben. ich gebe dieses eine inputfeld korrekt in einer schleife aus. im letzten post (glaub) hatte ich sogar ne noch einfachere variante genannt, die ohne "hidden-counter" auskommt. er braucht jetzt nur noch ausm echo input[$index] geblubbe ein $sql = "update... input[$index]..." machen und ggf noch ne ausgabe malen. schon is der rotz in der db. wie gesagt, das teil is an sich mit wenigen kniffen voll funktionsfähig.

oder versteh ich dich grad falsch, weil das letzte verwirrt mich grad. "nich nur x mal durchlaufen, sondern auch die richtigen indizes..." - genau das mach ich doch ^^


----------



## TessaKavanagh (12. Juli 2014)

Die $_POST Abfrage wird bereits aus einem Array erstellt, du musst jetzt aber da noch einen Index anhängen. Du musst das ganze dann noch um einen Index Erweitern. Du musst da also sowas wie $_POST[$_Array[$index a]][$index b] draus machen.



> auch hier wieder: ist doch alles exemplarisch schon vorgegeben. ich gebe dieses eine inputfeld korrekt in einer schleife aus. im letzten post (glaub) hatte ich sogar ne noch einfachere variante genannt, die ohne "hidden-counter" auskommt. er braucht jetzt nur noch ausm echo input[$index] geblubbe ein $sql = "update... input[$index]..." machen und ggf noch ne ausgabe malen. schon is der rotz in der db. wie gesagt, das teil is an sich mit wenigen kniffen voll funktionsfähig.



und genau da scheitert es. Auch wenn es exemplarisch schon da ist, der TE bekommt es nicht auf den rest übertragen.


----------



## boss3D (12. Juli 2014)

DarkMo's Code so angepasst, dass er (optisch) wieder das selbe Resultat liefert:

```
<?php
    echo '<!doctype html>
            <html>
            <head>
                <meta charset="ISO-8859-1">
                <link rel="stylesheet" type="text/css" href="style.css">
                <title>Projektzeiterfassung</title>
                <script src="zeit.js" type="text/javascript"></script>
            </head>
            <body>';
  
    echo '<form action="formular.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    echo '<table border="1" id="content">';
    echo '  <tr>';
    echo '    <th>Tätigkeit</th>';
    echo '    <th>Produkt</th>';
    echo '    <th>Beschreibung</th>';
    echo '    <th width="150">MO <input name="mo" type="text" size="10" maxlength="10"></th>';
    echo '    <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>';
    echo '    <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>';
    echo '    <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>';
    echo '    <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>';
    echo '    <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>';
    echo '    <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>';
    echo '  </tr>';

    echo '</table>';
    echo '<input type="hidden" value="0" name="count" id="count">';

    echo '<br><div class="submit"><button type="button" onclick="javascript:add_line();">Neue Eingabezeile hinzufügen</button></div><br> <div class="submit"><input type="submit" value="Bestätigen" name="btnAdd"></div>';
  
    echo '</form>';
  
    echo '  </body></html>';
?>
```


```
function add_line() {
    var count = parseInt(document.getElementById('count').value) + 1;
    var add = '<tr><td><input type="text" name="input[' + (count - 1) + ']"></td><td>' + count + '</td></tr>';
    var div = document.getElementById('content');
    div.innerHTML += add;
    document.getElementById('count').value = count;
}
```
Liefert:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Das einzige, das ich dabei gar nicht kapiere: Für die Erstellung meiner einen Zeile ist ja dieser GANZE Code nötig ...


Spoiler





```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

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

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

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

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr>';
    } 
    echo '</table><br>';
    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
    echo '</form> ';
    
    echo '<br><form action="projektzeiterfassung.php" method="post">';
    echo '<div class="submit"><input type="hidden" name="add" value="'.$add.'">';
    echo '<input type="submit" name="newLine" value="Neue Eingabezeile hinzufügen"></div><br>';
    echo '</form> ';
?>
```



Ich kann den doch jetzt nicht einfach ins Javascript bei _var add_ reinknallen. Wie soll ich das denn jetzt anstellen, dass ich meine dynamische Zeile kriege? 
Klar, ist es nicht schwer, einfach statt einer eben zehn Zellen zu machen. Aber ich habe ja nicht nur Zellen, sondern auch die beiden dropdowns (für deren Inhalt wiederum auf diverse Tabellen in der DB zugegriffen wird)!

Damit sind wir auch wieder beim ursprünglichen Problem, dass ich anscheinend bis heute nicht kapiert habe, wie ich diesen Code der Zeile in den Code für die Seite reinkriegen soll. Das war ja vor ein paar Tagen schon das Problem, wo ich ja auch nicht im Javascript "include();" sagen konnte. Deswegen haben wir (soweit ich's verstanden habe) dann in Tessa's Lsg auf das Javascript verzichtet, den Code dieser Zeile in den Code der Seite integriert, und die Seite sich immer wieder neu aufrufen lassen?!
---------
@ Tessa 
Danke für die Erklärung oben, ist jetzt klar(er).


----------



## DarkMo (12. Juli 2014)

hmm, als ersten schritt, kannste ja mal ganz billig alles mit inputs füllen. also so, dass erstmal die zeilen alle passen. mit den selects (du meinst, dass der inhalt der selects, die einzelnen options, ja aus der db ausgelesen werden oder?) is natürlich wahr. aber da gibts auch ne lösung *denk* du pfeiffst auf das js-file und baust die funktion direkt in der html datei. da geht zwar dann der separierte vorteil flöten, aber man kann es dynamisch machen. ich stells mir so vor:
statt

```
echo '...<script src="zeit.js" type="text/javascript"></script>...';
```
schreibste dann eben

```
echo '...';
echo '<script type="text/javascript">';
echo 'function add_line() {';
echo "  var count = parseInt(document.getElementById('count').value) + 1;";

// hier jetzt der part, weswegen wir unser js dynamisch per php erstellen:
echo "  var taet_select = '<select name=\"taetigkeit[]\"...>';"; // ohne die count-variable sollte das an sich auch gehn, weil ich für die inputs ja  ...[+count+]... geschrieben hatte. also müsste mMn auch so gehen
$sql = "SELECT * FROM taetigkeiten;";
$res = ...; // abfrage senden
while($row = mysql_...($res)) // wie auch immer die jetz hieß xD
  echo "  taet_select += '<option value=\"".$row['ID']."\">".$row['Bezeichnung']."</option>';";
echo "  taet_select += '</select>';";
// und das ganze nochmal für die produkte...

echo "  var add = '<tr><td>' + taet_select + '</td><td>' + prod_select + '</td><td><input type=\"text\" name=\"input[' + (count - 1) + ']\"></td><td>...restliche inputs...</td></tr>';";
echo "  var div = document.getElementById('content');";
echo "  div.innerHTML += add;";
echo "  document.getElementById('count').value = count;";
echo '}';
echo '</script>';
echo '...';
```
so stell ichs mir grundlegend vor. wenn du das drin hast, können wir uns mal an die js funke machen, die uns lustige produkte zu den tätigkeiten filtert. das stell ich mir grad etwas verzwickter vor ^^ aber das sollte fürs grundlegende funktionieren erstmal reichen. wie gesagt: ich mach sowas gern schritt für schritt


----------



## boss3D (12. Juli 2014)

DarkMo schrieb:


> mit den selects (du meinst, dass der inhalt der selects, die einzelnen options, ja aus der db ausgelesen werden oder?) is natürlich wahr.


Ja, meine ich. Hab's in mein voriges Posting noch reineditiert.


DarkMo schrieb:


> aber da gibts auch ne lösung *denk* du pfeiffst auf das js-file und baust die funktion direkt in der html datei.


Womit wir wieder ganz genau bei Tessa's Lösung wären, die ich schon hatte ...  

Soweit ich das alles hier verstanden habe, war ja der große Unterschied zwischen euren Lösungen, dass er/sie eben auf das Javascript verzichtet, den Zeilencode in den Seitencode integriert, und die Seite sich dann immer wieder selbst neu laden hätte lassen.
Und du wolltest den Zeilencode immer wieder über das Javascript in den Seitencode reinladen lassen damit sich die Seite eben nicht jedesmal selbst neu laden muss.
----------

Jedenfalls probiere ich jetzt mal deinen letzten Vorschlag.


----------



## DarkMo (12. Juli 2014)

ich kannte jetzt nur dein dingen mit den htm's und php's ^^ und das fand ich halt alles sehr konfus :/ vllt hab ichs deswegen nich geblickt. ohne js gehts freilich auch (also bis hierhin), aber dann haste halt immer seitenreloads. weis ja ned, wie euer firmennetz da is. wenn ich bei uns auf arbeit seh, wie quälend lahm das alles is... omg ^^ da verzichtet man gern auf seitenreloads >< aber ich finds bei uns auch extrem. im "alltag" is das netz eigentlich doch recht flott. gut, traffic minimierung wäre dann vllt noch nen argument... ich schweife ab xD


----------



## boss3D (12. Juli 2014)

Ich kenne die Firmeninfrastruktur nicht. Ich weiß absolut gar nichts, außer eben, was von mir verlangt wird und, dass bis jetzt erstmal alle Rechner der Abteilung über "IP_meines_PCs/login.html" auf die Website zugreifen können. 
Wie das dann alles am Ende wird und ob die das Zeug dann auf den Webserver der Firma legen, oder ob mein Auftraggeber das dann auch selbst mit xampp nutzen will, dürfen die sich selbst überlegen. Das sehe ich nicht mehr als meine Aufgabe. Wenn der das immer nur von seinem PC aus nutzt und da eine statische IP hat, sehe ich da jedenfalls keine Probleme.

Und wegen der Performance, tja, kann ich auch nicht viel dazu sagen, wie das dann in der Praxis ausschauen wird. Ich denke aber nicht, dass bei dem minimalistischen Inhalt, den unsere Website hat, wegen ~20 Zeilen alles (spürbar) langsam wird?! Das würde vielleicht passieren, wenn die Seite auch sonst noch mit zig html Elementen gefüllt wäre?! ...
-----------

Hier nochmal die Lösung, die ich mit Tessa erarbeitet hatte. Schau's dir einfach mal an, und vielleicht, wenn du meinst, können wir's ja doch so belassen und da weiterarbeiten ...

Website und dynamische Zeile erstellen: projektzeiterfassung.php


Spoiler





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

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

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

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

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

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr>';
    } 
    echo '</table><br>';
    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
    echo '</form> ';
    
    echo '<br><form action="projektzeiterfassung.php" method="post">';
    echo '<div class="submit"><input type="hidden" name="add" value="'.$add.'">';
    echo '<input type="submit" name="newLine" value="Neue Eingabezeile hinzufügen"></div><br>';
    echo '</form> ';
?> 
</body>
</html>
```



Bei Klick auf "Bestätigen" Aufrufen des Codes, der die Daten des Formulars in die DB schreibt: formular.php



Spoiler





```
<?php
    include('projektzeiterfassung2.php');
?>
```



Der eben genannte Code, der nun die Daten in die DB schreibt: projektzeiterfassung2.php


Spoiler





```
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;  
    $taetigkeit = $_POST["taetigkeit"];
    $produkt = $_POST["product"]; 
    $beschreibung = $_POST["beschreibung"];    
    
    $stunden = array("montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag", "sonntag");   
    $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }
?>
```



^^ Wobei, ich merke gerade, der Einzeiler in formular.php ist ja idiotisch.  Da könnte ich ja gleich den Code aus projektzeiterfassung2.php einfügen und erspare mir schon wieder ein unnötiges File.


----------



## DarkMo (12. Juli 2014)

hmm, ja ok. das ist pur php, stimmt. was mir jetzt spontan erstmal auffällt is das mit dem "taetigkeit".$a zeugs ^^ jetz versteh ich auch, wieso "ihr" das so komisch gelöst hattet. ihr vergebt quasi individuelle namen und baut diese dann später szs nach. dabei gibts doch diese praktische array "funktion" da: "taetigkeit[]" - fertig ^^ dann muss man nich $_POST["bla".$a] abfragen, es reicht ein $_POST["bla"][$a] - was darin gipfelt, dass man das schön in ner foreach abhandeln kann: foreach($_POST['bla'] as $bla)... so solltest dann auch das gesendete formular zeile für zeile abarbeiten um es in die db zu speichern dann.

so, ich hatte doch nochwas gesehn *dacht*

achja, das hier:

```
$taetigkeit = $_POST["taetigkeit"];
$produkt = $_POST["product"]; 
$beschreibung = $_POST["beschreibung"];
```
egal ob $_POST gesetzt is oder nich, du fragst es ab. UND! du fragst was ab, was es garnich geben kann ^^ in dem code müsstest du eben $taetigkeit[$a] = $_POST["taetigkeit".$a]; abfragen - in einer schleife. und diese schleife handelst duja nich immer ab, sondern nur, wenn du es brauchst. ich schreib sowas eigentlich NUR hinter nem if(isset($_POST['button'])) zum bsp. genereller aufbau für mich: formulardaten verarbeiten (besagtes if isset - für alle buttons usw), dann das formular bauen.


----------



## boss3D (12. Juli 2014)

Ja, das was du hier erwähnst, war eben noch die letzte offenen Baustelle, die wir hatten. Genau wegen den drei Zeilen habe ich noch Index Errors bekommen, weil Tessa, soweit ich's verstehe, die genannten Variablen in arrays umgewandelt hat, was aber natürlich in dem "Auslese-File" noch zu machen wäre ...

Die besagt Schleife wollte ich mir heute noch vornehmen (isset() ist mir auch bekannt). Ich denke mich da jetzt mal rein und poste dann das Ergebnis, sobald ich eines habe.


----------



## DarkMo (13. Juli 2014)

ich kritzel schonmal meine überlegungen zu den 2 select-boxen nieder ^^

grunsätzlicher aufbau schwebt mir folgendermaßen vor:

```
<td><select name="taetigkeit" onselect="javascript:changeSelect();"...>...</select></td>
<td>
  <div id="produkt0">Tätigkeit wählen</div>
  <div id="produkt1" style="display:none"><select name="produkt1"...>...</select></div>
  <div id="produkt2" style="display:none"><select name="produkt2"...>...</select></div>
  ...
  <div id="produktn" style="display:none"><select name="produktn"...>...</select></div>
</td>
```
joa, sinn des ganzen und erklärung:
du baust EIN select für die tätigkeit, al optionen kommen da alle in der db enthaltenen tätigkeiten - wie gehabt. jede tätigkeit hat eine id (also in der db, aus der tabelle taetigkeiten) - genau diese wird als value übergeben. beim absenden des formulars kann man dann ganz easy die id auswerten (zudem soll die ja eh gespeichert werden ^^). so, desweiteren wird die id nun hier noch genutzt: bei den produkt selects. bis auf den default teil mit dem produkt0 (das wird "hardcoded" ausgegeben - beachte: KEIN display:none - also sichtbar) werden hier dann die produkte für jede tätigkeit gebaut. daher auch produkt.tätigkeit-ID als name. die db-id beginnt immer bei 1, daher kann man gemütlich die 0 als default nehmen. wenn man mal irgendwann die tätigkeit mit der id1 löscht, dann wird für die auch kein select mehr gebaut und es sähe von der reihenfolge eben so aus: produkt0 produkt2... ich will damit nur verdeutlichen, dass das KEINE zählvariable sein soll, sondern eben der index der tätigkeit, für die diese produkt-select-box gebaut ist.

gut, wir haben nun also in tabellen-zelle 1 unsere eine selectbox mit den tätigkeiten und in der 2. haben wir für jede tätigkeit ein div das jeweils eine selectbox für die produkte (für die jeweilige tätigkeit gefiltert) enthält. und von all diesen ist nur eine sichtbar - by default produkt0.

die tätigkeiten selectbox hat dann diesen aufruf für onselect - also wenn ich was aus tätigkeiten auswähle, wird unsere changeselect funke aufgerufen. und die soll folgendes tun: sie ließt (sofern das geht - ich hoffs ^^) die tätigkeiten selectbox aus - jede einzelne vorhandene option. sie ließt sie dessen value aus und sofern diese option die selektierte ist, wird das div mit der id produkt+value (wir erinnern uns, der value ist die tätigkeiten-id, und aus produkt und dieser id wurden die namen (später fürs auswerten des gesendeten formulars) und id's (für die auswertung per js) gebildet) derart manipuliert, dass nun display:block gilt. somit wird dieses div angezeigt. ist es NICHT die selektierte option, wird display auf none gesetzt (und damit das div wieder versteckt). damit wäre dann der wechsel auch geschafft.

was wir dafür noch brauchen, ist eine "verknüpfungs tabell" in der db. weis nich, ob du die schon hast. das wäre die tabelle (nennen wir sie mal taetigkeiten_produkte), in der eigentlich nur 3 spalten stehn: id, taetigkeiten-id und produkt-id. für jede tätigkeit werden für alle betreffenden produkte zeilen angelegt. hmm, blöd zu beschreiben - bsp ^^

wir haben die tätigkeiten 1 und 2 und die produkte 1 2 und 3. für tätigkeit 1 kann man produkte 1 und 2 wählen, für tätigkeit 2 allerdings dann die produkte 2 und 3. in tabellenform sähe es dann so aus:
1|1|1 // id1: zu tätigkeit1 gehört produkt1
2|1|2 // id2: zu tätigkeit1 gehört produkt2
3|2|2 // id3: zu tätigkeit2 gehört produkt2
4|2|3 // id4: zu tätigkeit2 gehört produkt3

jetzt müsste man quasi immer select * from taetigkeiten_produkte where taetigkeiten_id = "aktuelle tätigkeiten id". bzw eben erweitert, dass man auch den produktnamen hat: "SELECT * FROM taetigkeiten_produkte AS tp, produkte AS p WHERE tp.taetigkeiten_id = $taet_id AND p.ID = tp.produkt_id;" so glaub ich. dann kann man di zeile in etwa so bauen:

```
echo '<div id="produkt'.$row['taetigkeiten_id'].'"><select name="produkt'.$row['taetigkeiten_id'].'">...</select></div>';
// bzw eben
echo '<option value="produkt'.$row['taetigkeiten_id'].'">'.$row['bezeichnung'] /* oder wie die spalte mit dem produktnamen in der produkte-tabelle heisst ^^ */ .'</option>';
```
aber ich würds warscheinlich eher so machen (man sollte immer versuchen, db-anfragen zu minimieren):

```
// tätigkeiten-select bauen
$sql_t = "select * from taet...";
<select name="taetigkeiten" onselect...>
<option value="0">---------</option> // default-ausgabe
while(row...) {
  <option value="row_t[id]">row_t[name]</option>
  // also hier eben die options bauen, ABER zusätzlich hier schon die produkt-selecs bauen und in ner variable speichern
  $sql_p = select * from teat_prod...;
  $selectbox[$row_t[id]] = <div name="produkt0" style="display:none"><select name="produkte.$row_t[id]"...>
  while(row_p...)
    $selectbox[$row_t[id]] += <option value="row_p[id]">row_p[name]</option>
  $selectbox[$row_t[id]] += </select></div>
}
</select>
// produkt-selects bauen
<div name="produkt0">Tätigkeit wählen</div> // default-ausgabe
foreach($selectbox as $sb)
  echo $sb;
  // und hier eben diese erstellten variablen wieder ausgeben und in die tabellen-zelle einfügen
```
ich hoffe mal, es kommt raus, was ich meine. problem bis hierhin: für eine eingabezeile funzt das sicher, für mehrere mit integration ins js... müssmer mal schauen. abe das wäre so die basis als ausgangspunkt


----------



## boss3D (13. Juli 2014)

So, die Schleife, wie ich mir das vorgestellt hätte:

```
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $stunden = array("montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag", "sonntag");   
    $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
    if (isset($_POST['add'])) {
        $add = $_POST['add'];
        for ($a = 0; $a <= $add; $a++) {
            if (isset($_POST["taetigkeit"]) and isset($_POST["product"])) {
                $taetigkeit = $_POST["taetigkeit".$a];
                $produkt = $_POST["product".$a]; 
            }
            if (isset($_POST["beschreibung"])) {
                $beschreibung = $_POST["beschreibung"];
            } else {
                $beschreibung = "";
            }
            for ($a = 0; $a < 7; $a++) {
                $erstellt = date('Y-m-d-h-i-s');
                if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
                    $dauer = $_POST[$stunden[$a]];
                    $tag = $_POST[$data[$a]];            
                    $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
                    $eintragen = mysql_query($eintrag);
                }
            }
        }
    }
?>
```
Aber es werden leider keine Daten in die DB geschrieben. K. A. wo jetzt wieder der Hund begraben liegt. 

Jedenfalls habe ich das so verstanden, dass in _add_ die Anzahl der Zeilen gespeichert wird (in projektzeiterfassung.php) und ich mir über POST den Inhalt der _add_ Variable auch in mein formular.php rüberholen kann?! Dort hätte ich dann eben eine Schleife so oft laufen lassen wie es Zeile gibt, immer schön mit isset() abfragen, ob überhaupt was in den Feldern der jeweiligen Zeile steht, und dann eben per INSERT ab damit in die DB. Aber irgendwo habe ich wohl einen Fehler drinnen ...


----------



## DarkMo (13. Juli 2014)

hmm, add ist bei dir quasi mein count, wenn ichs richtig sehe oder? mein problem ist: ich sehe hier weder anfang noch ende ^^ also wenn ich das richtig sehe, dann bekommt add einen wert aus den formular-daten und wandert wieder ins formular. aber es wird nie initialisiert. als nächstes... wenn du auf das vorhandensein von add prüfst, dann wird dat nix. du hast doch 2 buttons - newline und confirm (namentlich). wenn du einen von beiden drückst, wird das formular abgeschickt - und somit auch add. aber bei newline soll add garnicht ausgewertet werden. sprich: du fügst eine neue zeile zum eingeben hinzu und dabei wird schon zeug gespeichert. daher: prüfe auf buttons! if(isset($_POST['confirm']))... und hier brauchste dann nichmehr prüfen, ob add gesetzt ist. di form wurde abgeschickt, die daten sind da. man kann aufs richtige format achten usw, das geht, aber das vorhandensein ist gesichert.

ach ich seh gerade, du hast ja 2 formulare... ok gut, wenn du confirm drückst, wird das formular abgesendet, in dem de button ist. add ist aber in der anderen form ^^ also ist add garnicht gesetzt. lass einfach alles in einer form und gut ist (also in der "mitte" das </form>...<form...> weglassen). weil du brauchst add in beiden varianten. ist newline gesetzt, wird ne zeile angefügt und add inkrementiert, wurde confirm gedrückt, werden add datensätze in die db geschrieben.

aber wie gesagt: alles in allem brauchste das nichmal. mach aus tätigkeit.$a ein tätigkeit[] und rödel den kram einfach mittels foreach($_POST[tätigkeit] as t) ab. wobei, ne, müssen ja den key noch auslesen: foreach($_POST[tätigkeit] as $key => $t). und dann kannst du $ speichern und $_POST[produkte][$key] und $_POST[beschreibung][$key]...


----------



## boss3D (13. Juli 2014)

^^ Sorry, aber aus dem Posting habe ich jetzt, glaube ich, gar nichts kapiert?! 

echo '<br><form action="projektzeiterfassung.php" method="post">';
echo '</form>';
... soll ich löschen?

Die foreach Schleife ist mir auch nicht ganz geheuer. Da bleibe ich lieber bei for und .$a. Geht doch auch, oder? Und von welchem key redest du eigentlich? Meinst du den Index?

Ich kapiere auch gerade gar nicht, wie ich überhaupt an alle Daten kommen soll. Ich dachte, ich müsste jetzt erstmal per Schleife überprüfen, wie viele Zeilen überhaupt erzeugt wurden?! Und diese Anzahl habe ich doch nur in _add_?!
Und dann hätte ich eben so oft geprüft, welche Felder in jeder Zeile befüllt sind, und die Werte in die DB geschrieben.



[EDIT]
Ich kann die newline Code-Zeilen nicht einfach in das andere <form> ... </form> mitreinpacken, weil das erste form ein php Script aufruft, das nur die Daten in die DB schreibt. Das zweite jetzige form hingegen ruft jenes Script auf, das die dynamische Zeile zusammenbaut.


----------



## TessaKavanagh (13. Juli 2014)

> Ja, das was du hier erwähnst, war eben noch die letzte offenen Baustelle, die wir hatten. Genau wegen den drei Zeilen habe ich noch Index Errors bekommen, weil Tessa, soweit ich's verstehe, die genannten Variablen in arrays umgewandelt hat, was aber natürlich in dem "Auslese-File" noch zu machen wäre ...
> 
> Die besagt Schleife wollte ich mir heute noch vornehmen (isset() ist mir auch bekannt). Ich denke mich da jetzt mal rein und poste dann das Ergebnis, sobald ich eines habe.



Die Lösung dafür habe ich auch bereits in einem meiner letzten Posts geschrieben 

Habe es jetzt nochmal aus POST 229 hier hin kopiert.


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

        
// hier könntest du danütlich noch mit if isset abfangen falls jemand versucht die Seite so aufzurufen. Ist aber nur von bedeutung wenn jemand die Seite direkt aufruft ohne das Formular zu benutzen.
    $add = $_POST['add'];

    for($b = 1; $b <= $add; $b++)
{
    $taetigkeit = $_POST['taetigkeit'.$b.''];
    $produkt = $_POST['product'.$b.'']; 
    $beschreibung = $_POST['beschreibung'.$b.''];    
    
    $stunden = array("montag".$b."", "dienstag".$b."", "mittwoch".$b."", "donnerstag".$b."", "freitag".$b."", "samstag".$b."", "sonntag".$b."");   
    $data = array("mo".$b."", "di".$b."", "mi".$b."", "do".$b."", "fr".$b."", "sa".$b."", "so".$b."");
    
    for ($a = 0; $a < 7; $a++) {
        if (isset($_POST[$stunden[$a]]) and $_POST[$stunden[$a]] != "" and isset($_POST[$data[$a]]) and $_POST[$data[$a]] != "") {        
            $dauer = $_POST[$stunden[$a]];
            $tag = $_POST[$data[$a]];
            $erstellt = date('Y-m-d-h-i-s');
            $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
            $eintragen1 = mysql_query($eintrag);
        }        
    }

unset($data);
unset($stunden);
}
?>
```


----------



## boss3D (13. Juli 2014)

TessaKavanagh schrieb:


> Die $_POST Abfrage wird bereits aus einem  Array erstellt, du musst jetzt aber da noch einen Index anhängen. Du  musst das ganze dann noch um einen Index Erweitern. Du musst da also  sowas wie $_POST[$_Array[$index a]][$index b] draus machen.


Wir haben in projektzeiterfassung.php ja schon 1 Index, der uns in formular.php bei den gleichnamigen Variablen fehlt. Und du willst, dass ich da jetzt trotzdem auch noch einen zweiten anhänge (wozu überhaupt)?! 

Irgendwas verstehe ich hier komplett falsch ...

[EDIT]
Achso, du bist jetzt wieder in formular.php unterwegs. Okay, auf den ersten Blick ist dein Code, zumindest sinngemäß, aber gar nicht weit weg von dem, den ich gebastelt hatte. Die Indexe haben mir halt noch gefehlt, aber du löst das ebenfalls über eine Schleife mit add als Maximum.


----------



## TessaKavanagh (13. Juli 2014)

> Die $_POST Abfrage wird bereits aus einem Array erstellt, du musst jetzt aber da noch einen Index anhängen. Du musst das ganze dann noch um einen Index Erweitern. Du musst da also sowas wie $_POST[$_Array[$index a]][$index b] draus machen.



Bezieht sich auf den Array Ansatz von DarMo da müsste dann eben stehen $_POST['montag'][1] und da du 'montag' aus einem Array holst steht dann eben im Quelltext $_POST[$_Array[$index a]][$index b]-

Zu meinem Post oben. Natürlich musst du es über eine Schleife lösen. Du kannst es wenn du ein Array verwendest eben über eine foreach schleife Lösen, das mache ich persönlich aber eigentlich selbst bei arrays nie.
Oder eben über eine for Schleife. Dann brauchst du aber die Anzahl der einzutragenden Zeilen. Diese steht in $add und wird als hidden field vom Formular übermittelt.




> Jedenfalls habe ich das so verstanden, dass in add die Anzahl der Zeilen gespeichert wird (in projektzeiterfassung.php) und ich mir über POST den Inhalt der add Variable auch in mein formular.php rüberholen kann?! Dort hätte ich dann eben eine Schleife so oft laufen lassen wie es Zeile gibt, immer schön mit isset() abfragen, ob überhaupt was in den Feldern der jeweiligen Zeile steht, und dann eben per INSERT ab damit in die DB. Aber irgendwo habe ich wohl einen Fehler drinnen ...



Kann nicht funktionieren. Die for Schleifen sind ja ineinander verschachtelt. Du kannst also nicht für beide die variable $a nehmen. Sonst wird ja bereits im Verlauf des ersten Durchlaufs in der zweiten Schleife $a derart erhöht, das die erste Schleife nach einem Durchlauf abbricht. Also muss eine Schleife eine andere Variable z.B. $b benutzen.


----------



## boss3D (13. Juli 2014)

Ich versuche gerade zu verstehen, wozu jetzt eigentlich die ganzen Indexe nötig sind ...

Das $b gibt uns an, aus welcher Zeile wir gerade die Feldinhalte abfragen?!
Aber als zweiten Index hast du noch ein '' bzw. "" angehängt. Dessen Sinn erkenne ich nicht.

Übrigens kriegen wir noch: 





> *Notice*:  Undefined index: add in *C:\xampp\htdocs\db\formular.php* on line *12*


Ich traue mich wetten, dass ich das mit isset() wegkriegen würde, dann aber wieder keine Daten in die DB geschrieben werden würden.

[EDIT]
Nein, dann überträgt sich der Fehler auf das add in der for-Schleife.


----------



## TessaKavanagh (13. Juli 2014)

Poste bitte mal den aktuellen Code von Projektzeiterfassung. Ich nehme an da fehlt das hidden field aus Post 229, sodass du garkeine $_POST['add'] übergibst.


----------



## boss3D (13. Juli 2014)

projektzeiterfassung.php:



Spoiler





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

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

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

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

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

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

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr>';
    } 
    echo '</table><br>';
    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
    echo '</form> ';
    
    echo '<br><form action="projektzeiterfassung.php" method="post">';
    echo '<div class="submit"><input type="hidden" name="add" value="'.$add.'">';
    echo '<input type="submit" name="newLine" value="Neue Eingabezeile hinzufügen"></div><br>';
    echo '</form> ';
?> 
</body>
</html>
```



formular.php:



Spoiler





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

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];    
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo".$a."", "di".$a."", "mi".$a."", "do".$a."", "fr".$a."", "sa".$a."", "so".$a."");
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];
                $erstellt = date('Y-m-d-h-i-s');
                $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
                $eintragen1 = mysql_query($eintrag);
            }        
        }
        unset($data);
        unset($stunden);
    }
?>
```



Die Kombi liefert eben den Index Fehler wegen add ...


----------



## TessaKavanagh (13. Juli 2014)

Genau das habe ich erwartet. Der Code stimmt nicht mit meinem COde aus 229 überein. Sicher ihn bitte mal in einer anderen Datei und verwende statt dessen den Code hhier


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

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

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



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

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

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

        echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr><br>';
    } 
    echo '</table><br>';
// Hinzufügen und entfernen
    echo '<button name="add" type="button" value="Zeile hinzufügen" onclick="projektzeiterfassung.php?add='.$add.'">';
    echo '<button name="rem" type="button" value="Zeile entfernen" onclick="projektzeiterfassung.php?rem='.$add.'">';

echo '<input type="hidden" name="add" value="'.$add.'">';
// Hinzufügen und Entfernen Ende
 

   echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
    
    echo '</form> ';
// Hier endet das "alte" Formular.

?> 
</body>
</html>
```

Dieser Code sollte übrigens zeitgleich auch ein "eine Zeile entfernen" Button einrichten und er kommt mit einem Formular aus^^

Wenn die Datei jetzt nicht mehr projektzeirerfassung2 heißt, dann musst du die <form action="projektzeiterfassung2.php" method="post"> natürlich in <form action="formular.php" method="post"> ändern.


----------



## boss3D (13. Juli 2014)

Du hast da ineinander verschachtelte Buttons drinnen, die keine Funktion zeigen. Ansonsten sehe ich keinen Unterschied zu meinem Code.




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ich versuche mal, die Buttons zu trennen, aber wieso die nichts machen, sehe ich noch nicht.

[EDIT]
Jetzt hätte ich mal die Buttons getrennt. "Bestätigen" ruft auch das formular.php auf, es werden aber keine Daten in die DB geschrieben. Und die add und rem Buttons zeigen gar keine Wirkung, auch wird deren Beschriftung nicht angezeigt.

Statt type="button", type="submit" sagen, sollte ich lieber nicht, oder?


----------



## TessaKavanagh (13. Juli 2014)

Na da sind schon ein paar unterschiede drinn. Das wirst du feststellen sobald die Buttons funktionieren. Notfalls können wir die Funktion auch als Link testen.

Also erweiter die Buttons bitte mal um eine</button> und schreibe und Schreibe den Text aus Value jeweils zwischen den öffnenden und schließenden tag

Edit: 

Also 
	
	



```
echo '<button name="add" type="button" value="Zeile hinzufügen" onclick="window.location.href=\'/projektzeiterfassung.php?add='.$add.'\'">Zeile hinzufügen</button> ';
    echo '<button name="rem" type="button" value="Zeile entfernen" onclick="window.location.href=/projektzeiterfassung.php?rem='.$add.'\'">Zeile entfernen</button> ';
```

Habe den code in diesem Beitrag jetzt nochmal editiert. Das Problem sollte dadurch behoben sein


----------



## boss3D (13. Juli 2014)

Okay, damit schaut's schon mal nach was aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Allerdings passiert bei den beiden Buttons halt noch nichts ...

[EDIT]
Laut neuester Fehlermeldung sind zuviele = in deinem Code. Sieht man ja auch hier im Forum schon, dass das farblich unterschiedlich gewertet wird.


----------



## TessaKavanagh (13. Juli 2014)

```
echo '<button name="add" type="button" value="Zeile hinzufügen" onclick="window.location.href=\'projektzeiterfassung.php?add='.$add.'\';">Zeile hinzufügen</button> ';
    echo '<button name="rem" type="button" value="Zeile entfernen" onclick="window.location.href=\'projektzeiterfassung.php?rem='.$add.'\';">Zeile entfernen</button> ';
```

Das Problem ist das Buttons nur mit JavaScript funktionieren. Habe das mal geändert. Hoffe das alle '' richtig maskiert sind. Wenn man ganz auf JavaScript verzichten möchte muss man einen Link nehmen und Ihn aussehenlassen wie einen Button. Wir haben hier aber einen Button der funktioniert wie ein Link 


Ich hatte noch ein ; vergessen, habe das noch eingefügt.


----------



## boss3D (13. Juli 2014)

Es wird immer "lustiger":




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Was sollte denn dieses _window.location.href_ machen?
Ja, auf projektzeiterfassung.php verweisen, aber wieso so?

[EDIT]
'localhost/db/projektzeiterfassung.php' zu sagen, hilft auch nicht.


----------



## TessaKavanagh (13. Juli 2014)

Ja es soll die seite selber aufrufen. Allerdings erweitert um einen GET parameter. Zumindest funktioniert der Link an sich schonmal.

Was steht denn in der Browserzeile bei der Fehlermeldung? Wenn du den Code verwendest der grade editiert  in POST 257 steht.


----------



## boss3D (13. Juli 2014)

Und wieso sagen wir bei add und rem GET und nicht POST?


----------



## TessaKavanagh (13. Juli 2014)

Weil wir mit dem Link im Button die übergabe einer GET Variable faken. Das würde aber mit POST nicht klappen, den POST schreibt man ja nicht in die URL. GET wird in der URL übertragen, wenn du jetzt also die URL im Link entsprechend des Ergebnisses eines abgesendeten GET Formulars aufbaust, dann kannst du ein Formular vortäuschen.


Daher Wüsste ich auch gerne was in der Adresszeile steht wenn du auf den Button klickst.

Mit Links ist das ganze ziemlich simpel, aber mit diesem Scheiß Button JavaScript gemisch komme ich durcheinander mit der Syntax und daraus resultieren die moentanen Probleme, die es hetzt noch zu beheben gilt.


----------



## boss3D (13. Juli 2014)

http://localhost/projektzeiterfassung.php?add=1

rem macht gar nichts.

[EDIT]
Funktioniert schon, wenn ich jede Button-Code-Zeile in ein eigenes echo packe, wie in deinem Code. Ich hatte das in ein Echo gepackt.

Leider geht's halt jetzt nicht mehr, dass die Buttons nebeneinander sind, weil ich für die zentrale Ausrichtung jedem ein <div> geben muss (div class wird vom CSS erkannt), das aber gleichzeitig auch einen Zeilenumbruch bewirkt.


----------



## TessaKavanagh (13. Juli 2014)

```
echo '<button name="add" type="button" value="Zeile hinzufügen" onclick="window.location.href=\'projektzeiterfassung.php?add='.$add.'\';">Zeile hinzufügen</button> ';
echo '<button name="rem" type="button" value="Zeile entfernen" onclick="window.location.href=\'projektzeiterfassung.php?rem='.$add.'\';">Zeile entfernen</button> ';
```

habe den Code grade local getestet und den Fehler bei Rem behoben. Das läuft jetzt also. Jetzt bleibt nur die Frage warum deine Seite sich nicht selber aufruft.

Die heißt auch wirklich projektzeiterfassung.php      

Ja?


----------



## boss3D (13. Juli 2014)

^^ War gar kein Fehler mehr in deinem Code. Ich hatte blöderweise beide Zeilen in ein echo gepackt. Getrennt in zwei echos geht's eh.


----------



## TessaKavanagh (13. Juli 2014)

Ok aber es geht auch in einem echo. Ich schreibe dir das kurz mal um.


```
echo '<button name="add" type="button" value="Zeile hinzufügen" onclick="window.location.href=\'projektzeiterfassung.php?add='.$add.'\';">Zeile hinzufügen</button> <button name="rem" type="button" value="Zeile entfernen" onclick="window.location.href=\'projektzeiterfassung.php?rem='.$add.'\';">Zeile entfernen</button>';
```

Der Code muss aber in deinem Editor in einer Zeile stehen, das ist wichtig.


----------



## boss3D (13. Juli 2014)

In einer Zeile hatte ich es sogar. Auf den ersten Blick sehe ich jetzt auch keinen Unterschied zu meiner Version. K. A. was es da hatte ...

Jedenfalls merke ich gerade, dass nach wie vor keine Daten in die DB geschrieben werden. Irgendwas hat's also auch noch mit dem "Bestätigen" Button?!


----------



## TessaKavanagh (13. Juli 2014)

Ok aber Zeile + und Zeile - geht jetzt?


----------



## boss3D (13. Juli 2014)

^^ Ja


----------



## TessaKavanagh (13. Juli 2014)

Hast du mal <formular action=""> Überprüft?  Heißt deine Datei noch projektzeiterfassung2.php? Oder hats du Sie umbenannt. Dann musss hinter das Action natürlich formular.php


----------



## boss3D (13. Juli 2014)

Ne, das stimmt schon alles ...

```
<form action="formular.php" method="post">
```


----------



## TessaKavanagh (13. Juli 2014)

dann geh mal in Formular.php und lass eine $_POST Variable direkt am ANfang mit echo ausgeben. Dann sehen wir ob der Fehler in projektzeiterfassung.php oder formular.php zu finden ist. Am besten nimmst du $_POST['add'] dafür.


----------



## boss3D (13. Juli 2014)

Also wenn ich das ...

```
$add = $_POST['add'];
echo '$add';
```
... gleich am Anfang in formular.php einfüge, gibt er auch $add aus.


----------



## TessaKavanagh (13. Juli 2014)

Damit liegt der Fehler in formular.php Poste nochmal den aktuellen Code plz.

Und meinst du wirklich '$add' als Text oder den Inhalt der variable? denn wenn du den Text meinst, dann liegt es an den '     ' die du um die variable gesetzt hast.


----------



## boss3D (13. Juli 2014)

Ich hätte eigentlich den Variableninhalt (Wert) ausgeben wollen. Ich hätte mir eigentlich erwartet, dass er mir bei "$add" eben $add ausgibt ...

Hier jedenfalls formular.php:

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

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];    
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo".$a."", "di".$a."", "mi".$a."", "do".$a."", "fr".$a."", "sa".$a."", "so".$a."");
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];
                $erstellt = date('Y-m-d-h-i-s');
                $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
                $eintragen1 = mysql_query($eintrag);
            }        
        }
        unset($data);
        unset($stunden);
    }
?>
```
Vielleicht liegt's daran, dass das INSERT aufgrund zu vieler if-Verschachtelungen nicht immer erreicht wird?!


----------



## TessaKavanagh (13. Juli 2014)

> Und meinst du wirklich '$add' als Text oder den Inhalt der variable? denn wenn du den Text meinst, dann liegt es an den ' ' die du um die variable gesetzt hast.


Das hast du gelesen oder?


----------



## boss3D (13. Juli 2014)

Ja, okay, bei nur $add käme im aktuellen Beispiel 3 raus. Stimmt ja auch, ich habe 3 Zeilen.


----------



## TessaKavanagh (13. Juli 2014)

Kannst du mir auch nochmal den Code zeigen wie die Tabellenzeilen erstellt werden.


----------



## boss3D (13. Juli 2014)

projektzeiterfassung.php:


Spoiler





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

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

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

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

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"></div>';
?> 
</form>
</body>
</html>
```


----------



## TessaKavanagh (13. Juli 2014)

[EDIT ]


```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $user = $_SESSION['name'];
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;

    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.''];
        $beschreibung = $_POST['beschreibung'.$a.''];

        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");

        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];
                $erstellt = date('Y-m-d-h-i-s');
                $eintrag = "INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')";
                $eintragen1 = mysql_query($eintrag);
            }
        }
        unset($data);
        unset($stunden);
    }
?>
```


----------



## boss3D (13. Juli 2014)

Wo ist jetzt der Unterschied? Ich sehe keinen ...


----------



## TessaKavanagh (13. Juli 2014)

Im Array $data denn davon gibt es nur eine Zeile man darf sie also nicht mit nummer versehen. Packt man da nämlich eine Nummer drann ist die if Bedingung immer FALSE und es wird nie ein Datenbank Eintrag erzeugt.


----------



## boss3D (13. Juli 2014)

Ist klar. Jetzt stimmt's, danke. 

Ich gehe jetzt erstmal was essen, aber worum ich mich heute noch kümmern möchte: Alle "Schönheitsfehler", die bis jetzt im Laufe des Threads erwähnt worden sind, beseitigen. Was war denn da alles, mal nachdenken ...

Tessa --> sha512 statt MD5

DarkMo --> irgendwas wegen der vielen Zeilen in der DB bei mehreren Tagen Arbeit an selber Produkt/Tätigkeit-Kombination, und dass sich das so beim Auslesen schlecht im Excel wieder in einer Zeile darstellen lassen würde. 

ich selbst --> möchte es noch schaffen, dass man bei Login-Versuch ohne registriert zu sein zur Registrierung geleitet wird. Und dann wieder zurück zum Login. Sollte ich schaffen.

Hatten wir sonst noch was?
Das nehme ich mir heute Nachmittag/Abend vor ...


----------



## DarkMo (13. Juli 2014)

mein gott habt ihr scho wieder viel geschrieben. bist jetzt also dich wieder endgültig auf deinen code zurück? schade ^^

gut, hab mir 2 sachen rausgepickt: arrays und foreach und divs und zeilenumbruch.
zu den arrays. du weisst doch, wie die aufgebaut sind. array[key] = value. mit foreach kann man die super auslesen: foreach(array as key => value) oder, wenn man den key nicht benötigt, auch in kurzform foreach(array as value).das schöne is halt, es arbeitet einfach alle array einträge ab, bis das array durch ist und in jedem durchgang bekommt key den aktuellen array-index als wert und value eben den wert an sich. so kann man auch "unförmige" arrays auswerten. also nich sowas ala array[1,2,3,4...] sondern eher array["hallo","welt",1,2,3...]. da kommt man mit ner forschleife nich so weit 

und wie gesagt: mit der foreach kann man sich das add, dessen inkrementierung oder dekrementierung und das hiddenfeld sparen und hat dennoch das selbe ergebnis  weniger verwirrende programmlogik und entschlackter code 


gut, die divs und ihr untereinandergeschreibsel... ich denk du kennst dich mit html und css aus? ^^ divs sind block elemente (wie tabellen bspw auch). du müsstest das nur in ein inline element umbauen (wie font als blödes bsp ^^) -> style="display:inline" und sie stehen nebeneinander, reihen sich also in den fluss des textes ein (in line eben).


gut, nochmal was zum thema aufsplitten in verschiedene dateien: eine seite ist auch nur eben das - eine seite. du hast dein formular hier, deine tabelle und mehr nicht. also das ist quasi alles eins - es gehört also erstmal alles in ein file. also aufsplitung meine ich jetzt erstmal nicht, aber um konkret zu werden (so wie ichs hier rauslese): du hast deine zeiterfassung und dieses formular.php ding - 2 seiten. in zeiterfassung baust du die eingabe? in formular speicherst du diese. is ja grundsätzlich kein problem (im sinne der splittung), aber du nutzt es eben nicht als splittung, sondern eben als "externe" seite, wenn ich das richtig sehe. du bist in zeiterfassung und die form dadrin leitet dich auf formular.php - das is doch gülle ^^ da haste zwar am ende den kram in der db, aber siehst es nich bzw kommst nich wieder zur eingabe.

wie gesagt, das ist alles eins. wegen splittung: das ist völlig ok um ordnung in den code zu bringen. include macht ja nix weiter, als den text der includierten datei an die stelle des include-befehls zu kopieren. es ist also keinerlei uterschied, ob du etwas includierst oder direkt dort schreibst - nur ist es eben bei großem code etwas übersichtlicher. bei dir könnte das bspw so aussehen:

```
<?php
  // mysql verbindung aufbauen, session verwalten, varaiblen definieren... (zum bsp, ob man eingeloggt ist ^^)
  include('config.php');

  // empfangene formulardaten bearbeiten - auch das loginformular, was einen ggf einloggt
  include('formular.php');

  // die eigentliche seite
  if(!$login) {
    // login
    include('login.php');
  } else {
    // tabelle mit eintragungen und eingabeformular
    include('zeiterfassung.php');
?>
```
schon ist das alles grob struturiert und übersichtlich. aber alle buttons führen wieder HIERHIN. was ginge, wäre ein ausgelagerter loginpart, da die session eh "seitenübergreifend" wäre. aber solange das so hier funzt, passt das im grobaufbau so. die einzelnen dateien behandeln dann ihren krams und gut is. login offeriert einem eben die login-maske, zeiterfassung zeigt die daten in der db und gibt einem die möglichkeit, neue daten einzufügen, alte zu ändern oder zu löschen bspw. und formular behandelt alle eintreffenden formulardaten. kommt was von login (erkennt man ja anhand des button-namens), dann wird man eingeloggt, kommt was von zeiterfassung, wird das entsprechend behandelt.

wie gesagt, das wirkt bei dir alles sehr chaotisch und unstrukturiert. auch deine formular.phph mit den vielen verschachtlungen wirkt anstrengend. mMn langt da eine foreach und fertig. ich mach das btw immer so in etwa:

```
foreach(gesendeter_datensatz) {
  $form_ok = true;
  // jetzt gehe ich alle inputs des datensatzes durch * und checke, ob die eingabe ok ist. also leere inputs führen bspw zu nem fehler (sofern eine eingbe nötig ist...)
  if($_POST['input'] == "") $form_ok = false;
  // und jetzt wird ggf gespeichert
  if($form_ok) {
    $sql = insert meinen kram";
    // ...
  } else echo "fehlerhafte eingabe";
}
```
so, nochmal fix zu dem *:
wir haben ja mehrere formulardaten pro tabellenzeile. also taetigkeiten, produkte, beschreibung... in der forschleife kannste ja aber nur eines abfragen. allerdings haben alle zusammengehörigen den selben index. also zu taetigkeit[1] gehört produkt[1] usw usf. daher dieses foreach(input as key => value). weil dann kannst du mittels key auf die dazugehörigen anderen input-felder zugreifen. also ich hatte mir spontan als "input" taetigkeit" rausgesucht, würde also in foreach($_POST['taetigkeit'] as $key => $value) resultieren. um das zugehörige produkt zu bekommen, müsste man also $_POST['produkt'][$key] abfragen. um die tätigkeit zu bekommen, kann man das genauso machen, oder halt direkt $value nutzen, weil das ja eben post[tät.][$key] ist.


so, dann hattest du noch das mit dem einzeln speichern...


> DarkMo --> irgendwas wegen der vielen Zeilen in der DB bei mehreren  Tagen Arbeit an selber Produkt/Tätigkeit-Kombination, und dass sich das  so beim Auslesen schlecht im Excel wieder in einer Zeile darstellen  lassen würde.


ich meinte das folgendermaßen: du hast eine db-zeile, also einen eintrag mit EINEM daten und nicht mit einem datum für jeden wochentag. diese anzeigerei auf diese wochenart macht das ganze halt nich unbedingt einfacher, aber es ist machbar. allerdings sollten die "rohdaten" eben getrennt sein. oh man, das lässt sich jetzt schwer erklären. ich versuchs mal:

du hast also einen eintrag für tätigkeit 1 mit produkt 15 und einer beschreibung. das ist quasi der "eintragskopf" ^^ und dieses "projekt" will ichs mal nennen, hast du am montag, am mittwoch und am donnerstag bearbeitet, hättest also 3 eintragungen in dieser *einen tabellenzeile*! in der *sql-tabelle* sollte das aber dann *3 zeilen* ergeben. soviel zu der grundlage. jetzt hätten wir also in der db sowas stehen:


*id|tät|prod|beschr|zeit|datum|erstellt*

...
115|1|15|text|1.5|<datum von montag>|<erstellungsdatum>
 118|1|15|text|4|<datum von mittwoch>|<erstellungsdatum>
 117|1|15|text|3.5|<datum von donnerstag>|<erstellungsdatum>
...
wie du siehst, steht unser projekt-kopf nun auch 3mal drin mit immer den selben daten. das nennt man redundanz, und wie ich schonmal sagte: nix gut sowas. wenn ich mich noch recht an die vorlesung vor langer zeit erinner, dann sollten wir unsere db also lieber "normalisieren". ich nenne es jetzt einfach mal so ^^ ziel des ganzen: wir ziehen die daten der 3 zeiten für die 3 werkstage raus und hauen die in ne weitere db-tabelle. unsere tabelle von eben sähe dann bereinigt so aus:


*id|tät|prod|beschr|erstellt*

...
115|1|15|text|<erstellungsdatum>
 ...eine tät-prod-kombi resultiert in einem eintrag. schön, so soll es sein. wo sind nun aber unsere daten? dafür bauen wir wie gesagt ne neue tabelle:


*id|tät_prod_id|zeit|datum*

...
312|
115
|1.5|<datum von montag>
 313|
115
|4|<datum von mittwoch>
 314|
115
|3.5|<datum von donnerstag>
...in rot der sekundärschlüssel/foreignkey zu der anderen tabelle. über diesen bekommen wir nun wieder den zusammenhang zu unserem "projekt" oder "eintragskopf". und nix steht mehr doppelt und 3fach in der db ^^


----------



## boss3D (13. Juli 2014)

1) Der Teil mit der zusätzlichen Tabelle ist absolut klar, danke. Kriege ich selbst hin. 

2) Das mit dem "Splitten": Soweit ich's verstanden habe, würde sich da aber nicht viel reduzieren?! Du würdest dir eher noch ein zusätzliches File basteln, das, je nachdem was benötigt wird, immer genau dieses andere File includiert?! Fast so ne Art "Inhaltsverzeichnis" des Gesamtprojekts, das immer zu dem "Kapitel" springt, das gerade benötigt wird.

3) Das mit der foreach Schleife ist jetzt eigentlich nur noch "Spielerei". Wir haben ja schon eine funktionierende, wenn auch vielleicht umständliche, Variante. Sollte aber heute Abend noch Zeit bleiben, probiere ich, das ganze mit foreach hinzubasteln.


----------



## TessaKavanagh (13. Juli 2014)

```
<?php

class user
{
public $name = "";
private $name_db = "";
private $auto = "";
private $auto_db = "";
public $u_user_id = "";
public $rechte = "";
public $session_id = "";
private $password = "";
private $password_db = "";
private $pepper = "";
private $salt = "#sf$!\"ä\"$asd³s²a~§653 sa51d75qÖAa@üeX";
private $sql = "HIER GEHÖRT DER TABELLENNAME REIN";

        // Registrieren
        public function register($name,$password)
        {
        $sql = $this->sql;

             if($password == "")
             {
             $inhalt = "Es wurde kein Passwort eingegeben.";
             return($inhalt);
             exit;
             }

             $this->name = htmlentities($name);
             $password = htmlentities($password);

             $result = mysql_query("SELECT name FROM `$sql` WHERE name='$this->name'");
             $name_tmp = mysql_fetch_row($result);
             $name = $name_tmp[0];
             
             if($name == $this->name)
             {
             $inhalt = "Der Benutzername ist bereits vergeben";
             return($inhalt);
             exit;
             }
             
             // Zufallsgenerator schütteln
             mt_srand((double) microtime() * 1000000);

             // Basiszeichenpool
             $set = "ABCDEFGHIKLMNPQRSTUVWXYZ123456789*+~#-.,_:;|@!%&?";
             $pin = "";

             // 10 stelligen PIN aus den o.a. Zeichen erzeugen
             for ($n=1;$n<=10;$n++)
             $pin .= $set[mt_rand(0,(strlen($set)-1))];

             $this->pepper = $pin;
             
             // Verschlüsseln

             $password = hash('md5',$password);
             $password = htmlentities($password);
             $this->password = hash('sha512', $this->pepper.$password.$this->salt);

             // Eintragen

                    $result = mysql_query("SELECT COUNT(id) FROM `$sql`");
                    $count_tmp = mysql_fetch_array($result);
                    $count = $count_tmp[0];
                    $count++;

                    $result = mysql_query("SELECT u_user_id FROM `kazumi_basic` WHERE id='1'");
                    $u_user_id_tmp = mysql_fetch_array($result);
                    $u_user_id = $u_user_id_tmp[0];
                    $u_user_id++;

                    $aendern = "UPDATE `kazumi_basic` Set
                    u_user_id = $u_user_id WHERE id='1'";
                    $update = mysql_query($aendern);

                    $eintrag = "INSERT INTO `$sql`
                    (id, u_user_id, name, password, pepper, rechte)
                    VALUES
                    ('$count', $u_user_id,'$this->name', '$this->password', '$this->pepper', '1')";
                    $eintragen = mysql_query($eintrag);

           $inhalt = "Registrierung erfolgreich abgeschlossen.";
           return($inhalt);
             
             
             

        }
       // Ende Registrieren
       // Login
       
       public function login($name,$password,$auto)
           {

          // Daten aus DB abrufen

          $sql = $this->sql;
          $this->auto = $auto;
          $this->name = htmlentities($name);
          $name_cookie = $name;
          $password = htmlentities($password);

          $result = mysql_query("SELECT u_user_id FROM `$sql` WHERE name='$this->name'");
          $u_user_id_tmp = mysql_fetch_row($result);
          $this->u_user_id = $u_user_id_tmp[0];

          $result = mysql_query("SELECT name FROM `$sql` WHERE u_user_id='$this->u_user_id'");
          $name_tmp = mysql_fetch_row($result);
          $this->name_db = $name_tmp[0];

          $result = mysql_query("SELECT rechte FROM `$sql` WHERE u_user_id='$this->u_user_id'");
          $rechte_tmp = mysql_fetch_row($result);
          $this->rechte = $rechte_tmp[0];

          $result = mysql_query("SELECT pepper FROM `$sql` WHERE u_user_id='$this->u_user_id'");
          $pepper_tmp = mysql_fetch_row($result);
          $this->pepper = $pepper_tmp[0];

          $result = mysql_query("SELECT password FROM `$sql` WHERE u_user_id='$this->u_user_id'");
          $password_tmp = mysql_fetch_row($result);
          $this->password_db = $password_tmp[0];

          $result = mysql_query("SELECT auto FROM `$sql` WHERE u_user_id='$this->u_user_id'");
          $auto_tmp = mysql_fetch_row($result);
          $this->auto_db = $auto_tmp[0];
       
          // Username vergleichen
                      if($this->name != $this->name_db OR $this->name == "")
                      {
                      $inhalt = "Username nicht vorhanden";
                      return($inhalt);
                      exit;
                      }
                      // Passwort überprüfen
                      if($this->auto_db == 0 AND $password != "")
                      {

                      $password = hash('md5', $password);
                      $pw_cookie = $password;
                      $password = htmlentities($password);
                      $this->password = hash('sha512', $this->pepper.$password.$this->salt);

                      }
                      else if($password != "" AND $this->auto_db == 1)
                      {

                      $password = htmlentities($password);
                      $this->password = hash('sha512', $this->pepper.$password.$this->salt);

                      }
                      else
                      {

                      $inhalt = "Kein Passwort eingegeben";
                      return($inhalt);
                      exit;
                      }
       
                      // Eigentliche Prüfung
                      if($this->password == $this->password_db)
                      {

                      $aendern = "UPDATE `$sql` Set
                      auto =  '$this->auto' WHERE u_user_id = '$this->u_user_id'";
                      $update = mysql_query($aendern);



                      $this->session_id = create_sessid();
                      setcookie("kazumi_sid", $this->session_id, time()+3600);

                      $aendern = "UPDATE `$sql` Set session_id =  '$this->session_id' WHERE u_user_id = '$this->u_user_id'";
                      $update = mysql_query($aendern);




                                             if($this->auto_db == 1)
                                             {

                                             setcookie("kazumi_name", $name_cookie);
                                             setcookie("kazumi_pw", $pw_cookie);

                                             }

                      $_SESSION['user'] = serialize($this);
                      $inhalt = "Login erfolgreich.";


                      unset($_POST['send']);
                      return($inhalt);

                      }
                      else
                      {

                      $inhalt = "Passwort falsch";
                      return($inhalt);

                      }


           }
       
       
       
       
       // Ende Login

       // Logout
       
       public function logout()
          {

          $verbindung = verbindung();
          setcookie("kazumi_sid", $this->session_id, time()-1);
          $aendern = "UPDATE `$this->sql` Set
                      session_id =  '' WHERE u_user_id = '$this->u_user_id'";
                      $update = mysql_query($aendern);

          session_destroy();
          mysql_close($verbindung);
          }

       
       // Ende Logout
       
}





















?>
```

So das ist eine USER Klasse, die kannst du wenn du Sie anpasst durchaus für deinen Login verwenden. Die unterstützt vermutlich mehr funktionen als du benötigst. Du müsstest halt nur wenn du sie verwenden willst entsprechende Einträhe in der Datenbank erstellen bzw. Die MysQL anfragen an deine Datenbank anpassen. Der Code ist zwar etwas veraltet (siehe mysql) sollte aber dennoch funktionieren.
Wenn du Fragen hast kannst du sie gerne stellen. Die Klasse verwendet allerdings ebenfalls nich eine BASIC Tabelle in der Datenbank wo ich eine Unique ID speichere. Das hat damit zu tun, das ich durchgängige Indizis in Tabellen bevorzuge und daher normalerweise nicht mit Auto Increment arbeite. Deswegen hat ein Nutzer bei mir immer eine ID und eine UID. Die ID entspricht dem Eintrag in der USER Datenbank die UID ist die Zahl als welcher Nutzer sich jemand registriert hat.

Wenn z.B. sich 10 Nutzer registriert haben und 5 aus der Datenbank gelöscht wurden. Dann stehen in der Datenbank in der User Tabelle immernoch die IDs 1-5 aber es könnten trotzdem die Nutzer mit den UIDs 1,4,5,8,10 weiterhin existieren.
Ist zwar eigentlich unnötig aber eben eine Eigenart von mir 

Vermutlich wäre es daher sogar sinnvoller wenn du die Die funktionen zum Login und Registrieren mal anschaust und guckst wie ich die Verschlüsselung zusätzlich verstärkt habe .


----------



## boss3D (13. Juli 2014)

Zu den aufgeteilten Tabellen: Das einzige, das ich wieder nicht kapiere, ist, wie ich an die (automatisch von phpmyadmin generierte) id kommen soll ...

```
$ergebnis = mysql_query("SELECT id FROM zeiten WHERE ???");
```
WHERE was? Ich habe außer der eben genannten id keinen Wert, der eine Zeile eindeutig identifiziert.


----------



## DarkMo (13. Juli 2014)

hmm, erstmal die frage nach den tabellen namen ^^ bisher die hieß zeiten gell? ich würde eventuell die neue tabelle zeiten nennen und die bisherige vllt projekte oder so. und dann muss man in der neuen tabelle suchen. dann würde also zeiten wieder stimmen. und dann kommt wieder unser riesenkonstruckt zusammen, was wir schonmal entwickelt hatten. man muss also primär alle daten aus zeiten raussuchen, die in der aktuellen woche liegen und von user xyz sind (siehste, die spalte hatte ich beim bsp vergessen, die müsste auch in die neue tabelle wandern). wenn wir von der neuen benennung ausgehen (alte = projekte, neue = zeiten), dann sollte das so funtzen:
SELECT * FROM zeiten WHERE datum >= wochenanfang AND datum < wochenende AND user = xyz;

sekundär müssen wir dann noch rausfinden, wie das projekt dazu lautet. hier finden wir ja nur dessen id raus (oben hatte ich es taet_prod_id genannt - kann man hier ja sinnvollerweise projekt_id nennen) - aber über die bekommen wir die verknüpfung hin. zudem bräuchten wir noch den usernamen, und nicht nur seine id. also analog zum projekt rausfummeln:
SELECT * FROM zeiten AS z, projekte AS p, user AS u WHERE z.datum >= wochenanfang AND z.datum < wochenende AND z.user = xyz AND u.ID = z.user AND p.ID = z.projekt;

und abschließend bräuchten wir dann auch noch die produkt und tätigkeits id ersetzt durch deren bezeichnungen. wie gesagt, die spaltennamen musste halt an deine anpassen. ich tüdel besser auch nochmal rein, dass die dinger die wir brauchen auch aliasse bekommen:
SELECT t.bezeichnung AS taetigkeit, pr.bezeichnung AS produkt, p.beschreibung AS beschreibung, u.name AS user, z.datum AS datum FROM zeiten AS z, projekte AS p, user AS u, taetigkeiten AS t, produkte AS pr WHERE z.datum >=  wochenanfang AND z.datum < wochenende AND z.user = xyz AND u.ID =  z.user AND p.ID = z.projekt AND p.taetigkeit = t.ID AND p.produkt = pr.ID;

das dürfts sein ^^


----------



## boss3D (13. Juli 2014)

Gaaanz langsam der Reihe nach: Als erstes muss ich mir überlegen, wie  ich auf wochenanfang und wochenende komme. Du hattest da mal eine Idee,  wie man das "automatisiert" über die KW rausfinden und abspeichern  könnte. 

^^ Wobei das aber so eh nicht viel bringt, weil's ja auch sein kann, dass ein MA Daten zu einem alten Projekt nachtragen will. 

Ich fürchte, mir wird das zu hoch, was du hier machen willst. Ich denke mich lieber mal in das sha512 Zeug von Tessa rein ...

[EDIT]
Das hat ganz gut geklappt. War auch nicht viel nötig. Ich habe in eintragen.php und in login.php jeweils folgende Zeilen eingefügt:

```
$salt = "#sf$!\"ä\"$asd³s²a~§653 sa51d75qÖAa@üeX";
$passwort = hash('sha512', ($passwort).$salt);
```
Funktioniert auch einwandfrei, wenn ich mir den SHA512 in der DB anschaue, und ich denke, das ist so auch schon Security genug?! Ein SHA512-Hash über ein PW+Salt kann man doch aktuell eh nicht knacken, oder? Na ja, wer weiß. Müsste man bei der NSA nachfragen. 

Lediglich folgende Notice stört mich noch:


> *Notice*:  Undefined variable: asdÂ³sÂ²a in *C:\xampp\htdocs\db\eintragen.php* on line *8*


Das bezieht sich auf die $salt-Zeile, macht aber nichts negatives. Ich würd's nur gerne weghaben.

Ein PIN ist ja bei einem Webseiten-Login eher unüblich, aber wenn ich später noch lustig bin, kann ich ja auch noch ein paar Zufallszahlen anhängen. Jetzt schaue ich erstmal, dass ich das mit dem Verweisen auf eintragen.html hinkriege, sollte sich ein nicht-registrierter MA einloggen wollen.


----------



## TessaKavanagh (13. Juli 2014)

Der pin ist nur intern und wird zufällig generiert. Der wird im Klartext in die Datenbank gespeichert. Jeder Nutzer hat einen eigenen und kennt den auch garnicht. Das sorgt dann halt dafür, das Wenn zwei Nutzer das Passwort "TEST" benutzen da im Ergebnis zwei unterschiedliche Hashs rauskommen. Sonst kannst du anhand der Datenbank schon herausfinden das zwei Nutzer das gleiche Passwort verwenden. Das ist nicht gewollt 

Die Meldung bekommst du weg indem du vor das $ in der zeile einen \ setzt. Dann steht da \$ und er sieht es nichtmehr als variable an.

[Edit]

Bin heute aber erstmal raus. Muss jetzt zu ein paar Freunden Fußball und so  und btw. Tessa ist ein Er weil hier ER/Sie ab und an geschrieben wurde


----------



## boss3D (13. Juli 2014)

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


----------



## DarkMo (13. Juli 2014)

boss3D schrieb:


> Gaaanz langsam der Reihe nach: Als erstes muss ich mir überlegen, wie   ich auf wochenanfang und wochenende komme. Du hattest da mal eine Idee,   wie man das "automatisiert" über die KW rausfinden und abspeichern   könnte.
> 
> ^^ Wobei das aber so eh nicht viel bringt, weil's ja auch sein kann, dass ein MA Daten zu einem alten Projekt nachtragen will.
> 
> Ich fürchte, mir wird das zu hoch, was du hier machen willst.


 nuja, aber wie willste es denn sonst machen? irgendwo geht es doch garnich anders ^^ ich google mal ne runde rum, wie man das gelöst bekommen kann...

ok: PHP: date - Manual
damit wird sich bestimmt was machen lassen...
date('W'); liefert uns zum bsp die kalenderwoche - kann man ja mit ausgeben, welche aktuell angezeigt wird.
date('N'); liefert uns den wochentag als zahl. 1-7 für montag bis sonntag.

oha, ein timestamp scheint also sekundengenau zu sein: PHP: time - Manual muss man ja wissen ^^ ein tag ist also 60 secs * 60 mins * 24 h lang = 86400secs lang. jetz sollten wir noch rausfinden, welchen timestamp unser jetziger tag um 12uhr mittags hat (uns gehts ja nur um den tag, und die mitte is vllt ein guter anhaltspunkt ^^). könnte glaube so gehn: date('Y-m-d', strtotime('+12 hour')).

müsste man bissl testen, was so dabei rauskommt. sinnvollerweise ja ein timestamp oder date zum speichern in der db. sprich diese mktime() funke sollte man sich auch nochmal anschauen. also als algorythmus entwurf:
den aktuellen tag rausfinden
diesen auf 12uhr mittags normieren
davon den timestamp generieren
den aktuellen wochentag rausfinden
ausgehend von "heute" die woche berechnen
also wenn heute mittwoch ist, dann haben wir den tag 3, müssen also 2mal(?) 86400 abziehen um auf montag zu kommen und nochmal die hälfte um auf den tagesanfang zu kommen (vllt is 12 uhr mittags doch ned sinnvoll? kA ^^). dann hat man den wochenanfang. da jetzt 7 tage in timestampform draufzählen, und man sollte das wochenende haben (also 7*86400 addieren). und dann kann man die inputs für die einzelnen tage ja mit deren timestamps bspw ansprechen *denk* also statt name="mo[]" dann eben name="112584858[]" bspw. kann man ja locker nachbauen.

dann muss man natürlich auch das speichern in die db aufdröseln und das darstellen auch (also zusammenfassen der verschiedenen daten in ein "projekt" (also tätigkeit/produkt kombi eben).


----------



## boss3D (13. Juli 2014)

DarkMo schrieb:


> als algorythmus entwurf:
> den aktuellen tag rausfinden
> diesen auf 12uhr mittags normieren
> davon den timestamp generieren
> ...


Vielleicht bin ich einfach nur zu blöd, aber ehrlich gesagt K. A. was du mit all dem hier meinst. Wozu normieren? Wozu +12 hours? Da käme nur raus, dass heute schon der 14. wäre ...
Wozu timestamp generieren?

M. E. reichen ...
date('W') und date('N')
... schon völlig?! Wir kriegen die KW und wissen, welcher Tag in dieser KW gerade ist.

Mal überlegen, wie man das jetzt als _wochenanfang_ und _wochenende_ in deine Idee von der vorigen Seite reinbasteln könnte.

[EDIT]
Boah, ich habe da jetzt ein bisschen mit Schleifen und ifs rumprobiert, aber das wird abartig kompliziert. Vor allem, wenn mitten in einer KW Monatswechsel ist. Also ich will mir das nicht antun. Sollen die dann mit ihren Excel-Ergebnissen leben. Da kümmere ich mich lieber jetzt erstmal um wichtigere Dinge ...


----------



## DarkMo (13. Juli 2014)

das ding is doch aber, dass du eine WOCHENANSICHT hast. also musst du auch diese woche irgendwie generieren. und die "normiererei" ist einfach deswegen gedacht, dass man ja nur auf dentag genau angibt. ich kann ja auch am mi was für den montag eintragen. den aktuellen timestamp nehmen bringt da also rein garnix. zudem muss man eh das datum speichern (und somit tag genau errechnen), für den die eingetragene zeit gilt.

ansonsten erzähl mal, wie du dir das so vorgestellt hattest.


----------



## boss3D (13. Juli 2014)

Ich habe da ehrlich gesagt gar keine Idee dazu. Für mich ist das schon so kompliziert, dass ich mich da gar nicht mehr tiefer reindenken kann.

Ich weiß nur eines: Das wichtigste ist, dass ich/wir überhaupt soweit kommen, dass der Admin irgendwann per Mausklick(?) den Inhalt der DB (vielleicht, nachdem er ihn vorher auch noch nach einem bestimmten MA, einer Tätigkeit, einer Produkt, oder einer Arbeitsdauer gefiltert hat) in ein Excel-Dokument exportieren kann. Egal, wie das dann erstmal ausschaut.

Wenn wir soweit sind und dann noch Zeit ist, DANN können wir uns um diese Optiksachen kümmern. Aber wer hat was davon, wenn wir das jetzt schaffen, uns am Ende dann aber die Zeit für was essentielles fehlt und das Projekt nicht fertig wird?
----------

Für mich wird jetzt jedenfalls das hier der nächste Schritt, bei dem ich auch SELBER was machen kann:


DarkMo schrieb:


> wozu brauchst du ein gegenstück? wenn es nur  mitarbeiter und den admin gibt, ist das ne ganz simple geschichte:  erweitere deine user-tabelle um die spalte "Rechte" oder wie auch immer  und gib dem admin da ne 1 und den anderen allen ne 0. und abhängig davon  baust du dann die seite auf. zum bsp sowas:
> 
> ```
> // get user data - irgendwo ganz oben
> ...



[EDIT]
Einen letzten Fehler versuche ich auch schon seit ner Stunde auszubessern, krieg's aber nicht hin. Hier für _$row->passwort_ kommt immer:





> *Notice*:  Trying to get property of non-object





Spoiler





```
<?php
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    $username = $_POST["username"];
    $password = hash('sha512', ($_POST["password"]).$salt);

    $abfrage = "SELECT name, passwort FROM user WHERE name LIKE '$username' LIMIT 1";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_object($ergebnis);

    if ($row->passwort == $password) {
        $_SESSION["name"] = $username;
        header("Location: http://localhost/db/projektzeiterfassung.php");
    } else {
        echo '<link rel="stylesheet" type="text/css" href="style.css">';
        echo '<br><div class="submit"><form action="login.html">Benutzername und/oder Passwort waren falsch.<br><br><input type="submit" value="Login"></form></div>';
    }
?>
```


----------



## DarkMo (13. Juli 2014)

hast du schon nen groben plan, wie du eine excel datei erstellst? oder noch grundlegender gefragt: in welchem format ^^ weil wir haben die tabelle ja jetzt nach der excel vorlage gebaut, was ich nicht verkehrt finde generell. und ich vermute, die exportierte tabelle soll auch wieder in diesem format sein? also pro woche eine tabelle mit gefilterten oder auch ungefilterten daten.

das ding ist halt, diese wochenübersicht setzt halt von vornherein ganz natürlich dieses limit der woche ^^ und wenn wir das für die tabelle lösen, dann haben wirs doch auch schon für die exportfunktion gelöst. aber mach erstmal das hier, kannst das wochen-thema ja ma im hinterstübchen behalten  wenn nich grad fussball wär, würd ich mich mal ransetzen mit dieser wochen geschichte und praktisch rumtüfteln. das ganze nur in der theorie ist schon nen stück ^^


----------



## boss3D (13. Juli 2014)

Ah ja, heute ist ja Finale! Puh, ich als absolut Fußball-desinteressierte Person kriege das fast nicht mit ... Viel Spaß beim Match!

Das mit dem Excel-Export muss ich mir selbst noch anschauen, aber da gibt's eh vorher noch was zu tun, siehe oben.


----------



## DarkMo (13. Juli 2014)

aber wo ichs grad seh: wieso funzt sowas eigentlich? ^^
_$row->passwort_

-> is für mich nen zugriffsoperator auf klassen-elemente. aber ne mysql anfrage liefert doch nen array.



wegen fussball: mich intressiert auch nur wm und selbst dass erst seit meiner freundin ^^ aber wo wir schonmal im finale sind...


----------



## boss3D (13. Juli 2014)

Habe gerade den PC wieder gestartet und alles getestet: Plötzlich kommt der Error nicht mehr obwohl ich keinen Strich am Code verändert habe. 

Ich lasse das alles morgen in der Firma nochmal laufen. Wenn's dann auch passt, ist's ja gut. Was ich allerdings noch nicht verstehe, ist, was das -> überhaupt macht. Holen wir uns eine ganze Zeile aus der DB und müssen dann mit -> noch auf die eine gewollte Spalte zugreifen?

```
$abfrage = "SELECT name, passwort FROM user WHERE name LIKE '$username' LIMIT 1";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_object($ergebnis);

    if ($row->passwort == $password) {
```
Warum können wir uns nicht gleich einfach den Wert aus dieser einen Spalte holen?


----------



## DarkMo (13. Juli 2014)

ach du benutzt da auch ne komplett andere funke, das seh ich jetz erst: fetch object. ich glaub ich nutzte immer PHP: mysql_fetch_assoc - Manual bisher.


----------



## DarkMo (13. Juli 2014)

echo 'WELTMEISTER!';


----------



## TessaKavanagh (14. Juli 2014)

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



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

Sondern benutzen die Funktion mktime()

Die Funktioniert nach dem folgenden Prinzip:

```
$vordreisigtagenundzwoelfstunden = date("YmdHis", mktime(date("H")-12,date("i"),date("s"), date("m"), date("d")-30, date("Y")));   
echo $vordreisigtagenundzwoelfstunden;
```

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



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



Die Zufallszahl musst du trotzdem im Klartext in die Datenbank speichern. Denn sonst wirst du den Login nie hinbekommen  Die Pin in meinem Beispiel generiert eine Zufallszahl z.B. 14385 und nimmt dann aus der Zeichenkette die Zeichen


----------



## boss3D (14. Juli 2014)

Ich bin gerade am Überlegen, wie ich das jetzt wirklich am besten machen soll, mit Admin und User. Über eine Rechte-Spalte in der User-Tabelle kann ich eine Unterscheidung erzeugen. 

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

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

[EDIT]
Also, formular.php könnte man so erweitern:

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

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




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



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


----------



## TessaKavanagh (14. Juli 2014)

Mein Vorschlag:

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

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

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

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

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

Im Ergebnis befindet sich der Nutzer also immer auf der index.php in welche die gewünschte Seite eingebunden ist.
Um unbefugte Nutzer von den Seiten abzuhalten auf die Sie nicht dürfen, muss jetzt weiterhin der Code jedes "includes" in eine if Schleife geschrieben werden, welche die Rechte des Nutzers prüft. Hier ist zu beachten das du immer die Rechte in der Datenbank prüfst und keine $_POST[] Variablen, denn die lassen sich manipulieren. So ähnlich wie wir das mit GET gemacht haben.


----------



## boss3D (14. Juli 2014)

Von FlexBox habe ich noch nie was gehört, aber nach schnellem googlen ist das nichts anderes, als ein paar "optisch schöne" Buttons, die eben wohin "verlinken". Und so, wie ich das anhand deiner Beschreibung verstanden habe, soll ich jetzt einfach ein paar solcher Buttons machen, und je nachdem ob ein User Recht 0 oder 1 hat, soll ihn ein Buttonklick weiterleiten oder eben nicht?! Am Ende hätten dann die MAs jede Menge schöner Buttons auf ihrer Seite, die nichts machen?! 

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

[EDIT]
Ein "vor und zurück" lässt sich ja auch leicht implementieren:

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

[EDIT2]
Gerade getestet: Wie ich's angenommen hatte, habe ich dann doppelt so viele Zeilen als gewollt in der DB. Da muss ich mir noch was überlegen, wie beim Editieren die alten Einträge gelöscht oder durch die neuen ersetzt werden.


----------



## TessaKavanagh (14. Juli 2014)

Inkorrekt FlexBox ist im Prinzip genau das gleiche wie ein div Basiertes Layout (nur mit ein paar Vorteilen). Das hat erst mal Garnichts mit Buttons zu tun.

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

Wie gesagt bau dir eine Navigation und eine 2. Website für die Ausgabe.


----------



## boss3D (14. Juli 2014)

Trotzdem habe ich das Gefühl, dass wir im Prinzip das gleiche machen wollen ... 

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

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

^^ Damit "spiele" ich mich gerade herum, wie man das lösen könnte ...


----------



## boss3D (14. Juli 2014)

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

Für die Ausgabe, an der ich gerade bastle, kann ich mir zwar durchaus eine zweite Seite basteln, aber ich glaube, mein drittgenanntes Problem würde trotzdem bestehen bleiben?!


----------



## DarkMo (14. Juli 2014)

wieso wollt ihr unbedingt 2 seiten machen? boss hat das doch schon super erkannt (im ansatz): ihr habt die tabelle. diese kann output und input gleichermaßen bereitstellen (mir erschließt sich einfach nich, wozu man hier 2 tabellen oder gar 2 seiten braucht). und was ist das problem, mit if dem admin zusätzliche buttons und inputs zur verfügung zu stellen?

und ganz generell: auch der normale MA kann doch filtern. is doch durchaus denkbar ^^ nur halt nicht nach daten anderer MA's. aber in seinen daten sollt er auch filtern können *denk*


----------



## TessaKavanagh (14. Juli 2014)

1. Natürlich kannst du auch Buttons verwenden. Ich nehme an du wirst dann halt die Einträge hardcoded machen. Mein System basiert halt wieder auf der einfachen Erweiterbarkeit des Codes. Denn ein "neuer" Eintrag in der DB aktualisiert damit die gesamte Navigation der Webseiten.

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


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

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

Edit:
Zwei "Seiten" bzw. includes würde ich verwenden weil er sich damit nicht den bereits bestehenden Code zerschießt. Denn genau das wird passieren wenn er versucht diesen entsprechend einer Ausgabe mit Filtern umzuschreiben und das Eintragen Script auf Eintragen oder Update umzubauen.


----------



## boss3D (14. Juli 2014)

Ich habe zwar jetzt die zweite Seite erstellt, halte sie aber auch immer noch für unnötig ...

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




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



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

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

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

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


----------



## DOcean (14. Juli 2014)

Flexbox > http://css-tricks.com/snippets/css/a-guide-to-flexbox/


----------



## TessaKavanagh (14. Juli 2014)

@DarkMo

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

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

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

Im Ergebnis kann man also sagen, der Code wird dadurch zwar insgesamt länger aber auch einfacher.


----------



## boss3D (14. Juli 2014)

Also, so wie ich das sehe, geht's jetzt darum:

```
if () {
     $eintragen = mysql_query("INSERT INTO zeiten (taetigkeit, produkt, userid, beschreibung, zeit, datum, erstellt) VALUES ('$taetigkeit', '$produkt', '$userid', '$beschreibung', '$dauer', '$tag', '$erstellt')");
} else {
     $eintragen = mysql_query("UPDATE zeiten SET taetigkeit='$taetigkeit', produkt='$produkt', userid='$userid', beschreibung='$beschreibung', zeit='$dauer', datum='$tag', erstellt='$erstellt' WHERE ???");
}
```
Zum einen muss ich mir eben eine passende if-Bedingung überlegen, und zum anderen, wie ich jetzt beim WHERE wieder die entsprechende Zeile identifiziere. 

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

^^ Lässt sich irgendsowas realisieren? 

Ansonsten muss ich es eh über mehrere Seiten machen.

@ DOcean
Danke, genau auf der Seite hatte ich mir das angeschaut. Aber es wirkt mir zu umständlich für "das bisschen" was wir brauchen.


----------



## TessaKavanagh (14. Juli 2014)

```
WHERE id=$id
```
 Denn die Id kannst du dir bereits bei der Anzeige ausgeben lassen.
Realisieren lässt sich prinzipiell alles. Man kann auch eine Bedingung "verneinen" != also "ungleich". Du kannst natürlich deinem Button den Link "projektzeiterfassung.php?token=true" verpassen  Dann kannst du diesen dort per GET abfragen in ein hiddenfield verfrachten und hast diesen dann in Formular.php per POST zur Verfügung.


----------



## boss3D (14. Juli 2014)

a) Nur fürs Verständnis: Welche ids vergleichen wir hier? "id" ist die id in zeiten, also jene, die die Zeilen dort identifiziert. Aber was ist in der Variable "$id" gespeichert? Wo nehmen wir den Wert darin her? 

b) Tja, das doofe ist, wenn ich in meinem Button "projektzeiterfassung.php?token=true" sage, dann leitet mich das zwar auch zurück, aber wieder zu einer leeren projektzeiterfassung. Bei meiner Version mit "history.go(-1);return true;" komme ich wieder so zurück, dass die gemachten Einträge wieder angezeigt werden. 
Jetzt stellt sich halt die Frage: Was ist denn bei mir dieses "return true"? Könnte ich nicht das auch schon als mein "Token" verwenden?


----------



## TessaKavanagh (14. Juli 2014)

zu a)
Den Wert lässt du bereits beim Ausgeben in die Tabelle in einem hidden field speichern. Wenn du also die Tabelle mit vorbefüllten Daten zum ändern hast, dann kennst du in diesem Zeitpunkt bereits die ID. Die wird dann wieder mit übergeben und von dir in $id gespeichert. Damit kannst du dann das Update an genau der richtigen Stelle ausführen.

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

return True ist der "Rückgabewert" der Funktion. Die Funktion gibt also "Erfolg" zurück. Ist in diesem Fall quasi das Ausführungskommando.


----------



## boss3D (14. Juli 2014)

Okay, bei b) blicke ich schon wieder gar nicht mehr durch ...
Wie soll denn der User eben gemachte Einträge editieren können, wenn er gar nicht mehr sieht, was der da ne Minute zuvor eingegeben hat?

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

projektzeiterfassung.php:


Spoiler





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

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

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

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

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

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

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

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

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

    echo '<div class="submit"><form action=""><br><input type="submit" value="Daten nach Excel exportieren"></form></div>';
?> 
</body>
</html>
```



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

formular.php:


Spoiler





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

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

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return $token=true;"></form></div>';
?>
```



^^ Problem:
- Kann man das hier mit dem $token so lassen? In Zeile 22 bei der Definition, dann im if in der for-Schleife, und ganz am Ende im Button?


----------



## TessaKavanagh (14. Juli 2014)

> Wie soll denn der User eben gemachte Einträge editieren können, wenn er gar nicht mehr sieht, was der da ne Minute zuvor eingegeben hat?


Ist das nicht offensichtlich? Du musst die Felder eben mit diesen Werten "Vorbelegen"

Zu deinem zweiten Problem du musst halt eine Fallunterscheidung realisieren damit du dann mit einer if zwischen UPDATE und INSERT wählen kannst.


----------



## boss3D (14. Juli 2014)

TessaKavanagh schrieb:


> Ist das nicht offensichtlich? Du musst die Felder eben mit diesen Werten "Vorbelegen"


Geht's nicht auch einfacher? Du sagst ja selbst, an die id der Einträge käme ich ran. Kann ich dann nicht einfach statt UPDATE die alten Einträge, die ich "editiert" haben will, löschen, und die "Editierten" ganz normal per INSERT in die DB schreiben? Das war jedenfalls mein ursprünglicher Gedanke bevor du mit UPDATE kamst ...
(Dann bräuchte ich auch das ganze token-Zeugs nicht?!)

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


----------



## TessaKavanagh (14. Juli 2014)

Natürlich kannst du die Einträge auch löschen. Dadurch sehen die Nutzer aber trotzdem nicht was sie eingetragen haben^^.
Der Befehl dafür ist DELETE.

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




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



Gleiches Problem wie oben. Fallunterscheidung.


----------



## boss3D (14. Juli 2014)

Ah ja. 
Nur, die ganze token-Sache geht mir halt nicht so ganz ein ...

Meinen Code habe ich ja oben schon gepostet, aber so wird das sicher nicht gehen?! Syntaxfehler sind auf jeden Fall drinnen (vermutlich alleine schon bei "$token=true" im Button) und die Semantik scheint mir auch noch sehr "wackelig". Eigentlich müsste ich die Variable wohl eher in projektzeiterfassung. php anlegen und dann erstmal als "false" an formular.php schicken. Und nur, wenn der MA dort editieren will, wandert sie als "true" wieder zurück?! Dann würde zumindest mein if stimmen.

Aber das hin und her Schicken in den Verweisen der Buttons ist halt mein Problem.

[EDIT]
Ja, puh, das muss ich mir noch gut überlegen, wie ich denn jetzt eine Unterscheidung einbauen soll, die zwischen Daten-ab-in-DB und nur Daten-aus-DB-holen-und-anzeigen unterscheidet ...


----------



## TessaKavanagh (14. Juli 2014)

Wir fangen mal mit der Theorie an.

Zustand 1 leeres Formular zur Eingabe neuer Daten.
Zustand 2 belegtes Formular zum Ändern von Daten.
Zustand 3 nur Anzeigen von Daten.

Einen Submit Button für das Formular.

Ein Formularfeld  <hidden> Name "zustand" das den Wert $zustand annimmt

Default sollte jetzt m.E. nur Anzeige der Daten sein. ($zustand = 3) Beim klick auf Submit passiert Garnichts bzw Submit wird gar nicht erst angezeigt.
Wenn der User auf den Button "Daten eingeben" klickt Sieht er die leeren Zeilen die er beliebig erweitern kann. Dieser Button ändert Weiterhin die variable $zustand in $zustand=1; Wie das funktioniert kannst du dir bei Zeile+ und Zeile- anschauen.
Wenn der User jetzt auf Submit drückt und Formular.php aufruft, kannst du an $zustand prüfen was er machen möchte (Eintragen).

Jetzt klickt der User auf "Ändern". Dadurch ändert sich die Variable $zustand in $zustand=2.
Die Tabelle wird also jetzt mit vorbelegten Werten ausgegeben.
Wenn der Nutzer auf Submit drückt wird wieder Formular.php aufgerufen, $zustand ist jetzt $zustand=2
Du weißt jetzt also das er etwas Ändern will.

Wenn der User wieder auf "Nur Anzeigen Drückt" ändert sich $zustand in $zustand=3
Sollte der User also wieder Submit drücken ist $zustand = 3 es wird in Formular.php also nichts geändert oder neu eingetragen. Vorausgesetzt du zeigst Ihm Submit überhaupt an (das kannst du ja per $zustand ebenfalls verhindern.)


----------



## boss3D (14. Juli 2014)

Was mich irre macht, ist, dass ich meine Versuche nicht testen kann, weil ich die ganze Zeit kriege:


> *Notice*:  Trying to get property of non-object in *C:\xampp\htdocs\db\formular.php* on line *10*




```
$ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
$row = mysql_fetch_object($ergebnis);
$userid = $row->id;
```
^^ hier das dritte

Das hier zu Testzwecken eingefügt ...

```
$resultat = mysql_query($userid) or exit (mysql_error());
echo $resultat;
```
... ergibt: query was empty

Und wenn ich mich neu einlogge, kommt zwar die Notice nicht, aber dafür kriege ich: 





> You have an error in your SQL syntax; check the manual that corresponds  to your MySQL server version for the right syntax to use near '3' at  line 1


Dabei habe ich doch im gesamten Code kein '3'. ???


----------



## TessaKavanagh (14. Juli 2014)

Doch hast du nämlich vermutlich in $userid die sollte 3 sein.

Oben sagt er dir das es sich nicht um ein Objekt handelt.


Welchen Sinn soll denn der letzte Code Schnipsel haben?


----------



## boss3D (14. Juli 2014)

Ich habe mich mit meinem User "test" eingeloggt, der die userid=0 hat. K. A. wo der 3er herkommen soll ... ?

Den Code 2-Zeiler habe ich in einem anderen Forum gefunden, wo das selbe Problem behandelt wurde. Da habe ich gedacht, mal schauen, was der bei mir anzeigt. Und das war dann eben dieses "query was empty".

[EDIT]
Gerade in DB nachgeschaut. User "test" hat userid=6.

[EDIT2]
Jedenfalls kann ich nicht viel machen, solange wir diesen Fehler nicht gefunden haben, weil ja so formular.php nicht erreichbar ist (und ich kann ja auch nicht einfach schnell die userid löschen). Weiters hätte ich noch einen Syntaxfehler in eintragen.php beim Einfügen einer Variable in den auszugebenden Text:

```
echo '<br><div class="submit"><form action="login.html">Benutzer <b>'$username'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';
```
Ich habe schon alle Kombinationen von ', " und . durch, die mir eingefallen sind, aber ich kriege immer nur:


> *Parse error*:  syntax error, unexpected '$username' (T_VARIABLE), expecting ',' or ';' in *C:\xampp\htdocs\db\eintragen.php* on line *29*


---------------

Anstatt das kompliziert mit deinen vorgeschlagenen Zuständen und hidden Feldern zu machen, habe ich jetzt den Ausgabecode einfach in eine eigene Datei auswerten.php gepackt und die Zustände über superglobale Variablen realisiert. Auch im if bei der Bedingung.

Aber auch das kann ich erst testen, wenn die beiden Fehler (zumindest der erste) weg sind ...

[EDIT3]
Wieder was rausgefunden: Wenn ich mysql_fetch_assoc statt mysql_fetch_query sage, dann kriege ich wieder "nur noch" das Notice aus Posting #323 oben.

[EDIT4]
Mit @$userid = $row->id; kann ich die Notice abstellen (K. A. wie "schlau" das ist) und weitermachen, aber dafür funktionieren meine superglobalen Variablen nicht so, wie erhofft. Au, Mann, heute frustriert's echt nur ...


----------



## TessaKavanagh (14. Juli 2014)

```
echo '<br><div class="submit"><form action="login.html">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';
```

Wenn er mit dem Onjekt nicht arbeiten will, was vermutlich an der PHP Version liegt, dann nimm doch einfach eine andere Abfrageart z.B. array statt object. Google hilft da eigentlich immer weiter wenn man sein Problem einfach mal da sucht. Man ist wohl i.d.R. nicht der erste damit.


----------



## Rho (14. Juli 2014)

Läuft ja echt gut. Und ich dachte schon, das endet im totalen Chaos. Habe wohl einfach zu wenig Erfahrung auf dem Gebiet.

Welche Funktionen wurden denn inzwischen umgesetzt? Ist ja doch schon einiges an Zeit verstrichen.


----------



## boss3D (14. Juli 2014)

@ Tessa
Die Zeile funktioniert so zwar, aber irgendwo dürfte ich mir beim Rumprobieren einen Fehler in den Code reingebracht haben?! Jedenfalls läuft der Registriervorgang jetzt immer ins innere _else_ ("Fehler beim Speichern des Benutzernamens.") ...


Spoiler





```
<?php
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $username = $_POST["username"];
    $passwort = $_POST["passwort"];
    $passwort2 = $_POST["passwort2"];
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    if ($username == "test") {
        $rechte = 0;
    } else {
        $rechte = 1;
    }    

    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    
    if ($passwort != $passwort2 OR $username == "" OR $passwort == "") {    
        echo '<br><div class="submit"><form action="eintragen.html">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
        exit;
    }
    $passwort = hash('sha512', ($passwort).$salt);

    $result = mysql_query("SELECT id FROM user WHERE name LIKE '$username'");
    $menge = mysql_num_rows($result);

    if ($menge == 0) {
        $eintragen = mysql_query("INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
        if ($eintragen == true) {    
            echo '<br><div class="submit"><form action="login.html">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';        
        } else {        
            echo '<br><div class="submit"><form action="eintragen.html">Fehler beim Speichern des Benutzernamens.<br><br><input type="submit" value="Zurück"></form></div>';
        }
    } else {
        echo '<br><div class="submit"><form action="eintragen.html">Benutzername schon vorhanden.<br><br><input type="submit" value="Zurück"></form></div>';
    }
?>
```



Was den anderen Fehler betrifft: Abgesehen von irgendwelchen RCs vielleicht, benutze ich die fast aktuellste PHP-Version (5.5.11). Dürfte im Vergleich zu 5.5.14 nicht allzu anders sein?!
Siehe EDIT3 in meinem vorigen Posting: Ich habe außer _object_ noch _assoc_ (von DarkMo mal empfohlen) und _array_ probiert, bin aber nur wieder in den selben oder andere Notices/Errors gelaufen.
-----------

Abgesehen von dem Problem in eintragen.php funktioniert jetzt jedenfalls erstmal wieder alles wie gewollt. Den Fehler in formular.php habe ich halt mit "@" verdrängt, ich hoffe, das wird keine weiteren negativen Auswirkungen haben?!

Nachdem die superglobalen Variablen anscheinend nicht ganz so funktionieren, wie ich mir das vorgestellt hatte, um deinen Lösungsansatz "einfacher" nachzubauen, werde ich mich morgen mit frischer Energie in deinen Zustands-Variablen-Vorschlag reindenken.


----------



## DarkMo (14. Juli 2014)

^^ geht steil vorran 


gut, zum thema. hatte heute mittag mal bissl gebastelt wegen der "wochen geschichte". hat mich bissl hirnschmalz gekostet, aber nu funzt es:

```
<?php
  // in config.php zum bsp - jedenfalls irgendwo am anfang
  // -> berechnung der defaultwerte (+ paar hilfswerte, wie $wt)
  // (die treten dann in kraft, wenn man die seite neu lädt, also keine formulardaten hat - default ist also immer "heute")
  $kw = date('W');  // kalenderwoche
  $jahr = date('Y');
  $monat = date('n');
  $wt = date('N');  // wochentag
  $tag = date('j') - ($wt - 1);  // "normierung" auf montag (wochenanfang)
  $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  // timestamp des wochenanfangs (montags um 12)
  $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  // timestamp des wochenendes (sonntags um 12)

  // ...

  // bei der formular berarbeiterei dann das (wo die herkommen folgt danach):
  if(isset($_POST['wa'])) $wochenanfang = $_POST['wa'];  // hiddenfield "wa" vorhanden? -> übernimm wert
  if(isset($_POST['we'])) $wochenende = $_POST['we'];  // hiddenfield "we" vorhanden? -> übernimm wert

  // button "prevWeek" gedrückt? -> berechne eckdaten der vorhergehenden woche
  if(isset($_POST['prevWeek'])) {
    $wochenanfang -= 60 * 60 * 24 * 7;
    $wochenende   -= 60 * 60 * 24 * 7;
  }
  // button "nextWeek" gedrückt? -> berechne eckdaten der nächsten woche
  if(isset($_POST['nextWeek'])) {
    $wochenanfang += 60 * 60 * 24 * 7;
    $wochenende   += 60 * 60 * 24 * 7;
  }

  // aktualisiere alle relevanten werte
  $kw = date('W', $wochenanfang);
  $jahr = date('Y', $wochenanfang);
  $monat = date('n', $wochenanfang);
  $tag = date('j', $wochenanfang);

  // jetzt folgt die eigentliche tabelle. habe nochmals eine zeile über den tabellenkopf gesetzt, die dann die KW und die eckdaten der woche enthält + die "switch buttons":
  echo '<form action="index.php" method="post">'; // meine hauptseite heisst index.php - genau dahin gehn wir wieder :)
  echo '<table id="content">'; // die id ist wichtig für unser javascript - adden von input-zeilen
  // hier jetzt quasi nur eine zeile davor geprapft - diese zeile enthält ne weitere tabelle mit nur einer zeile und 3 zellen (prevWeek button, Kalender-daten, nextWeek button) - war zu doof das mit divs zu meistern xD
  echo '  <tr>';
  echo '    <td colspan="10" class="head_cap">';
  echo '      <table style="width:100%; border:none"><tr>';
  echo '        <td style="border:none"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';  // der button für die letzte woche
  echo '        <td style="width:90%; border:none; text-align:center">';
  // das if geblubber is an sich nur kosmetik. wenn die jahreszahlen von wa und we-datum unterschiedlich sind, werden beide angezeigt, ansonsten nur beim we-teil.
  // also bspw beim jahreswechsel 2013-2014. die woche ging vom 30.12.2013 - 5.1.2014. hier "abgekürzt" zu schreiben 30.12. - 5.1.2014 is doof ^^
  // einziger unterschied ist also eigentlich beim ersten date(), dass hier das Y fehlt.
  if(date('Y', $wochenanfang) <> date('Y', $wochenende))
    echo '            Kalenderwoche '.$kw.': '.date('j.n.', $wochenanfang).' - '.date('j.n.Y', $wochenende);
  else
    echo '            Kalenderwoche '.$kw.': '.date('j.n.Y', $wochenanfang).' - '.date('j.n.Y', $wochenende);
  echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  // hiddenfield, dass unseren aktuellen wa-timestamp zur nächsten seite rüberrettet ^^
  echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  // hiddenfield, dass unseren aktuellen we-timestamp zur nächsten seite rüberrettet...
  echo '          </td>';
  echo '        <td style="border:none"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';  // der button für die nächste woche
  echo '      </tr></table>';
  echo '    </td>';
  echo '  </tr>';
  // der ürsprüngliche tabellenheader mit den spaltenüberschriften:
  echo '  <tr>';
  echo '    <td class="head">Tätigkeit</td>';
  echo '    <td class="head">Produkt</td>';
  echo '    <td class="head">Beschreibung</td>';
  echo '    <td class="head">Mo</td>';
  echo '    <td class="head">Di</td>';
  echo '    <td class="head">Mi</td>';
  echo '    <td class="head">Do</td>';
  echo '    <td class="head">Fr</td>';
  echo '    <td class="head">Sa</td>';
  echo '    <td class="head">So</td>';
  echo '  </tr>';
  // hier käme jetzt die dynamische ausgabe aller zeiten..., die in der db stehen
  // [...]
  // und dann hab ich bei mir nochmal in formatierung einer headerzeile ne unterbrechung drin, gefolgt von der eingabemaske, die durch js dymanisch erweiterbar ist
  // (oder auch wieder zurechtgestutzt werden kann ^^)
  echo '  <tr>';
  echo '    <td colspan="10" class="head" style="text-align:center">Neue Datensätze eintragen:</td>';
  echo '  </tr>';
  // dann eine erste feste default-input zeile. hier muss man sich halt die ganezen selects und inputs vorstellen.
  // die id im tr-tag ist gedacht, um per js "checken" zu können, wie viele zeilen man noch löschen kann.
  echo '  <tr id="check">';
  echo '    <td>Tätigkeit</td>';
  echo '    <td>Produkt</td>';
  echo '    <td>Beschreibung</td>';
  echo '    <td>Mo</td>';
  echo '    <td>Di</td>';
  echo '    <td>Mi</td>';
  echo '    <td>Do</td>';
  echo '    <td>Fr</td>';
  echo '    <td>Sa</td>';
  echo '    <td>So</td>';
  echo '  </tr>';
  echo '</table>';

  // hier noch (bisher unschön) meine buttons reingeknallt
  echo '<input type="submit" value="Add Entry" name="btnAdd"> ';
  echo '<button type="button" onclick="javascript:add_line();">Add Input</button> ';
  echo '<button type="button" onclick="javascript:del_line();">Del Input</button>';
  
  echo '</form>'; // ende...
?>
```
ich hoffe mal, ich konnts ordentlich runterbrechen und du blickst durch ^^ funzt auf jedenfall soweit wunderbar.


----------



## Rho (14. Juli 2014)

Würde sich eigentlich für eure Zusammenarbeit Github nicht gut eignen? Oder zumindest Gists zum austauschen und weiterentwickeln von Code-Snippets. Scheint mir doch ein wenig unübersichtlich dutzende Codefetzen in diversen Beiträgen zu überblicken. Zum Teil auch noch inline in den Text miteingearbeitet.

Versionskontrolle im Allgemeinen wäre wohl eine Bereicherung für unseren PHP-Experten. Da lässt es sich auch gleich viel ungehemmter experimentieren und man behält bei den vielen Änderungen den Überblick.


----------



## DarkMo (15. Juli 2014)

meine fresse, ich habs grad hinbekommen, dass ich ne ordentliche input-zeile adden und löschen kann wie ich will plus der funktionalität, dass das produkt-select je nach gewählter tätigkeit angezeigt wird (also nur zusammengehörige produkte angezeigt werden). aber den code willste nich sehn xD


----------



## TessaKavanagh (15. Juli 2014)

Zeig mal . Der Kann ja nicht kompliziert sein  Wenn du schon Zeit hattest der Tabelle abgerundete Ecken zu verpassen 

Das man die aktuellste PHP Version verwendet heißt nicht immer das ein Befehl Fehlerfrei funktioniert @Boss, wenn du alten Code verwendest kann das halt bei "neueren" Versionen durchaus zu einem Fehler führen. Da muss man halt testen was klappt.


----------



## boss3D (15. Juli 2014)

@ DarkMo
Vielen Dank für die Mühe, aber ich kann damit leider kaum mehr was anfangen. Ich bin irgendwie gestern schon ausgestiegen. Mir ist das mittlerweile einfach alles zu hoch. 
Ich habe zwar heute noch versucht, nochmal bei dem Teil hier einzusteigen, indem ich erstmal die _zeiten_ Tabelle in _projekte_ und _zeiten_ aufgespaltet (Posting #283) und die INSERT Zeilen im Code entsprechend angepasst habe, aber es kommt bei allem nur noch Mist raus. Es geht gar nichts mehr ...

Ich denke, ich werde jetzt nur noch das allernötigste zusammenzubasteln versuchen, damit ich wenigstens noch irgendeine Ausgabe der Daten habe.


----------



## DarkMo (15. Juli 2014)

wie gesagt, mehr als code-fetzen kann ich selten liefern bei deinem code :/ der is aus meiner sicht halt durcheinander und für mich schwer zu lesen. auch das konzept mit den vielen seiten. eine seite zum eingeben, eine zum ausgeben, eine zum speichern, eine zum editieren... da fehlt mir schon das grundverständnis, wie das funktionieren soll.

eingabeseite
-> speichernseite
-> wie komm ich wieder zurück? bzw zur ausgabeseite...

für mein verständnis is das halt alles eins und gehört nicht getrennt (gesplittet (auch wenns übersetzt das selbe bedeuted ^^) gern, also dass man einzelne teillösungen in andere dateien auslagert - aber dennoch alle zusammengefügt in einer seite). ich kanns ja mal versuchen zu erklären:
hab jetzt 3 js-funktionen: addline, delline und switchselect. letztere kümmert sich um die anzeige der richtigigen produkt select. wie gesagt, grundidee mit den selects war, dass ich für jede tätigkeit ein komplettes select baue und in ein (mit id versehenes) div packe, welches ich mittels display:none verstecken oder mit ...block anzeigen kann. besagte id lautet "produkt"+tätigkeits-id. also haben wir die tätigkeit gießen mit der id2 (um bei meinem dürftigen bsp db-eintrag zu bleiben ^^), dann werden alle produkte, die man gießen kann in ein div mit der id "produkt2" gepackt. gut, die tätigkeits-selectoptionen bekommen als value genau diese id (die muss später ja auch in die db gespeichert werden, 2 fliegen mit einer klappe szs). als javascript event bekommt das select nun onchange und dabei wird switch_select() aufgerufen. diese funke schaut sich nun bei dem tätigkeiten select an (hat auch ne id bekommen, damit ichs easy find ^^), welche option ausgewählt wurde (selectedIndex...) und kann hierraus die tätigkeiten id ermitteln. joa, und mit dieser fällt die entscheidung leicht, welches div ich nun anzeigen muss und welche versteckt werden müssen. ist im ende eine forschleife durch alle optionen des tätigkeits selects und wenn eben der aktuelle index i dem selectedindex entspricht, wirds angezeigt, sonst nicht.

gut, damit funzte das also schonmal für eine zeile. achja: ich hatte mich entschieden, eine "default input zeile" anzubieten. eben bei jener funzt das auch. ich hatte da aber noch nen denkfehler drin: der einfachheithalber wollte ich dieses default-tätigkeits-select immer hernehmen, um diese forschleife durch die tätigkeiten zu bauen anstatt des wirklich genutzten (die zeigen ja alle die selben options). aber dann funzt es nicht, wenn ich zeilen geadded hatte. is ja klar - wenn ich das 3. select änder und beim default den selectedindex abfrag... ^^ also mussten die alle ne id bekommen und durchgezählt werden... das war ne schau :/ hatte ja schon die zählvariable im hiddenfeld rausgeschmissen >< hab ich also nen anderen versuch gewagt. dazu eine kleine zwischengeschichte: meine buttons (die bisher ausserhalb der tabelle darunter waren) hatte ich nun als finale zeile mit in die tabelle gepackt. so, nun drückte ich delete-zeile und schwupps war sie weg xD schlau gelöst! ^^ also gab ich dem ding auch ne id und verhinderte, dass dieses tr mit der id gelöscht werden kann. die default-zeile bekam soeine id ja auch schon - szs als stopper. gut, nun hatten also die "umschließenden" tr's jeweils ne id - also hab ichs ganz simpel gelöst: geh alle tr's der tabelle durch und merke dir, die wievielte die default-zeile ist und die wievielte die letzte zeile ist - die differenz entspricht der anzahl meiner geaddeten zeilen. war auch nich ganz richtig *seuftz* scheinbar zählt er wirklich ALLE tr-tags innerhalb der tabelle - auch wenn die garnich zur tabelle selbst gehören, sondern zu einer tabelle in der tabelle. wir erinnern uns: meine buttons hatte ich analog zur ersten zeile mit der kalanderwoche auch wieder in eine innere tabelle gepackt, die eine zeile besaß. also wird die zang! mitgezählt ><

aber gut, ich hatte es hinbekommen die anzahl mit rauszubekommen und konnte demnach beim adden die id's anpassen. hatte am ende einfach die anzahl (var count) mit nem _ getrennt hinten an die id's angehängt. schon konnte ich das entsprechende tätigkeits-select zum rausfinden des selectedindex ansteuern (taetSel_2 zum bsp) und damit die richtigen divs steuern (produkt 1_2...). dazu muss man der onchange funke natürlich noch den richtigen index mit übergeben, wird also aus switch_select() ein switch_select(count).

joa. beim adden einer zeile hatte ich das ganze dann ja mal ausgebaut von meinem ein-zellen-zeilchen auf ne ordentliche und da eben das gefummel mit den selects gehabt. zuerst hatte ichs so gemacht, dass ich ans innerhtml der table einfach ne als string geschriebene tabellenzeile angehängt hatte, aber damit hatte er schon gemacht eingaben wieder resettet. also musste ich wirklich was anhängen, und das war zumindest spannend rauszufinden, wie das so klappt ^^ document.createElement(tag-name); da kann man inputs und selects und options bauen. so hab ich bspw die tätigkeiten umgesetzt (das array hatte ich mir vorher zurechtgebaut, mit der mysql abfrage...):

```
// ...
  echo '        cell = row.insertCell(0);';
  echo '        select = document.createElement("select");';
  echo '        select.name = "taetigkeit[]";';
  echo '        select.id = "taetSel_" + count;';
  echo '        select.onchange = function(){switch_select(count);};';
  foreach($selTaetigkeit['data'] as $id => $text) {
    echo '        option = document.createElement("option");';
    echo '        option.value = "'.$id.'";';
    echo '        option.innerHTML = "'.$text.'";';
    echo '        select.appendChild(option);';
  }
  echo '        cell.appendChild(select);';
  // ...
```
da kann mans schon erahnen. die produkt selects sind nochma ne ecke schärfer (divs noch drum herum und auch nich nur eines - also halt 2 schleifen statt nur einer, die eigentliche anzahl is ja bumms) und da kommt einiges an code zusammen ><

ich kanns bei bedarf mal zur verfügung stellen. fehlt halt die speicherei momentan und um den login hab ich mich bisher auch ned gekommert (standard-werte für user und login ^^ 1 und true ). machen kann man noch viel. ne eingabemaske um produkte und tätigkeiten zu verwalten bspw - das wäre dann wirklich mal ne zweite seite wert  das wäre nämlich ein neuer in sich abgeschlossener themenkomplex.


----------



## boss3D (15. Juli 2014)

(Ohne jetzt alles gelesen zu haben, was ich aber noch machen werde ...)

Deine Vorgabe (optisch) nachzubauen ist kein Problem. Das habe ich ruckzuck gehabt, bin ja nicht doof:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Waren nur folgende Anpassungen im Code notwendig ...

auswerten.php


Spoiler





```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  
    
    $db_erg1 = mysql_query("SELECT * FROM zeiten WHERE datum >= $wochenanfang AND datum < $wochenende AND userid = $userid"); // alle daten aus zeiten raussuchen, die in der aktuellen woche liegen und von user xyz sind
    $db_erg2 = mysql_query("SELECT * FROM zeiten AS z, projekte AS p, user AS u WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid"); // ^^ Wie lautet Projekt dazu?
    $db_erg3 = mysql_query("SELECT t.taetigkeit AS taetigkeit, pr.produkt AS produkt, p.beschreibung AS beschreibung, u.name AS user, z.datum AS datum FROM zeiten AS z, projekte AS p, user AS u, taetigkeiten AS t, produkte AS pr WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid AND p.taetigkeit = t.id AND p.produkt = pr.id"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
    if (!$db_erg1 || !$db_erg2 || !$db_erg3) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    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.n.', $wochenanfang).' - '.date('j.n.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.n.Y', $wochenanfang).' - '.date('j.n.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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    while ($zeile = mysql_fetch_assoc($db_erg2, MYSQL_ASSOC)) {
        echo '<tr>';
        echo "<td>".$zeile['taetigkeit']."</td>";
        echo "<td>".$zeile['produkt']."</td>";
        echo "<td>".$zeile['beschreibung']."</td>";
        echo '</tr>';
    }
    while ($zeile = mysql_fetch_assoc($db_erg1, MYSQL_ASSOC)) {
        echo '<tr>';
        echo "<td>".$zeile['zeit']."</td>";
        echo "<td>".$zeile['datum']."</td>";
        echo '</tr>';
    }
    //$zeile3 = mysql_fetch_assoc($db_erg3);
    echo '</table>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
?>
```



^^ Ich wage auch zu behaupten, dass alles bis auf eine Kleinigkeit richtig ist. Allerdings kriege ich, genau deswegen, keine Ausgabe, und meine Vermutung ist, dass der Wochenvergleich an den Schreibweisen scheitert?! In der DB habe ich 14.*0*7.2014 stehen und auf der Webseite wird aber (so, wie's offensichtlich berechnet wird) 14.7.2014 ausgegeben. Könnte es daran scheitern, dass ich keine Ausgabe des DB-Inhalts kriege? 
Dass die Ausgabe (siehe unten im Code bei der while Schleife) noch nicht ordentlich formatiert ist, musst du mir nicht sagen, das weiß ich eh. Aber bevor ich mich darum kümmere, hätte ich erstmal gerne überhaupt was gesehen.

Auch in der DB passt alles:

Tabelle "projekte":




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Tabelle "zeiten":




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Hier das korrekt angepasste formular.php


Spoiler





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

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];    
    
        $stunden = array("montag".$a."", "dienstag".$a."",  "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."",  "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeit',  '$produkt', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] !=  "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid,  taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer',  '$tag')");
            }        
        }        
        unset($data);
        unset($stunden);
    }
?>
```



-----------

Das eigentliche Problem, das ich habe, ist, dass ich eben deine Javascripte zum Vor- und Zurückschalten bei den KWs nicht habe, und alles das ich mir selber zusammenpfusche, ergibt nur Mist ... 

_PS: Ich gehe jetzt in die Mittagspause. Bin ab 12:30 wieder da._


----------



## TessaKavanagh (15. Juli 2014)

Fazit:

Gelöst hast du es aber auch nicht wirklich simpel und auch nicht mit den Grundlagen Fähigkeiten des TE. Den vollständigen Code wird er also vermutlich auch nicht vollständig verstehen und es ist eine weitgehende JS Lösung soweit ich das verstehe? .

14.07.2014 und 14.7.2014 sind für PHP zwei verschiedene Werte. Ich vermute es liegt an der date() Formatierung für "Monate" da gibt es eine Möglichkeit mit und ohne führende 0. Musst du mal schauen was verwendet wird und was verwendet werden müsste.

[EDIT] Wie vermutet. Du verwendest im Code date("n") für Monate ohne führende 0. Beim speichern verwenden wir aber date("m") für Monate mit führender 0.


----------



## DarkMo (15. Juli 2014)

jop, die führende 0 hab ich weggelassen, da sie völlig bedeutungslos ist  zum rechnen fühlt sich ne 7 einfach besser an wie ne 07 ^^ - obwohl es sicher keinen unterschied machen würde (kA grad) und schließlich würde ich auch ned "01.07.2014" in die db speichern, sondern den timestamp  und da ist wie gesagt die formatierung der ausgabe völlig egal.

kalender-js-funktionen... joa, die gibts nicht  die buttons laden die seite neu, daher auch die vielen hiddenfields und buttonabfragen  ginge bestimmt auch mit js, aber das formular musst du so oder so wieder löschen, da sich ja die daten der mo-so inputs ändern. also eine eingabe für den 14.7 in einem eingabefeld für den 7.7. ... ^^

und wegen schwierigkeitsgrad: joa, es is bissl was bei rumgekommen. aber bei addline ist es eigentlich nur der aufgeblähte code, der das erstmal nach "uff" aussehen lässt. aber alles funktioniert eigentlich nach schema f. ich sag mal so: gerade was js anbelangt hab ich vorher auch nie wirklich was gemacht. hab da also quasi auch von 0 her angefangen und nur rumgegoogelt ^^


----------



## boss3D (15. Juli 2014)

Okay, können wir bitte die Probleme der Reihe nach lösen und nicht gleich wieder alles als schwarz reden?

Jedenfalls wäre bei meinem Code die Reihenfolge jetzt folgende:
1) Ausgabe kriegen 
2) Ausgabe formatieren
3) Bei "Einträge editieren" Button-klicken zurück zu projektzeiterfassung.php, aber so, dass dort die Eingaben noch erhalten sind ("vorbelegte" Felder?!)

^^ Dann wäre ich, soweit ich das sehe, eh am aktuellen Stand und es würde dann zum Projekt(minimal)ziel auch nichts mehr fehlen, als eine Filterfunktion nach Namen für den Admin und eben der Export nach Excel?!
-----------------

Ich habe jetzt mal alle date("n") zu m geändert. Das hat zwar die Ausgabe mit 0 herbeigeführt (was ich persönlich auch optisch schöner finde), das Problem aber nicht gelöst. Ausgabe kommt also aus einem anderen Grund keine. Der ist jetzt zu suchen ...


DarkMo schrieb:


> die buttons laden die seite neu, daher auch die  vielen hiddenfields und buttonabfragen  ginge bestimmt auch mit js,  aber das formular musst du so oder so wieder löschen, da sich ja die  daten der mo-so inputs ändern. also eine eingabe für den 14.7 in einem  eingabefeld für den 7.7. ... ^^


Den Teil kapiere ich noch nicht ganz, sonst ist mir dein System schon halbwegs klar. Heißt das auf gut Deutsch, ich brauche gar kein Javascript oder sonstiges Zeugs, weil die Buttons nur aufgrund des php Codes die Seite bereits bei jedem Klick neuladen? Und beim angezeigten Datum wird immer das aktuellste berechnet, also eben die jetzige Woche? Und angezeigt sollten mir dann erstmal, falls überhaupt vorhanden, alle DB-Einträge dieser Woche werden?

^^ Wenn das so läuft, hätte ich es sogar komplett durchschaut, allerdings bringt mich das nicht weiter, warum ich keine Ausgabe für scheinbar zusammenpassende Daten kriege ...

[EDIT]
Irgendwie hängt der Fehler wahrscheinlich damit zusammen, was in diesen Zeilen ...

```
$db_erg1 = mysql_query("SELECT * FROM zeiten WHERE datum >= $wochenanfang AND datum < $wochenende AND userid = $userid"); // alle daten aus zeiten raussuchen, die in der aktuellen woche liegen und von user xyz sind
$db_erg2 = mysql_query("SELECT * FROM zeiten AS z, projekte AS p, user AS u WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid"); // ^^ Wie lautet Projekt dazu?
$db_erg3 = mysql_query("SELECT t.taetigkeit AS taetigkeit, pr.produkt AS produkt, p.beschreibung AS beschreibung, u.name AS user, z.datum AS datum FROM zeiten AS z, projekte AS p, user AS u, taetigkeiten AS t, produkte AS pr WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid AND p.taetigkeit = t.id AND p.produkt = pr.id"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
```
... in $db_erg1/2/3 gespeichert wird, und was ich dann hier auszugeben versuche:

```
while ($zeile = mysql_fetch_assoc($db_erg2, MYSQL_ASSOC)) {
    echo '<tr>';
    echo "<td>".$zeile['taetigkeit']."</td>";
    echo "<td>".$zeile['produkt']."</td>";
    echo "<td>".$zeile['beschreibung']."</td>";
    echo '</tr>';
}
while ($zeile = mysql_fetch_assoc($db_erg1, MYSQL_ASSOC)) {
    echo '<tr>';
    echo "<td>".$zeile['zeit']."</td>";
    echo "<td>".$zeile['datum']."</td>";
    echo '</tr>';
}
```
^^ Da passt was nicht zusammen?! Die Syntax müsste schon korrekt sein, aber vielleicht hat's was mit den zeilen-Indexen?! Obwohl ich eigentlich schon genau das gewählt habe, was ich mir laut DarkMo's Code-Kommentaren als Inhalt der Felder erwartet hätte ...


----------



## DarkMo (15. Juli 2014)

also erstmal zu der "wochen wechselei" nochmal: das einzig wichtige sind die beiden timestamps wochenanfang und wochenende. rein theoretisch bräuchts auch nur einen, weil den 2. kann man ja ausm ersten jederzeit wieder errechnen (so eine woche is ja nichmal 7 tage lang und dann mal 8 ^^). ich hatte es jetzt eben mit diesen daten gelöst. jedenfalls ist das halt das schöne am timestamp: du brauchst sont nix und alles lässt sich dadraus errechnen. grundprinzip: beim aufruf der seite wird _generell _der kram für die _jetzige woche _berechnet. sollten formulardaten vorhanden sein, so überschreiben sie diese werte. wurde das formular durch einen der wochen-wechsel buttons gesendet, so wird das eben überschrieben auch noch angepasst (eine woche draufgelegt oder abgezogen). ab hier ändert sich nichts mehr an diesen werten und alles weitere bezieht sich auf genau diese woche, die diese werte beschreiben.

bei mir bekommen die mo-so inputfelder als namen zum bsp auch ihren jeweiligen timestamp. beim speichern in die db, kann ich diesen namen dann gleich für die spalte Datum in zeiten nutzen.



zu dem anderen problem: da hab ich gerade dran gesessen und es war nich so trivial, wie ichs mir vorgestellt hatte :/ ich benutze folgende abfrage:

```
SELECT
                t.Bezeichnung AS Taetigkeit,
                p.Bezeichnung 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
                z.User = '".$user."' AND
                u.ID = z.user AND
                pr.ID = z.projekt AND
                pr.Taetigkeit = t.ID AND
                pr.Produkt = p.ID
          ORDER BY
                z.Datum ASC;
```
das liefert zumindest schonmal das, was ich brauche ^^ hatte auch nen gaaaanz fiesen fehler drin -.- fast ganz unten bei pr.Produkt = p.ID stand erst pr.Produkt = p*r*.ID -.- allerdings is das zusammenfassen ne geschichte für sich >< ich kanns dir ja mal zeigen, wie ichs jetz gelöst hab. anstelle der sofortigen ausgabe speicher ichs erstmal in nen array mit vielen unterarrays (pro tätigkeit kanns mehrere produkte geben und pro produkt eben verschiedene daten - und die sollen ja zusammen gemehrt werden). es sieht gaube schlimmer aus wie es is, aber es war gefummel, dahin zukommen ><

```
$row_collector = array();
  if(mysql_num_rows($res)) {
    while($row = mysql_fetch_assoc($res)) {
      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>';
  }
```
mit den !isset()'s bau ich das array quasi stück für stück auf. wenn ich dann zu $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit']; komme ist sichergestellt, dass auch alle arrays scho da sind. danach forme ich das alles in ne tabelle um. zuerst hatte ich die beschreibung anders gespeichert (als teil der tätigkeit und ned als teil der tätigkeit/produkt-kombi) und hätte ich es einfach so ausgegeben, wäre die reihenfolge tätigkeit, beschreibung, produkt gewesen - also 2 und 3 vertauscht. daher das gefummel mit dieser hilfsvariable td. dann musst ichs aber eben in die kombi mit reinnehmen (es ist ja die beschreibung des projekts (eben jener kombi) und ned der tätigkeit selbst) und konnt es gescheit platzieren - ich denk mal, die td-variable könnte man so auch weglassen jetzt.
die ausgabe erfolgt jedenfalls nicht für jede tätigkeit (äussere forschleife) sondern pro produkt (also in der inneren forschleife). aaaaber, er sammelt alles gescheit zusammen. jetz muss ich nur noch bei der eingabe erstmal paar checks noch einbauen, ob nich schon was vorhanden is bla blubb. das is immer ätzend :/


----------



## bingo88 (15. Juli 2014)

Ich habe mir gerade mal die letzen Codepostings angesehen und da kam mir direkt das Thema SQL Injection in den Sinn  Sollte das mal produktiv gehen, würde ich das doch vorher fixen. Habe zwar keinen Plan von PHP, aber das sehe ich noch  Selbst wenn das nur ein Lernprojekt ist, solltest du den sicheren Umgang mit parametrisierten Datenbankqueries lernen. Auch XSS bzw. XSRF könnte ein Problem sein, dafür habe ich jetzt aber nicht tief genug gewühlt


----------



## TessaKavanagh (15. Juli 2014)

XSS Risiko besteht, da ja die Nutzer eingaben ohne Validierung wieder ausgegeben werden. Die Grundsätzliche Problematik hatte ich auch etliche Seiten vorher mal erläutert.
XSRF ist zwar ebenfalls Grundsätzlich möglich momentan aber m.E. nicht das eigentliche Problem zumal nur über POST möglich. Der Böse Junge kann also zumindest nicht einfach die URL eingeben .

Das Problem hier ist Erst mal bis Freitag überhaupt etwas stehen zu haben. Einen absolut Grundlegenden Schutz kann man dann zumindest schon mal mit hrmlentities erreichen.


----------



## DarkMo (15. Juli 2014)

meinst sowas? anstelle von

```
"INSERT INTO tabelle
                              (Spalte)
                          VALUES
                              ('".$wert."');"
```
sowas:

```
"INSERT INTO tabelle
                              (Spalte)
                          VALUES
                              ('".addslashes(htmlspecialchars($wert))."');"
```
?


----------



## bingo88 (15. Juli 2014)

Nee, guck dir mal den Link an, den ich gepostet habe. Da sind einige Beispiele, wie man dem Problem entgegenwirken kann.

Ich wollte es ja nur mal in den Raum werfen, da ich schon öfters derartigen Code in Produktion gesehen habe. Und das nur, weil niemand den Azubi darauf hingewiesen hat, zumal man sich relativ leicht vor Injections schützen kann. Leider wird das in vielen PHP Tutorials nicht mal angesprochen, was dann wieder zu derartigem Code in Produktivumgebungen führt. Ist also ne Art Teufelskreis


----------



## DarkMo (15. Juli 2014)

k, mal anschauen demnächst. jetzt darf ich erstmal wieder meinen freien tag auf arbeit genießen 
hab mal schnell meine version zusammengepackt, soweit wie sie jetzt ist. ungetestet ^^ is zwar eingebaut, dass er bei neuen eingaben checked, ob schon vorhandene projekte usw vorhanden sind und ggf aktualisiert, aber keine zeit zu guggn, ob das auch funzt. mine db hab ich auch mal angehängt (das .sql file, sollte per phpmyadmin importierbar sein - am besten als neue db ^^), damit du dir den aufbau der tabellen anschauen kannst (weis ja jetz ned, ob wir das gleich haben).


----------



## TessaKavanagh (15. Juli 2014)

Müsste nicht DBO mit prepared Statments von haus aus sicher gegenüber SQL Injection sein?


----------



## bingo88 (15. Juli 2014)

Ja, das wäre eine Möglichkeit, zumindest sofern die Parameter korrekt gesetzt werden (bind?). Das schützt allerdings noch nicht vor Injections 2. Ordnung, bei denen die bösen Befehle direkt aus der DB kommen. Das kann passieren, wenn die Eingabe 1:1 in die DB geschrieben und später als Parameter einer (internen) Query verwendet wird.


----------



## TessaKavanagh (15. Juli 2014)

Aber DBO execute() escapt alles Böse. Das ist in die Funktion bereits hereingeschrieben soweit ich mich erinnere. Damit wäre eine Injection unmöglich, da ja die Befehle garnicht erst in die DB kommen. Oder übersehe ich da wes?


----------



## bingo88 (15. Juli 2014)

Wenn sichergestellt ist, dass für jede Aktion dieser PDO-Kram benutzt wird, dürfte das gegen SQL Injections sicher sein. Ich meine mich aber dunkel zu erinnern, da gab es mal was wo die mit dem Cahracter Set/Encoding gespielt haben, das war allerdings schon ziemlich krude. Wobei daran ist auch mal der IIS gescheitert...


----------



## boss3D (15. Juli 2014)

@ DarkMo
3 Dinge ...

a) In einem früheren Posting hattest du:

```
$db_erg1 = mysql_query("SELECT * FROM zeiten WHERE datum >= $wochenanfang AND datum < $wochenende AND userid = $userid"); // alle daten aus zeiten raussuchen, die in der aktuellen woche liegen und von user xyz sind
$db_erg2 = mysql_query("SELECT * FROM zeiten AS z, projekte AS p, user AS u WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid"); // ^^ Wie lautet Projekt dazu?
$db_erg3 = mysql_query("SELECT t.taetigkeit AS taetigkeit, pr.produkt AS produkt, p.beschreibung AS beschreibung, u.name AS user, z.datum AS datum FROM zeiten AS z, projekte AS p, user AS u, taetigkeiten AS t, produkte AS pr WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid AND p.taetigkeit = t.id AND p.produkt = pr.id"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
```
Brauche ich jetzt noch alle 3 Zeilen, oder eh nur noch die dritte? Mir kommt's jedenfalls nicht so vor, als würden die sich gegenseitig benötigen. Die dritte Zeile holt doch alles aus der DB, das wir in der Ausgabe haben wollen?!

b) Muss das mit dem "SELECT irgendwas AS irgendwas" eigentlich sein? Ich kenne mich ehrlich gesagt gar nicht mehr aus, wofür deine Angaben stehen und was bei mir das Equivalent ist.  Jedenfalls hattest du in der ursprünglichen Zeile bei den letzten drei WHERE Dingern p, und jetzt auf einmal ist das alles pr aber du meinst, es hätte nur einen Fehler gegeben?!

c) Ich kriege auch mit deinem Ausgabecode nur "Keine Einträge gefunden", obwohl ich definitiv zuvor zeitlich zur KW passende erstellt habe:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Aber wenn's auch nicht am Ausgabecode scheitert (?), weiß ich bald gar nicht mehr, woran's noch liegen könnte ... 

Hier nochmal meine ganze auswerten.php:



Spoiler





```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  
    
    $db_erg1 = mysql_query("SELECT * FROM zeiten WHERE datum >= $wochenanfang AND datum < $wochenende AND userid = $userid"); // alle daten aus zeiten raussuchen, die in der aktuellen woche liegen und von user xyz sind
    $db_erg2 = mysql_query("SELECT * FROM zeiten AS z, projekte AS p, user AS u WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid"); // ^^ Wie lautet Projekt dazu?
    $db_erg3 = mysql_query("SELECT t.taetigkeit AS taetigkeit, pr.produkt AS produkt, p.beschreibung AS beschreibung, u.name AS user, z.datum AS datum FROM zeiten AS z, projekte AS p, user AS u, taetigkeiten AS t, produkte AS pr WHERE z.datum >= $wochenanfang AND z.datum < $wochenende AND z.userid = $userid AND u.id = z.userid AND p.id = z.taetprodid AND p.taetigkeit = t.id AND p.produkt = pr.id"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
    if (!$db_erg1 || !$db_erg2 || !$db_erg3) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    $row_collector = array();
    if (mysql_num_rows($db_erg3)) {
        while($row = mysql_fetch_assoc($res)) {
            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><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
?>
```



-------------

@ bingo88
Danke für die Hinweise! Auf SQL-Injection bin ich während der letzten paar Tage eh selber beim googlen auch immer wieder gestoßen, allerdings kann ich mir auch das nur für die letzten paar Tage, sofern überhaupt Zeit bleibt, aufheben. Solange nicht das "Mindestziel" des Projekts erfüllt ist, darf ich mich nicht mit "nice to haves" aufhalten.


----------



## DarkMo (16. Juli 2014)

kannst du das posting mal zeigen? kann mich nich erinnern jemals was von 3 aufeinander folgenden selects gesagt zu haben ^^ ich hatte mal EINE select anweisung stück für stück entwickelt. bei jedem schritt kam was dazu und wurde eben erweitert. da hatte ich auch das mit den alias namen erklärt gehabt. dazu nochmal ein bsp:

nehmen wir 2 tabellen, die beide eine spalte ID haben (wie selten ^^). jetzt verknüpfen wir die eben in der sql anweisung (denke an den usernamen bspw) und das könnte so aussehen:
SELECT * FROM zeiten, user WHERE zeiten.User_ID = user.ID;

jetzt wird aus den (fürs beispiel gestutzten) tabellen zeiten (ID, User_ID) und user (ID, Name) die view (*ID*, User_ID, *ID*, Name) - du siehst: 2mal ID. wenn man jetzt aus irgendeinem grund eine der ID's braucht, muss man sich aufs glück verlassen, dass genau die richtige durchkommt, oder man hat pech gehabt. weil wenn er in $row['ID'] den wert aus zeiten.ID speichert und danach den aus user.ID wieder in $row['ID']... dat klappt so nich  solange man das nicht braucht, isses völlig bums. eine * suche ist schneller, da nicht noch spalten raussortiert werden müssen und daher zu bevorzugen, aber wenns nich geht, dann gehts nich. zum bsp hatte ich speziell das problem bei der produkt und tätigkeits tabelle. die benötigten spalten für die namen zu den id's hießen beide Bezeichnung - also musste ich mit aliasen arbeiten. um beim simplen bsp zu bleiben:
SELECT zeiten.ID AS zID, user.ID AS uID FROM zeiten, user WHERE zeiten.User_ID = user.ID;

nun haben wir explizit zugriff auf beide id's. einmal über $row['zID'] auf die aus zeiten und über $row['uID'] eben auf die aus user. und tabellen kann man auch mit aliasnamen versehen - spart schreibarbeit. wenn ich 10mal zeiten schreibe, dann spart mir ein z halt nerven xD
SELECT z.ID AS zID, u.ID AS uID FROM zeiten AS z, user AS u WHERE z.User_ID = u.ID;

ich kann im select-teil auf die tabellen-aliasse ausm from teil schon zugreifen (und bei where und order by... gehts auch). weil ich vorhin eine view erwähnte... lurzer ausflug in die theorie über datenbanken: im grunde wird alles als eine view dargestellt. lässt du dir enfach alles einer db-tabelle ausgeben, entspricht die view eben genau dieser tabelle. mit solchen "join-verbünden" hingegen verbindet man db-tabellen dann entspricht die view eben einem gewissen mischmasch. entweder alles zusammen oder nur teils teils. es gibt da innerjoins und outer joins, aber so recht hab ich das selber auch noch ned durchstiegen ^^ es geht zum bsp auch sowas:
SELECT * FROM bla WHERE SELECT * FROM blubb...; das wäre auch eine join-variante. könnte der outerjoin sein.

aber gut, wie gesagt, so wichtig isses nicht. aber der grundgedanke ist eben, mit abfragen baut man sich eigene spezielle tabellen, die einen gewissen blickwinkel, eben eine view auf die db darstellen. und um eindeutige spalten namen zu erhalten, muss man eben teils mit alias namen arbeiten. das doofe ist eben, braucht man nur EINEN wert mit aliasnamen, muss man alle anderen auch angeben :/ also nicht zwingend mit alias, aber eben ein * wert as w oder so geht halt nich ^^ bei mir reicht halt diese angegebene sql anweisung aus. man kann es auch aufsplitten. zum bsp erst macht man ein select für die zeiten und arbeitet das ab. und beim abarbeiten macht man bei jedem schleifendurchlauf eine weitere anbfrage um das projekt dazu zu bekommen. eine um den usernamen zu bekommen und weitere um die anderen id's zu ersetzen. aber du kannst dir vorstellen, die db raucht dann etwas ^^

das ist kein problem beim 1mann betrieb, aber wenn das dann wirklich mal zum einsatz kommt, belastet das die db eben unnötig. daher immer versuchen das alles zusammen zufassen. das erstellen der verzweigten view mag zwar 3 4 mal länger dauern wie die simple abfrage der zeiten-tabelle, aber wenn man dann in schleifen und unterschleifen wieder und wieder neue anfragen stellt... da is man dann je nach datenvolumen das zusammengesucht wird plötzlich 10mal schneller. zudem wird bei einer anfrage ein konsistenter zustand präsentiert. also der sucht alles zusammen, so wie es zum abfragezeitpunkt in der db war. wenn du jetzt lauter einzel selects hast, dann kann es im mehrnutzer betrieb durchaus vorkommen, das einer was ändert, während du deine schleife abarbeitest und plötzlich kommen komische ergebnisse zustande (inkonsistenzen eben).


wie es scheint, war mein studium nich völlig umsonst >< is noch ganz gut was hängen geblieben xD


----------



## boss3D (16. Juli 2014)

Okay, dann hatte ich das in #287 missverstanden. Ich dachte, wir würden alle 3 Zeilen brauchen (obwohl's mich eh gewundert hatte).

Jedenfalls habe ich die Zeile jetzt nochmal korrigiert, aber ich kriege immer noch nur das:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Er will einfach nichts ausgeben, obwohl in der DB zeitlich zur KW passende Einträge vorhanden wären. 
Woran könnte das liegen?

auswerten.php:



Spoiler





```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  

    $db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;"); // produkt und tätigkeits id ersetzt durch deren bezeichnungen
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    echo '<table>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    $row_collector = array();
    if (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
?>
```



--------------

[EDIT]
Immerhin haben wir jetzt schon mal den ganzen Excel Export ...



Spoiler





```
<?php   
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung", $verbindung) or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];
    
    $header = '';
    $result ='';
    $exportData = mysql_query("SELECT * FROM projekte, zeiten") or die ("Sql error : ".mysql_error());
     
    $fields = mysql_num_fields($exportData);
     
    for ($i = 0; $i < $fields; $i++) {
        $header .= mysql_field_name($exportData, $i)."\t";
    }
     
    while ($row = mysql_fetch_row($exportData)) {
        $line = '';
        foreach ($row as $value) {
            if ((!isset($value )) || ($value == "")) {
                $value = "\t";
            } else {
                $value = str_replace('"', '""', $value);
                $value = '"'.$value.'"'."\t";
            }
            $line .= $value;
        }
        $result .= trim($line)."\n";
    }
    $result = str_replace("\r", "", $result);
     
    if ($result == "") {
        $result = "\nNo Record(s) Found!\n";
    }
     
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".$user.".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    print "$header\n$result";    
?>
```



Fragt mich lieber nicht, wo ich den Code zusammengekratzt habe (), aber er funktioniert nach meinen Anpassungen einwandfrei. 

Schaut gar nicht schlecht aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Lediglich eine Zeile aus mehreren Arbeitstagen zu machen, klappt noch nicht ganz. Wobei das aber auch ein Auslesefehler in meinem Code sein könnte?! Vielleicht nur die zeiten-Tabelle exportieren?! Muss ich noch rumprobieren. "erstellt" mag er auch noch nicht, und 5.5 Arbeitsstunden erkennt er als Datum. Muss ich noch richten.


----------



## TessaKavanagh (16. Juli 2014)

Mach mal ein Screenschot der Datenbank plz. Ich vermute das du da das Datum nicht als timestamp speicherst.


----------



## boss3D (16. Juli 2014)

zeiten




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT]
Gerade ausprobiert: Ändern zu "Timestamp" bringt auch nichts --> trotzdem keine Ausgabe.


----------



## Rho (16. Juli 2014)

Dein Excel-Export ist nichts anderes als eine CSV, der fälschlicherweise die Endung ".xls"  verpasst wurde, damit sie automatisch von Excel geöffnet wird. So kommt zum Beispiel auch das Problem mit dem Datum zustande. Man hat allerdings die Möglichkeit die Daten aus einer solchen CSV-Datei in ein Excel-Dokument zu importieren. Dabei kann man unter anderem auch das Format für jede Spalte festlegen.


----------



## boss3D (16. Juli 2014)

^^ Stimmt, ich weiß. Allerdings sollte für die MA kein zusätzlicher "Aufwand" entstehen, indem sie ein CSV bekommen und das dann wieder manuell in Excel importieren müssen. Sie sollten gleich Excel bekommen. Dazu habe ich keinen anderen Weg gesehen ...

Die ganzen ids sollen auch noch weg, die interessieren doch die MAs nicht. Aber das sollte sich durch Auswahl einzelner Tabellen-Spalten machen lassen. Ein bisschen kniffliger wird's dann schon beim Format der Zeit-Daten, wie z. B. "erstellt" oder auch den Stunden (mit Nachkommastelle).
--------------

Erstmal will ich aber ENDLICH eine Ausgabe bekommen. Das wäre zur Zeit das wichtigste.


----------



## TessaKavanagh (16. Juli 2014)

Dann zeig doch bitte mal die Tabelle und nicht die Struktur. Danke.


----------



## boss3D (16. Juli 2014)

projekte




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



zeiten




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## DarkMo (16. Juli 2014)

TessaKavanagh schrieb:


> Mach mal ein Screenschot der Datenbank plz. Ich vermute das du da das Datum nicht als timestamp speicherst.


 ich habs als int(20) gespeichert. glaub 11 statt 20 langt auch, war aber zu faul zum nachsehen xD ah und ich seh grad, bei projekte haste nicht die id's sondern die klarnamen gespeichert.


----------



## boss3D (16. Juli 2014)

Als INT?  Das glaube ich nicht ... da würde er ja so einen Käse speichern:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Wir reden schon immer noch von "datum" in _zeiten_, oder? 
---------

Mit dem anderen meinst du, ich sollte die ids der jeweiligen Tätigkeiten bzw. Produkte speichern?!

[EDIT]
Hab's umgebaut, sodass wir wirklich nur noch über ids referenzieren:



Spoiler





```
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $erg1 = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row1 = mysql_fetch_object($erg1);
    $userid = $row1->id;
    $erstellt = date('Y-m-d-h-i-s');
    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];  

        $erg2 = mysql_query("SELECT id FROM taetigkeiten WHERE taetigkeit='".$taetigkeit."'");
        $erg3 = mysql_query("SELECT id FROM produkte WHERE produkt='".$produkt."'");
        $row2 = mysql_fetch_object($erg2);
        $taetigkeitid = $row2->id;
        $row3 = mysql_fetch_object($erg3);
        $produktid = $row3->id;
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeitid', '$produktid', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }        
        }        
        unset($data);
        unset($stunden);
    }
?>
```



Funktioniert alles, lediglich die (korrekte) userid geht mir noch ab, hier landet 0 in zeiten, obwohl "test" userid=6 hat. Das dürfte aber auch an der Notice liegen, die ich trotz identem Code kurioserweise nur für die _$userid_ kriege, nicht aber für die jetzt neuen Variablen _$taetigkeitid_ und _$produktid_ ...

[EDIT2]
Hab's jetzt nochmal mit TIMESTAMP probiert, aber jetzt sehe ich erst, dass das ja alleine daran schon scheitert, dass der ein falsches Datum einträgt:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ich hatte jedenfalls 16.07.2014 und 17.07.2014 eingegeben. Wobei's mir gerade so vorkommt, als würde er eh versuchen, das einzutragen, aber eben verkehrt herum. Damit glaubt er, 16 und 17 wären das Jahr, und bei 2014 geht sich halt dann nur noch der 20er aus ... ?!

[EDIT3]
Auch wenn ich das Datum absichtlich verkehrt herum eingebe, damit's richtig in der DB steht, kriege ich trotzdem keine Ausgabe. TIMESTAMP ist also so oder so keine Lösung für das Problem.

Irgendwie würd's mich bald nicht mehr wundern, wenn das eh schon die ganze Zeit an der falschen userid und der damit einhergehenden Notice liegt:


> *Notice*:  Trying to get property of non-object in *C:\xampp\htdocs\db\auswerten.php* on line *10*


Vielleicht sollten wir wirklich erstmal den Fehler finden und schauen, ob dann eh schon eine Ausgabe kommt? Wenn auch dann nicht, hätten wir zumindest eine mögliche Fehlerquelle weniger ...


----------



## boss3D (16. Juli 2014)

Also, neben all der Fehlersuche habe ich mir jetzt noch die Logik und den Aufbau für den Rest der Aufgabe überlegt. Nachfolgend meine Idee, Verbesserungsvorschläge sind willkommen ...

Nach Registrierung und Login landet erstmal jeder MA (und auch der Admin) auf projektzeiterfassung.php. Hat sich ein MA eingeloggt, schaut die Seite so aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Hat sich der Admin eingeloggt (Unterscheidung anhand der Rechte), schaut die Seite so aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Der Admin hat also zumindest schon mal das Filterkriterium "Mitarbeiter".

Bei Klick auf den vierten Button landen sowohl der Admin als auch alle MAs auf auswerten.php und kriegen ihre eigenen Einträge der jeweiligen KW angezeigt. Klickt der Admin nach Eingabe eines MA-Namens auf den fünften Button, landet er auf auswerten2.php (Seite muss ich noch erstellen), wo ihm dann alle DB-Einträge des jeweiligen MAs angezeigt werden. Der Code dürfte dann ja weitestgehend ident zu jenem in auswerten.php sein?! 
Und da wäre zu Überlegen, ob ich entweder die Filterung nach KW so abändere, dass sie nicht sofort greift und wirklich erstmal alles angezeigt wird, dann aber über einen Button manuell "aktiviert" werden kann. Oder ob zuerst nur die MA-Einträge der aktuellen KW-Woche angezeigt werden sollen (dann wär's wirklich ein identer Code) und dann über einen Button auf alles erweitert werden kann.

^^ Soweit so kompliziert ... 
-----------

Ich kann aber schlecht irgendwie in diese Richtung weitermachen, solange ich noch zig Fehler mitschleppe, die umso schwerer zu finden werden, umso weiter ich die Codes ausbaue. 

Folgendes wäre noch zu richten:
1) ENDLICH eine Ausgabe in auswerten.php kriegen (bei Code-copy-paste würde ich den Fehler ja sonst gleich nach auswerten2.php mitnehmen)
2) Dieses blöde "Trying to get property of non-object" endlich mal lösen. Mittlerweile habe ich das bei zwei Variablen in projektzeiterfassung.php und jeweils einer in auswerten.php und formular.php. Jeweils "oben" im Code.
3) Es schaffen, dass bei Klick auf die Pfeilbuttons wirklich die KWs durchgeschaltet werden. Da tut sich bei mir ja auch noch gar nichts. K. A. ob die Seite neu geladen wird, wie von DarkMo gedacht.
4) Schaffen, dass bei Klick auf "Einträge editieren" in auswerten.php wirklich noch alle eingegebene Daten in projektzeiterfassung.php angezeigt werden (irgendwie mit "Vorbelegen", wie von Tessa vorgeschlagen?!)

Tja ... 

projektzeiterfassung.php



Spoiler





```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $erg1 = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row1 = mysql_fetch_object($erg1);
    $userid = $row1->id;
    $erg2 = mysql_query("SELECT rechte FROM user WHERE name='".$user."'");
    $row2 = mysql_fetch_object($erg2);
    $rechte = $row2->rechte;

    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="formular.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"</th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"></form>';
        echo '<br><input name="mitarbeiter" type="text" size="30" maxlength="30"> Bitte Name eingeben ...</div>';
    } else {
        echo '</div>';
    }
    
    echo '</body>';
    echo '</html>';
?>
```



formular.php



Spoiler





```
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $erg1 = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row1 = mysql_fetch_object($erg1);
    $userid = $row1->id;
    $erstellt = date('Y-m-d-h-i-s');
    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];  

        $erg2 = mysql_query("SELECT id FROM taetigkeiten WHERE taetigkeit='".$taetigkeit."'");
        $erg3 = mysql_query("SELECT id FROM produkte WHERE produkt='".$produkt."'");
        $row2 = mysql_fetch_object($erg2);
        $taetigkeitid = $row2->id;
        $row3 = mysql_fetch_object($erg3);
        $produktid = $row3->id;
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeitid', '$produktid', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }        
        }        
        unset($data);
        unset($stunden);
    }
?>
```



auswerten.php



Spoiler





```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  

    $db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    echo '<form action="auswerten.php" method="post">';
    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 (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
?>
```




[EDIT]
Das Problem, das ich selber beim Fehlersuchen habe, ist, dass ich vor allem das "Trying to get property of non-object" nicht reproduzieren kann. Manchmal kommt es, manchmal nicht ... da soll einer wissen, was die Ursache sein könnte ... 

[EDIT2]
Also derzeit kriege ich kein einziges "Trying to get property of non-object". 
K. A. wie ich das weggezaubert habe ... 

Helft mir bitte bei 1), 3) und 4).


----------



## DarkMo (16. Juli 2014)

wegen dem timestamp: DOCH - als int ^^ was ist denn ein timestamp? es ist die anzahl der sekunden seit dem 1.1.70 - also eine zahl. ein int  genauer ein longint wohl ^^ wenn man in der db das ganze als rtimestamp oder dtae angibt, dann wurschtelt er da immer gleich ein datum draus - ich persönlich möchte aber den echten timestamp, also diese lange zahl da, haben. denn aus dieser zahl kann man bequem wieder daten machen, unsere wochen-"randwerte" sind timestamp zahlen und und und...


----------



## boss3D (16. Juli 2014)

^^ Es ändert aber nichts am Problem, "datum" jetzt als INT in die DB zu speichern ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Es löst das Problem nicht, ich kriege trotzdem keine Ausgabe. Das einzige, das passiert, ist, dass das Datum jetzt nur noch als bspw. "1607" in die DB gespeichert wird, aber nicht als deine lange Zahl. Und ich gehe jede Wette ein, sollte ich irgendwann endlich mal ne Ausgabe kriegen, dass ich dann dieses doofe 1607 angezeigt kriegen werde, wenn ich INT als Format lasse. 
--------------

Jedenfalls läuft mir langsam die Zeit davon mit dieser ewigen Fehlersucherei! Ich kann dem Ganzen noch bis ~ SA Abend lassen, längstens. Kriege ich auch dann noch keine Ausgabe, muss ich dann am SO ganz schnell versuchen, den Arbeitsstand von vor ~ 15 Seiten wiederherzustellen und noch schnell eine ganz simple funktionierende Ausgabe hinzubasteln. 

Ich habe mittlerweile gefühlte 100 Mal unsere Codes verglichen, aber ich sehe keinen Unterschied, der bei mir die Ausgabe verhindern könnte:


Spoiler





```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  

    $db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung: '.$user.'</h1>';
    echo '<form action="auswerten.php" method="post">';
    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 (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"></form></div>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
?>
```



Ich weiß auch gar nicht mehr, wo ich noch suchen soll. 

Ich sage lediglich in der Form action="auswerten.php", während du da action="index.php" hast, was aber bei uns beiden darauf hinauslaufen sollte, dass sich die Seite selbst aufruft. Und überhaupt sollte das nur beim Weiterschalten der KWs (das ja bei mir auch nach wie vor nicht geht) relevant sein, nicht aber bei der Ausgabe allgemein?!

Meine Vermutung bleibt, dass irgendwelche Daten(formate?) in der DB  nicht mit irgendwelchen Abfragen im Code zusammenpassen, aber ich seh's  trotzdem nicht.


----------



## DarkMo (16. Juli 2014)

boss3D schrieb:


> Ich sage lediglich in der Form action="auswerten.php", während du da action="index.php" hast, was aber bei uns beiden darauf hinauslaufen sollte, dass sich die Seite selbst aufruft. Und überhaupt sollte das nur beim Weiterschalten der KWs (das ja bei mir auch nach wie vor nicht geht) relevant sein, nicht aber bei der Ausgabe allgemein?!


 wegen den KW's durchschalten - was fehlt denn auch bei dir? ^^ wenn du einen der beiden button drückst, behandelt die seite das in keinster weise  da fehlt code.

und wegen dem "sich selbst aufrufen" - das ist eben die frage, ob das so einfach ist. bei mir steht zum bsp der aufruf "index.php" übers formular in zeit.php  zeit.php ist aber nur ausgelagerter code der index.php und somit haut das hin. ich erinnere an den aufbau der index.php, der die grundgliederung und abläufe des php scripts ganz grob umreißt und darstellt.

```
<?php
  // mysql verbindung aufbauen, session verwalten, varaiblen definieren... (zum bsp, ob man eingeloggt ist ^^)
  include('config.php');

  // empfangene formulardaten bearbeiten - auch das loginformular, was einen ggf einloggt
  include('formular.php');

  // die eigentliche seite
  if(!$login) {
    // login
    include('login.php');
  } else {
    // tabelle mit eintragungen und eingabeformular
    include('zeit.php');
  }
?>
```
dein $kw = date('W'); bspw steht bei mir in config.php - also ganz am anfang des scripts. die behandlung der buttons, steht dann in formular.php. und schlussendlich die ausgabe mit der tabellenzeile usw steht in zeit.php. das hat den ganz einfachen grund, dass die reienfolge entscheident ist. erst baue ich die default-werte/initialwerte, DANN ändere ich sie ggf ab (weil nen button gedrückt wurde, der das verlangt) und anschließend gebe ich sie aus.

wie schon öfter gesagt, ich habe ein paar verständnis schwierigkeiten mit deinem code. meine lösung besteht faktisch nur aus der einen index.php. der rest is ja einfach nur ausgelagert, aber praktisch kann man das alles als ein file sehen. es geht IMMER in die index.php zurück. falls dein grundaufbau ähnlich/gleich ist, und du jetzt aus der zeit.php (um bei meinen bezeichnungen zu bleiben - bei dir wärs diese auswetung.php wohl) direkt die zeit.php aufrufst... joa, dann fehlt dir ja die hälfte. wenn die auswahl.php allerdings kein ausgegliederter teil der index.php ist, sondern was völlig eigenständiges - kA auf anhieb, was das für auswirkungen hat. es könnte aber auch so sein, dass dein auswerten.php "nebenläufig" zu meinem zeit.php zu verstehen wäre oder so. also meinetwegen sowas in der art hier:

```
<?php
  // ...
  if(!$login) {
    // tabelle mit ausgabe der existierenden db daten
    include('eingabe.php');
  } else {
    // tabelle mit eingabeformular für neue db daten
    include('ausgabe.php');
  }
  // ...
?>
```

aber wie gesagt: hier kann ich nur raten, aber ich befürchte schlimmes ^^


----------



## boss3D (16. Juli 2014)

Ich habe heute in der Arbeit schon versucht, für mich auch sowas wie deine index.php zu basteln, aber das geht bei mir gar nicht. Zum einen müsste ich meine Files so dermaßen zerpflügen, dass dann gar nichts mehr funktionieren würde, und zum anderen habe ich durch die vielen Buttons schon so viele Verweise zwischen den Files, dass ich auch hier gar nicht wüsste, wie ich das dann alles wieder zum Laufen kriegen sollte ...

Dass mir für das Umschalten der KWs Code fehlt, habe ich schon bemerkt, aber auch hier weiß ich nicht, was genau aus deinem Code ich bräuchte und wo ich das bei mir in meinem System einbauen sollte. 

Wobei ich sage: Im schlimmsten Fall kann ich das Umschalten zwischen den KWs weglassen und einfach alle Daten eines MAs ausgeben lassen. Dann vielleicht über ein paar if-Bedingungen und Datums-Vergleiche filtern.

Was WIRKLICH WICHTIG wäre, ist eben die verdammte Ausgabe. Aber soweit durchschaue ich das dann nicht, wie deine Codes "ineinandergreifen", als dass ich das was mir fehlt, jetzt finden würde. Habe ja heute schon 8.5 Stunden lang gesucht ...
---------

Ich setze mich morgen in der Arbeit nochmal hin und versuche, meine Codes auch erstmal alle durch ein index.php File aufrufen zu lassen. Einfach mal nur schaffen, dass mein jetziger Stand wieder da ist. Dann kann ich mir vielleicht Schritt für Schritt überlegen, was wo aus Redundanzgründen nicht mehr nötig ist ... und vielleicht komme ich irgendwie soweit, dass ich dann was ähnliches habe wie du. Aber alleine schon, wie ich das bei mir ohne die Javascripte, nur über die php Files, realisieren soll, weiß ich noch gar nicht.
Und ich kann mir eben nur noch bis SA Zeit damit lassen. Ich hoffe, dass dann irgendwas funktionierendes steht!


----------



## DarkMo (16. Juli 2014)

tu mir mal einen gefallen, und baue mir eine art ablaufdiagramm. ich versuchs auch mal mit meiner seite ^^ gibts da was von ratiopharm? ääh online? mal googlen 
ick probier mal det hier: Dia - Download - CHIP


----------



## boss3D (16. Juli 2014)

Was bitte willst du haben ???

Soll ich dir erklären, wie meine Files zusammenhängen? 

1) *login.html* aufrufen (im Hintergrund werkelt *login.php*)
2) Will sich User registrieren, kommt er über Button zu *eintragen.html* (im Hintergrund werkelt *eintragen.php*). Ansonsten bei erfolgreichem Login weiter zu *projektzeiterfassung.php*.
3) Auf *projektzeiterfassung.php* Eingabe aller Daten. Diese entweder nur in die DB speichern, macht *formular.php*, oder weiter zur Ausgabe = *auswerten.php* bei MA und *auswerten2.php* bei Admin.
4) Beim Auswerten kann Ergebnis nach Excel exportiert werden, wozu im Hintergrund *export.php* arbeitet.

^^ Soweit die "Logik" der Zusammenhänge ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## Rho (16. Juli 2014)

Wirst du eigentlich für diese "Arbeit" bezahlt?


----------



## DarkMo (16. Juli 2014)

so, hab mal mit dem eben verlinkten prog so ein ablauf diagramm erstellt. rechtecke stellen die files dar. alles zwischen den rechtecken ist quasi, was dann so am code passiert. diese abgerundeten 4ecke sind halt so sachen im code. die rauten stellen quasi if's dar. hier zweigen sich die bearbeitungswege. brauchst halt glaube das programm, um das zu öffnen.

mit nem ablaufdiagramm kann man halt grafisch den "weg durch deinen code" darstellen. hab grad auch kA ob ich das meistergültig so richtig gemacht hab ^^ aber es zeigt eben anhand der pfeile, was wann wo passiert *glaub* ><

btw: wo is bei dir der "einstieg"? also welches file muss ich aufrufen, um zu starten? so wie es klingt login.html. frag mich nur erstmal - wieso ne statische html?


----------



## boss3D (16. Juli 2014)

DarkMo schrieb:


> btw: wo is bei dir der "einstieg"? also welches file muss ich aufrufen, um zu starten? so wie es klingt login.html. frag mich nur erstmal - wieso ne statische html?


 Ja, genau. login.html aufrufen, dann geht's, je nach deinen "Entscheidungen", von einer Seite zur nächsten ...

Was meinst du mit statischer html?


----------



## Rho (16. Juli 2014)

boss3D schrieb:


> Kriege ich auch dann noch keine Ausgabe, muss ich dann am SO ganz schnell versuchen, den Arbeitsstand von vor ~ 15 Seiten wiederherzustellen.



Hatte ich nicht bereits Git erwähnt?


----------



## DarkMo (16. Juli 2014)

ah ok. ich sehe schon, wie das gelöst ist. "komisch" ^^

also ich bin jetzt soweit (nur die codes angeschaut, nicht im browser - kA wie das pw für den test-user ist ^^):
- login.html
-> hier die daten eingeben
-> beim absenden des formulars kommt man nun zur login.php
erste anmerkung...
SELECT name, passwort FROM user WHERE name LIKE '$username' LIMIT 1; <- erm ^^ also entweder heißt der so, oder er heißt nicht so. gut, deine umsetzung von like entspricht dem, was es eigentlich sein soll ^^ ungewollt wohl  ich hol mal etwas weiter aus: mit like kann man strings vergleichen. also bspw steht in der db was von "bäcker" und "schnacken" und "cräcker" und "häcken" und "häckern" und er soll mir alles raussuchen, was ein "cker" am ende hat -> like '%cker'. das % ist hier ein wildcard oder wie man das nennt - nen platzhalter. sprich, anstelle von % kann noch sonstwas stehen. er findet nun also für unser bsp "bä*cker*" und "crä*cker*". bei "schnacken" und "häcken" endet es auf nen n statt nen r und bei "hä*cker*n" ist zwar unser gesuchtes drin, aber es endet eben nicht damit. suchen wir nun nach pff "äck" irgendwo im string, dann sagen wir like '%äck%' und er findet für uns "b*äck*er", "cr*äck*er" und "h*äck*ern". da du bei deinem like keine wildcard(s) nutzt, sucht er also nach exakt dem usernamen - das like ist also völlig überflüssig. das ist aber auch richtig so. weil beim usernamen gibts kein "wünsch dir was" ^^ entweder die angabe stimmt oder eben nich. lustiges usernamen-bestandteile-raten is nich  ebenso kannst du das limit 1 weglassen. beim registrieren musst du dann eben sicherstellen, dass der username nich schon weg is.

btw! ach da isses. wieder nen andres file xD du machst mich fertig he. hab das registrieren schon vermisst. also wenn ich DAS hier sehe:

```
[COLOR=blue]<form action="login.php" method="post">
    <h1>Projektzeiterfassung</h1>
    <table><th>Login</th></table>
    <p>Ihr Username:</p>
        <input type="text" size="24" maxlength="50" name="username"><br>
    <p>Ihr Passwort:</p>
        <input type="password" size="24" maxlength="50" name="password"><br><br>
    <input type="submit" value="Einloggen">
</form>[COLOR=red]<br>[COLOR=seagreen]<form action="eintragen.html">
    <input type="submit" value="Registrieren">
</form>
```
hab ich eigentlich schon keine fragen mehr 
zuerst zu dem rot markierten <br>: form ist ein block-element (siehe HTML 4 Block-level Elements als bsp). das heißt nix anderes, als dass nach ihnen automatisch ein zeilenumbruch erfolgt. du brauchst also nicht selber dafür sorgen (es sei denn, einer langt dir nicht ^^). inline wäre der gegenpart. dann zu der geschichte mit den 2 forms. du hast das bestimmt gemacht, um eine fallunterscheidung vorzunehmen? also quasi die frage "logged er sich grad ein, oder regged er sich?" zu beantworten. das ist wohl der falsche weg xD du fragst zu früh  was passiert hier? dein formular mit all den eingabefeldern (hier blau dargestellt) ist oben. dazu gehört der login button. bzw um es ganeuer zu sagen: EIN button mit dem value (der aufschrift, dem label, dem ding, das für das formular völlig irrelevant ist ^^) einloggen. drückst du diesen button, so wird dein blaues formular abgeschickt und an login.php geschickt. drckst du nun aber auf den anderen button mit dem value registrieren... dann wird die grüne form abgesendet - und da steht was drin? nix >< du wirst es also sicher schwer haben, dich zu registrieren oder? 

jetzt zu der sache mit den buttons: wie unterscheidest du korrekt, welcher button gedrückt wurde? als erstes: bau mal deinen reg-button mit ins blaue rein und lösch die grüne form. BITTE ^^ jetzt wird in login-php immernoch geschnallt, dass da daten ankommen, weil EIN button gedrückt wurde. WELCHER lässt sich aber nicht rausfinden. dazu musst du folgendes ändern:

```
<input type="submit" [B]name="btnLog"[/B] value="Login">
<input type="submit" [B]name="btnReg"[/B] value="Registrieren">
```
gib den dingern NAMEN! ^^ diese namen kannst du dann abfragen - das hab ich aber auch schon erwähnt! wurde *btnLog *gedrückt, ist $_POST['*btnLog*'] gesetzt -> if(isset($_POST['btnLog'])) echo "der sack will sich einloggen!"; meintest du nich sogar, das haste verstanden? ^^ das sind absolute basics für die abarbeitung von formularen. das selbe funzt natürlich äquivalent fürs reggen. in login.php bearbeitest du BEIDES! und wenn du das stück für stück und konsequent weiter zusammen streichst, wirst du irgendwann von deinen "20" files ganz automatisch wegkommen ^^

algorithmus-vorschlag aus der hüfte für login.php:

```
- eine variable login anlegen und auf false setzen
- username und pw aus formular in variable speichern
- will er sich reggen?
    - prüfen: username schon vergeben?
        - nein
            - eintrag erstellen
            - variable login auf true setzen

- will er sich einloggen?
    - username und pw prüfen
    - wenn alles stimmt, variable login auf true setzen
```
jetzt noch fix die einordnung in meinen code:
- die login.variable wird in config.php angelegt und auf false gesetzt
- der algorythmus hier oben wird in formular.php abgearbeitet (also da, wo alle buttons und formulardaten ausgewertet werden)
- deine login.html wäre bei mir die login.php hier verzweigt sich mein code -> if($login)...
ist man nicht eingeloggt, bekommt man also das login-formular zu sehen, ansonsten eben die zeit.php, welche uns die tabelle usw baut.

btw ist dein login kein wirklicher login  du hast quasi nur eine kette von seiten gebaut. dein login ist im endeffekt nur ein "unterbrecher" in dieser kette. es hindert aber keinen daran, einfach direkt die projektzeiterfassung.php aufzurufen  der SINN des einloggens ist es, dass ich das einmal tute, die seite erneut laden kann und immernoch eingeloggt bin. in deinem aufbau gesprochen: rufe ich bei dir erneut die login.html auf, müsste ich bei einem echten login dieses formular garnicht mehr sehen können (ich bin ja schon eingeloggt). andererseits dürfte mir ein zutritt zur projektzeiterfassung.php keinen erfolg verschaffen - sprich, ich müsste hier ne leere seite oder nen fehler oder sowas sehen. aber wie gesagt: klammer das login gelumbe erstmal aus, das ist nämlich ne andere hausnummer >< (und bei dir faktisch nicht vorhanden). aber gut, ich hab das auch scho lang ned mehr gemacht, muss mich da selber erstmal wieder reindenken.

gut, mal weiter schauen. nu hab ich die ersten 2 files gesehn und noch nix zum eigentlichen prob sagen können, aber schon 10 andre enddeckt ^^

hm, ok, wenn das mit dem $_SESSION['name'] funzt, dann scheint das login doch zu klappen. dü müsstest dann aber eben immer dafür sorgen, dass das auch ne auswirkung hat. also irgendwo am anfang (bei mir wieder in der config.php) müsstest du sowas schreiben:
$login = false;
if(isset($_SESSION['name'])) $login = true;

und weiterhin müsstest du dann irgendwie sowas schreiben, bevor dein eigentlicher code/irgendwelche ausgaben erfolgen:
if(!$login) echo "nicht eingeloggt, -> <link einloggen>";
else { /* dein bisheriger code */ }

wie du siehst, kommst du automatisch wieder genau zu meiner strukturierung zurück. jut, nu aber prjektzeiterfassung.php anschauen. arrrrr.... bitte nicht xD

```
$user = $_SESSION['name'];   
    $erg1 = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row1 = mysql_fetch_object($erg1);
    $userid = $row1->id;
    $erg2 = mysql_query("SELECT rechte FROM user WHERE name='".$user."'");
    $row2 = mysql_fetch_object($erg2);
    $rechte = $row2->rechte;
```
wieso fragst du 2mal die selbe tabelle ab mit nur einer spalte? wieso nicht alle spalten mit einer abfrage? -> SELECT *** FROM user WHERE name='".$user."'"
anderes wieso: wieso nich gleich die id gespeichert in der session anstelle des namens? oder einfach beides? sinnlose db-quälerei 
joa, dann folgt mein initialer "kalendercode", dann die ausgabe. die abfrage der buttons fehlt. wäre dieser code hier:

```
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);
```
müsste in zeile 22 rein. schon sollte die switcherei funtzen ^^ joar, kalenderzeile, tabellenkopf, nu mal schauen... jops, tätigkeiten und produkte aus db in nen array bauen, daraus dann die selects basteln. soweit sogut. add und das zeugs ist sicher fürs javascript lose hinzufügen von zeilen ne? ahja, da isses ja. oha. da beim div wirds wieder interesant. hab erstmal das ende der form gesucht... die ist oben bei der "kalender-zeile" am ende der inneren tabelle - copy-paste fehler? ^^ du hast dann noch weiter unten ein form ende. ah ok, eine erneute suche ergab interessantes 
du hast eine form, die zu formular.php führt. INNERHALB dieser form, hast du eine weitere, die wieder projektzeiterfassung aufruft. und unten bei den divs haste uch nochmal 2 oder 3. hier haste wieder genau das selbe problem, wie bei login. php. das funzt so ned. muss jetz erstma den rechner wechseln. hoffentlich bekomm ich den code da vorn ordentlich gelesen ^^

also bisher kannste daraus gut nen buch schreiben - wird nen krimi ^^


----------



## DarkMo (17. Juli 2014)

jut, weiter gehts. also mein vorschlag wieder: alles in EIN formular. diese zig formulare bringen dir GARNIX. ausser das nix mehr geht. hier nen kleiner link dazu: web standards - Is it valid to have a html form inside another html form? - Stack Overflow - is seltsamerweise garnich so leicht, dazu was zu finden oO aha, hier nochmal die bestätigung, dass ein button nur "seine" form absendet: multiple forms in one submit button

gut, also wie gesagt: alles in eine form, den buttons namen geben und sich selbst aufrufen (am besten eben nicht sich selbst, sondern die "einstiegs-seite" - immer wieder zurück zur einstiegsseite. bei dir also die login.html <. du erkennst das problem? ^^). dann vor "allem code" (also dort, wo ich meine formular.php angesiedelt hab) die behandlung der formulardaten betreiben. das ganze immer je nach gedrücktem button unterscheiden. das was du hier machst... das kann einfach nich funktionieren. du versuchst ein fahhrad zu bauen und hast rahmen und räder nicht miteinander verbunden ^^ das ding fährt so nicht. die räder kannste zwar meinetwegen einzaln rollen und den rahmen wenigstens noch durch die kante werfen, aber fahhradfahren wirste damit nicht können.

wie vermutet, dein ganzer code ist einfach nur schlimm, sry. du hast scheibbar völlig falsche vorstellungen. auch dein drang html und php unbedingt trennen zu wollen... wenn du das trennen willst, dann mach es eher so:
"fullphp" variante:

```
<?php
  echo '<html>...</html>';
  echo '<body>';
  $var = 'world';
  echo 'hello '$var;
  echo '</body>';
?>
```
hier gibste die html dinger halt per echo aus - find ich persönlich jetzt nicht unlesbar. aber spätestens, wenn du dynamisch html-code erzeugst, wirst du eh so arbeiten müssen. aber falls es dir eben hilft, dann trenne es doch so auf. immernoch ein php file, aber dennoch ist php und html fein säuberlich getrennt:

```
<html>...</html>
<body>
<?php
  $var = 'world';
  echo 'hello '$var;
?>
</body>
```
hier ist jetzt nur der phpcode wirklich auszuwertendes php. btw hab ich das glaube in meinem ersten posting geschrieben gehabt und du meinstes, diese basics sind bekannt  wieso nutzt du es dann nicht? du baust dir nur probleme so.


----------



## boss3D (17. Juli 2014)

Okay, vielen Dank für die Erklärung! Alles gelesen, das meiste verstanden ... 

Files, die ich schon habe, zusammenzufügen, ist das kleinste Problem. Schwieriger wird's, config.php so zu erstellen, dass es mit meinem Code zusammenpasst. Bin da gerade dabei.

Was ich allerdings NICHT verstanden habe:
a) Wieso soll dein Algorithmus-Vorschlag für _login.php_ in _formular.php_ abgearbeitet werden? Das hätte ich dich schon in _login.php_ drinnen (jetzt erst recht, wo ich auch noch den Code von _eintragen.php_ hinzugefügt habe):


Spoiler





```
<?php
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");

    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    $username = $_POST["username"];

    $abfrage = "SELECT name, passwort FROM user WHERE name='".$username."'";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_object($ergebnis);
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    
    if (isset($_POST['btnLog'])) {    
        $password = hash('sha512', ($_POST["password"]).$salt);
        if ($row->passwort == $password) {
            $_SESSION["name"] = $username;
            header("Location: http://localhost/db/projektzeiterfassung.php");
        } else {            
            echo '<br><div class="submit"><form action="login.html">Benutzername und/oder Passwort waren falsch.<br><br><input type="submit" value="Login"></form></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        if (isset($_POST["passwort"] and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {
            $passwort = $_POST["passwort"];
            $passwort2 = $_POST["passwort2"];
        }
        if ($username == "test") {
            $rechte = 0;
        } else {
            $rechte = 1;
        }
        echo '<table><th>Registrierung</th></table>';
        if ($passwort != $passwort2 OR $username == "" OR $passwort == "") {    
            echo '<br><div class="submit"><form action="eintragen.html">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
            exit;
        }
        $passwort = hash('sha512', ($passwort).$salt);

        $result = mysql_query("SELECT id FROM user WHERE name='".$username."'");
        $menge = mysql_num_rows($result);

        if ($menge == 0) {
            $eintragen = mysql_query("INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
            if ($eintragen == true) {                
                echo '<br><div class="submit"><form action="login.html">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';  
            } else {        
                echo '<br><div class="submit"><form action="eintragen.html">Fehler beim Speichern des Benutzernamens.<br><br><input type="submit" value="Zurück"></form></div>';
            }
        } else {
            echo '<br><div class="submit"><form action="eintragen.html">Benutzername schon vorhanden.<br><br><input type="submit" value="Zurück"></form></div>';
        }
    }
?>
```



_formular.php_ hätte ich mir für die Abfragen von _projektzeiterfassung.php_ aufgehoben.

b) Wieso soll ich in _projektzeiterfassung.php_ alle Spalten mit einer Abfrage abfragen, wenn ich doch nur 2 haben will? Und nachdem ich weiter unten im Code auch nur jeweils einen Wert brauche, "muss" ich den Inhalt der beiden Spalten doch in unterschiedliche Variablen speichern?!

c) Deinen Kalender-Code habe ich in _projektzeiterfassung.php_ bei Zeile 22 eingefügt, aber er schaltet immer noch nicht die KWs durch. Stattdessen wird _formular.php_ aufgerufen, weil ich's ja so in form action angegeben habe. Was müsste ich da noch ändern? Oder hattest du eigentlich gemeint, der Kalendercode solle in _formular.php_ rein?

d) Was grundlegendes: Websiten sind für mich prinzipiell html-Dokumente. Ist das überhaupt "normal", dass wir ausschließlich mit php-Files arbeiten, die halt ein bisschen html-Code enthalten? Sollte es nicht eher umgekehrt sein, dass wir eigentlich nur html-Files haben, die php-Code (neben html) beinhalten? Jedenfalls gefällt mir deine "fullphp" Variante eindeutig besser.

Ich versuche, das jetzt mal alles hinzubasteln. Hoffe, ich schaff's bis zum WE ...
_
login.php_ hätte ich eben schon so halbwegs fertig, siehe Code oben. Lediglich für { _if (isset($_POST["passwort"] and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {_ }  kriege ich noch "*Fatal error*:  Cannot use isset() on the result of an expression (you can use "null !== expression" instead)". Da habe ich mir noch nicht zu helfen gewusst. Ohne die issets kämen index-Fehler.

PS: Passwort für User "test" (= Admin) ist "test", für User "hallo" (= MA) eben "hallo".

[EDIT]
Ich habe jetzt versucht, _login.php_ so hinzubasteln, dass ich _login.html_, _eintragen.html_ und _eintragen.php_ nicht mehr brauche, und _login.php_ sich "um sich selbst kümmert". Damit hätte ich gleich 3 Files weggespart und _formular.php_ könnte sich weiterhin nur um _projektzeiterfassung.php_ kümmern.


Spoiler





```
<?php
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION["name"] = $username;
            header("Location: http://localhost/db/projektzeiterfassung.php");
        } else {            
            echo '<br><div class="submit"><form action="login.php">Benutzername und/oder Passwort waren falsch.<br><br><input type="submit" value="Login"></form></div>';
        }
        echo '</body>
            </html>';
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" value="Registrieren">
            </form></div>
            </body>
            </html>';
        $username = $_POST['username'];            
        @$passwort = $_POST['passwort'];
        @$passwort2 = $_POST['passwort2'];
        if ($username == "test") {
            $rechte = 0;
        } else {
            $rechte = 1;
        }
        if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
            echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
            exit;
        }
        $passwort = hash('sha512', ($passwort).$salt);

        $erg = mysql_query("SELECT id FROM user WHERE name='".$username."'");
        $id = mysql_num_rows($erg);

        if ($id == 0) {
            $eintragen = mysql_query("INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
            if ($eintragen == true) {                
                echo '<br><div class="submit"><form action="login.php">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';  
            } else {        
                echo '<br><div class="submit"><form action="login.php">Fehler beim Speichern des Benutzernamens.<br><br><input type="submit" value="Zurück"></form></div>';
            }
        } else {
            echo '<br><div class="submit"><form action="login.php">Benutzername schon vorhanden.<br><br><input type="submit" value="Zurück"></form></div>';
        }
    }
?>
```



Nur eines kriege ich ums Verrecken nicht hin: Ich will, dass zuerst grundsätzlich der html-Code vom Login angezeigt wird. Und wenn der User dann auf "Registrieren" kickt, soll STATT dem Login html-Code der html-Code zum Registrieren angezeigt werden. Also wär's doch logisch, den Login Code dann anzuzeigen, wenn der "Registrieren" Button noch NICHT gedrückt wurde (ergo !isset). Aber anscheinend gelten Buttons defaultmäßig als "set"?! Jedenfalls führt mein Code sofort zum html-Code von Registrieren. Und wenn ich gleich am Beginn des Codes sage, unset($_POST['btnReg']); ... , dann tut sich wieder nicht, wenn ich auf den "Registrieren" Button klicke.

^^ Blickt da einer durch?


----------



## DOcean (17. Juli 2014)

großen Respekt an DarkMo, ich wäre schon vor 20 Seiten davongelaufen 

Ich bin dafür der TE spendiert DarkMo einen Kasten Bier mindestens


----------



## TessaKavanagh (17. Juli 2014)

Zu dem Grundlegenden. Ja es ist durchaus normal das wir "nur" mit PHP Dokumenten arbeiten. Denn der Großteil der Webseiten arbeitet genau so eigentlich nur mit PHP Dateien. Der Browser wird dir aber 

Das du dann tatsächlich html Dokumente ausgegeben hast liegt i.d.R. nur am CMS.

Erstens benutzen eigentlich alle großen Projekte Templates, zweitens wird häufig auf Page Caching zurückgegriffen. 

Ein Tamplate ist eine Datei die nur die Optik vorgibt. also z.B.

Nennen wir die Datei Template.html

```
<html>
<head>
</head>
<body>

<h1>{*-ÜBERSCHRIFT-*}</h1>

<table><tr><td>{*-INHALT-*}</td><td>{*-NAVIGATION-*}</td></tr></table>


{*-FUßZEILE-*}

</body>
</html>
```

Hierbei dient {*- Als Zeichenkette die den Beginn eines Platzhalters und -*} als Zeichenkette die das Ende eines Platzhalters beschreibt.

Deine PHP Datei heißt projekt.php

Dann arbeitest du anstelle von echo ""; beim erstellen deines HTML Codes im PHP Dokument halt mit Variablen. Im Ergebnis hast du dann also am ende deines PHP Dokumentes statt ausgegebenem CODE die Variablen "$inhalt" "$navigation" "$fußzeile" "$überschrift".

Zusätzlich hast du eine PHP Funktion die die Datei Template.html öffnet und nach den o.g. Platzhaltern sucht und diese durch den Inhalt der jeweiligen Variable ersetzt. 

Das Ergebnis dieses Prozesses wird dann als projekt.html ausgegeben. Jetzt kannst du zusätzlich noch festlegen, das er diese Datei auf dem Server Speichert.  In Projekt.php kannst du noch festlegen, das wenn die Datei nicht älter als eine Stunde ist er direkt auf Projekt.html weiterleitet.

Im Ergebnis würde dann also einmal pro Stunde der PHP Code ausgeführt und ansonsten der statische HTML Code ausgegeben.

Wenn ich das mit Login und registrieren richtig verstehe gibt es nur zwei zustände? Also eben Zeige Login an oder Zeige Registrieren an. ?

Dein Code kann natürlich nicht funktionieren. Denn du hast im LOGIN Formular den SUBMIT Login und den SUBMIT Registrieren.

Ergo sobald du einen von beiden drückst ist die Bedingung if(isset($_POST[btnLog]) ja automatisch immer TRUE(Du sendest das Formular mit beiden Buttons ja ab), zu elseif kannst du also gar nicht kommen.

1. Die Lösung wäre also entweder du arbeitest mit eine Button und JavaScript der über GET einen Link übergibt, wie ich es dir bereits mehrfach gezeigt habe. also z.B. Dateiname.php?inc=1
2. Oder du nimmst einen Link der nur so aussieht wie ein Button und machst es wie in Variante 1. nur ohne JavaScript.
3. Du benutzt ein zweites Formular

Dann brauchst du nur die eine Abfrage if(isset( $_GET['inc'])){REGISTRIEREN ANZEIGEN}else{LOGIN ANZEIGEN}

Bei mehr als zwei Zuständen wäre es eben if($_GET['inc'] == 1){REGISTRIEREN ANZEIGEN}elseif{$_GET['inc']==2}{IRGENDWAS ANDERES}else{LOGIN ANZEIGEN}


----------



## boss3D (17. Juli 2014)

Okay, danke. Noch eine kleine Frage, weil ich dieses Problem so ziemlich bei jedem Arbeitsschritt durch's ganze Projekt hindurch immer wieder gehabt habe: Wenn ich Notices kriege, die ja eigentlich keine wirklichen Fehler sind, ist es "schlimm" oder "schlechter Stil", diese durch "@" im Code zu unterbinden?

Siehe bspw. in meinem zweiten Code oben vor den Passwort-Variablen in elseif. Ohne die "@" kämen index-Fehler. Diese wiederum könnte ich mit isset wegbringen, allerdings käme dann der Fatal Error. 
-------------

Ach ja, und wie ist das nun bei den Buttons? Sind die standardmäßig "set", wie ich vermute? Warum wird mir in meinem Code immer der html-Teil von Registrieren ausgegeben, auch wenn der "Registrieren" Button noch gar nicht geklickt wurde?

[EDIT]
Irgendwie hat das meine Frage jetzt gar nicht beantwortet. Wieso wird sofort der html-Code für Registrieren angezeigt, selbst wenn ich noch gar keinen Button gedrückt habe???

Außerdem, wenn "Login" gedrückt wurde, interessiert Registrieren eh keinen mehr, da ist es dann schon egal, dass beide Buttons "set" sind. Aber wenn ich gleich nach dem Seitenaufruf "Registrieren" klicke, müsste er es schon ins elseif schaffen?!


----------



## TessaKavanagh (17. Juli 2014)

Die Lösung mit den NOTICE ist relativ Simpel:

Es gibt nur zwei Möglichkeiten diese Loszuwerden

1. Möglichkeit: sauber programmieren 
2. Möglichkeit: nimm das error_reporting ganz raus bzw Unterdrück es.

Die Frage ob es schlechter Stil ist sollte damit wohl beantwortet sein  Welcher COde zeigt denn jetzt registrieren an?


----------



## boss3D (17. Juli 2014)

1) Ich rufe im Browser "localhost/db/login.php" auf ... So, was passiert?
Mir wird der html-Code von Registrieren angezeigt, obwohl ich aber defaultmäßig den von Login sehen will. Bis jetzt wurde noch KEIN Button geklickt (trotzdem scheinen diese bereits "set" zu sein?!).

Eine "Teillösung" wäre es nun, ganz oben im Code "unset($_POST['btnReg']);" zu sagen, dann wird mir korrekt der Login html-Code angezeigt und der Login funktioniert auch. Der "Registrieren" Button hingegen zeigt keine Wirkung. Eh klar, den haben wir ja "unset", also wird das elseif nie erreicht. 

^^ Ich glaube jedenfalls, dass sich das relativ simple durch ein bisschen "Umschachteln" der if-Inhalte und vielleicht ein unset an der richtigen Stelle lösen lässt?! Ganz ohne Javascript, Links und sonstiges Zeugs. Und wie gesagt: Wenn erstmal "Login" gedrückt wurde, interessiert's keinen mehr, ob nun beide Buttons "set" sind, weil dann eh kein Registrieren für den User benötigt wird. 

Kurz gesagt: Mein Code verhält sich so, als wäre der "Registrieren" Button sofort bei Aufruf der Seite im Browser "set" ohne überhaupt angeklickt worden zu sein. Wenn ich den Zustand ändern kann, dann würde der Code, denke ich, sofort das richtige machen?!_ (Eigentlich hätte ich das ja mit dem "unset" gleich zu Code-Beginn versucht, weil ich dachte, ein tatsächliches Anklicken des Buttons würde den dann eh wieder "setten", aber das scheint ja dann nicht mehr zu passieren)_

2) "Sauber programmieren" ist gut, wenn ich nicht mal weiß, was denn in meinem Code überhaupt zu diesen Notices führt. Und was meinst du mit "error_reporting rausnehmen"? Wo hätte ich denn eines in meinem Code drinnen?


----------



## TessaKavanagh (17. Juli 2014)

Das Error Reporting steht Default auf ON man kann es aber auf OFF Setzen. Für das Programmieren schaltet man es normalerweise auf ON aber im Echteinsatz auf OFF. Denn der User soll die Meldung ja nicht sehen falls es doch mal zu einem Fehler kommt, sonst gibst du Ja Infos über den Aufbau deines Codes und mögliche Schwachstellen für einen Angriff preis.

Natürlich passiert nichts.Denn sobald du auf einen der Buttons klickst wird ja die Seite Neu geladen. $_POST['btnReg'] wird dabei gesetzt. Wenn du jetzt aber als erstes Im Code ein unset($_POST['btnReg']) schreibst, dann löscht du die Variable. Bei der If Abfrage kann dan btnReg logischerweise auch nachdem du es angeklickt hast nie existieren, denn nach dem Klick hast du es ja selber wieder gelöscht.


----------



## DarkMo (17. Juli 2014)

hehehe, meiner geht grad zur neige, würde passen 


mal abarbeiten:
a) äh ok, stimmt, du hast ja selber ne formular.php ^^ ich bezog mich auf meine (die steht nach der config.php und arbeitet alle formulardaten ab).
b) hier beziehste dich auf mein rumgemoser an den 2 select anweisungen? also select id from und select rechte from? du fragst 2mal nacheinander die selbe tabelle ab, holst dabei aber immer nur einen bestimmten wert. stell dir nen pizzalieferservice vor, der zu dir nen döner und ne pizza liefern soll und der kerl fährt ernsthaft 2mal  verstanden? ein select * from reicht völlig. da holt er beide daten mit einem ritt und du kannst genauso drauf zugreifen:

```
$user = $_SESSION['name'];   
    $erg = mysql_query("SELECT * FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($erg);
    $userid = $row->id;
    $rechte = $row->rechte;
```
fertig is der lack. EINE anfrgae, BEIDE werte. aber wie ich bereits sagte, kannst du sogar noch diese anfrage wegrationalisieren. wenn du dich einloggst, machst du folgendes:

```
if ($row->passwort == $password) {
        $_SESSION["name"] = $username;
        header("Location: http://localhost/db/projektzeiterfassung.php");
      }
```
erweiter das doch einfach wie folgt:

```
if ($row->passwort == $password) {
        $_SESSION["name"] = $username;
        $_SESSION["id"] = $row->id;
        $_SESSION["rechte"] = $row->rechte;
        header("Location: http://localhost/db/projektzeiterfassung.php");
      }
```
dann kürzt sich der obere code aus projektzeiterfassung nämlich auf das hier zusammen:

```
$userid = $_SESSION["id"];
    $rechte = $_SESSION["rechte"];
```

c) ja er muss natürlich wieder projektzeiterfassung aufrufen, damit das klappt 

d) jop. php wird auf dem server ausgewertet. mit dem dynamischen php script erstellt der server ein statisches html dokument, was er dann sendet. zwischen server und browser wird NIE etwas anderes wie statisches html hin und hergeschickt! die auswertung des php codes erfolgt auf dem server. daher braucht man für änderungen auf clientseite eben javascript. jedesmal, wenn du die form abschickst, dann wird die ganze seite neu zusammen gezimmert. er fängt wieder komplett von vorne an. du bist wieder nicht eingeloggt (daher musst du ja die session prüfen - die soll den loginstatus "retten") und er fängt wieder von punkt 1 deines scripts an. und hier ist eben der große knackpunkt bei dir: er fängt eben NICHT wieder an punkt 1 an (das wäre die login.html gewesen) sondern irgendwo mittendrin, schon 3 schritte weiter.

dein fehler mit den issets: kontrolliere mal die klammern 


und am ende das noch. schau dir mal die kleinste logik deines files an, ich versuchs mal runterzubrechen - nur die schleifen, ohne viel code:

```
<?php
    // session starten
    // sql verbindung
    // html-header...

    if (!isset($_POST['btnReg'])) {
       // formular zum reggen
       // sendet an login.php
       // button = btnReg
    }

    if (isset($_POST['btnLog'])) {
       // auswertung der daten und einloggen
       // das html dokument wird hier abgeschlossen
    } elseif (isset($_POST['btnReg'])) {
       // formular zum reggen
       // sendet an login.php
       // button = hat keinen namen
       // das html dokument wird hier abgeschlossen
       
       // dann rechtezuweisung (sehe ich als workaround an, lass ich daher mal gelten)
       // korrekter wäre sowas hier:
         /*
         der erste registrierte user bekommt per default das recht 0, alle anderen 1
         somit kann auch nur der erste user anderen rechte zuweisen (bräuchte man ne weitere seite für)
         haben auch andere das recht 0, können die das natürlich dann auch verwalten
         -> ob das jetzt in der form sinnvoll ist... aber es ginge erstmal grundlegend ^^
         */
         
       // ausgaben im fehlerfalle, obwohl schon </html> kam :P
    }
?>
```
du kommst also rein, und es wird garnichts angezeigt. warum? es wird nur etwas angezeigt, wenn du einen button gedrückt hast. wenn du die seite frisch aufrufst, dann ist da aber kein button als gedrückt markiert. somit wird nichts angezeigt, auch keine buttons zum drücken, um beim nächsten seiten-generieren doch was anzuzeigen. hast hier also schon einen konzeptionellen fehler drin. zudem ist die html struktur in deiner form... ungut. bau es doch in etwa so auf: am anfang den "html kopf" (bis <body>) und ganz am ende, als allerletztes die seite abschließen (</body></html>). dazwischen dann deine schleifen und ausgaben usw. genauso solltest du auch mit der form arbeiten. entweder kommt anfang UND ende rein, in ne schleife oder if... oder eben beides raus. aber nicht anfang draussen machen und ende drinne. da verwirrst du dich nur selber. wie könnte der grundaufbau also nun in etwa aussehen? ich versuchs mal so zu basteln, dass reggen und login 2 verschiedene formulare sind. im grunde würde hier eins für beides reichen, da man beim reggen einfach keine zusätzlichen infos angibt. also egal ob reggen oder login, man gibt nur username und pw ein. ABER!, wenn wirs jetzt trennen, kannste später das reggen formular easy ausbauen (name, vorname, MA-nummer... kA ^^).

```
<?php
  // wie gesagt, zuerst einmal sagen wir, das wir NICHT eingeloggt sind:
  $login = false;

  // jetzt schauen wir, ob das stimmt:
  if(isset($_SESSION['name'])) {
    // wir sichern die session-variablen, kann man wohl als optional ansehen
    $login = true;
  }

  // nun gehts los...
  // schnell noch den html-krams bis body meiseln...

  // hier nochmal kurzer einschnitt: wir müssen checken, ob wir nicht nen button zum registrieren oder einloggen gedrückt hatten:
  if(isset($_POST['btnReg'])) {
    // checken, obs den usernamen schon gibt (bzw obs überhaupt scho user gibt -> wenn nicht, rechte = 0, sonst = 1)
    // wenn nicht, per insert anlegen
    // das $_SESSION-array mit unseren daten füllen
    // - um die id rauszufinden, kannst du den befehl http://php.net/manual/de/function.mysql-insert-id.php nutzen :)
    // - für die rechte eben wie oben gesagt: isses der erste user gewesen, recht = 0, alle anderen bekommen erstmal 1
    // login auf true setzen
    $login = true;
  }

  // hier jetzt für den fall, dass wir uns einloggen wollten
  if(isset($_POST['btnLog'])) {
    // checken, ob die eingaben stimmen (also obs nen user mit diesem pw gibt bla)
    // wenn ja, das $_SESSION-array mit unseren daten füllen
    // login auf true setzen
    $login = true;
  }

  // dann noch fix die form bauen, die uns wieder auf diese seite zurück wirft
  // hier wird jetzt entschieden, ob wir zugang zur eigentlichen seite erhalten...
  if($login)
    include('eigentliche_seite.php');
  
  // ...oder ob wir uns doch erst noch einloggen müssen
  else {
    // falls wir gesagt haben, wir wollen uns registrieren (wir haben einen button mit namen "btnRegForm" gedrückt), dann gib uns das registrierungs-formular aus:
    if(isset($_POST['btnRegForm'])) {
      // meisel uns das formular (ohne form tags, die haben wir ja schon) zum registrieren mit einem button namens "btnReg"

    // oder haben wir noch garnichts gedrückt?
    } else {
      // meisel uns das formular (ohne form tags, die haben wir ja schon) zum einloggen mit einem button namens "btnLog"
      // ebenfalls bauen wir hier einen button namens "btnRegForm" ;) als value eventuell "zur Regsitrierung" oder so
    }
  }

  // die form abschließen
  // und die html-seite abschließen
?>
```
du siehst, es läuft irgendwo auf diesen aufbau hinaus, den ich schon 10mal gepostet hab ^^


----------



## boss3D (17. Juli 2014)

Puh, okay ... bis zum fünften Code war ich noch dabei, dann hast du mich verloren ... aber der Reihe nach. Ich poste erstmal meine Codes, wie sie derzeit ausschauen (ich versuche ja jetzt, das ganze an dein System anzunähern). Natürlich funktioniert noch "nichts", weil ich jetzt, auch wegen der index.php, ehrlich gesagt keinen Plan mehr habe, wo (in welchen Files) ich jetzt das "session_start()" brauche. Und einige Verweise zwischen den Files klappen jetzt auch nicht mehr. Aber als erstes will ich mal das Registrieren/Einloggen richten, bevor ich mir dann im nächsten Schritt wieder projektzeiterfassung.php anschaue ...

index.php


Spoiler





```
<?php
    $login = false;
    
    include('formular.php');
    
    if (!isset($_SESSION['name'])) {
        include('login.php');
        $login = true;
    } else {
        include('projektzeiterfassung.php');
    }        
?>
```



login.php


Spoiler





```
<?php
    session_start();
        
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    unset($_POST['btnReg']);
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit"><form action="login.php">Benutzername und/oder Passwort waren falsch.<br><br><input type="submit" value="Login"></form></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
        }
        if ($username == "test") {
            $rechte = 0;
        } else {
            $rechte = 1;
        }
        if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
            echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
            exit;
        }
        $passwort = hash('sha512', ($passwort).$salt);

        $erg = mysql_query("SELECT id FROM user WHERE name='".$username."'");
        $id = mysql_num_rows($erg);

        if ($id == 0) {
            $eintragen = mysql_query("INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
            if ($eintragen == true) {                
                echo '<br><div class="submit"><form action="login.php">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';  
            } else {        
                echo '<br><div class="submit"><form action="login.php">Fehler beim Speichern des Benutzernamens.<br><br><input type="submit" value="Zurück"></form></div>';
            }
        } else {
            echo '<br><div class="submit"><form action="login.php">Benutzername schon vorhanden.<br><br><input type="submit" value="Zurück"></form></div>';
        }
    }
    
    echo '</body>
        </html>';
?>
```



registrieren.php


Spoiler





```
<?php

// hier also den ganzen Registrier-Code aus login.php einfügen?

?>
```



projektzeiterfassung.php


Spoiler





```
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    if (isset($_SESSION['name']) and isset($_SESSION['id']) and isset($_SESSION['rechte'])) {
        $user = $_SESSION['name'];
        $userid = $_SESSION['id'];
        $rechte = $_SESSION['rechte'];
    }

    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);
    
    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);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="formular.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten2.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"></form></div>';

    } else {
        echo '</div>';
    }
    
    echo '</body>';
    echo '</html>';
?>
```



formular.php


Spoiler





```
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
        
    if (isset($_SESSION['name']) and isset($_SESSION['id'])) {
        $user = $_SESSION['name'];
        $userid = $_SESSION['id'];
    }
    $erstellt = date('Y-m-d-h-i-s');    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];  

        $erg2 = mysql_query("SELECT id FROM taetigkeiten WHERE taetigkeit='".$taetigkeit."'");
        $erg3 = mysql_query("SELECT id FROM produkte WHERE produkt='".$produkt."'");
        $row2 = mysql_fetch_object($erg2);
        $taetigkeitid = $row2->id;
        $row3 = mysql_fetch_object($erg3);
        $produktid = $row3->id;
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeitid', '$produktid', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }        
        }        
    }
?>
```



Daneben gäb's noch auswerten.php, auswerten2.php und export.php, aber die lassen wir erstmal. Da muss dann irgendwann auch noch viel geändert werden.
-------------

So: Was mir nicht klar ist --> Was genau soll jetzt dein letzter Code sein? login.php? Dann sehe ich aber keinen gravierenden Unterschied im Aufbau zu meiner; du lässt ja auch die Buttons für Login und Registrieren drinnen, obwohl's letzteren in der login.php dann aber eigentlich gar nicht geben sollte wenn ich für die beiden Aufgaben wieder zwei Files mache.

Im Übrigen will ich den Admin-Namen selbst in die DB schreiben und dann im Code "test" dadurch ersetzen, bevor ich das Gesamtergebnis abliefere. Bei deiner Version könnte es ja passieren, dass die Leute hier, wenn sie nicht aufpassen, sich eventuell vor dem Admin registrieren und dann wäre ein MA als erster "0". Ich weiß ja nicht, wie die dann beim ersten Mal mit dem ganzen Zeug herumtun wenn ich weg bin.


----------



## boss3D (17. Juli 2014)

Ich habe gerade ne "Idiotenlösung" gefunden, wie das doch mit dem gesamten Code in der _login.php_ klappt ... 

Wir übergeben die Button-Abfrage an die Session, sodass wir auch aus anderen Files darauf Zugriff haben:
	
	



```
$_SESSION['Reg'] = ($_POST['btnReg']);
```
Und in index.php "unsetten" wir dann eben den "Registrieren" Button, ...
	
	



```
unset($_SESSION['Reg']);
```
... schon klappt's wie ich's haben will. 

Die Logik dahinter habe ich selbst noch nicht ganz durchschaut, aber vermutlich verhindere ich damit ein ungewolltes Neuladen von _login.php_?!

index.php



Spoiler





```
<?php
    $login = false;
    
    //include('formular.php');
    
    if (isset($_SESSION['Reg'])) {
        unset($_SESSION['Reg']);
    }
    if (!isset($_SESSION['name'])) {
        include('login.php');
        $login = true;
    } else {
        include('projektzeiterfassung.php');
    }        
?>
```



login.php



Spoiler





```
<?php
    session_start();
        
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="index.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit"><form action="login.php">Benutzername und/oder Passwort waren falsch.<br><br><input type="submit" value="Login"></form></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
                exit;
            }
            $passwort = hash('sha512', ($passwort).$salt);
        }
        if ($username == "test") {
            $rechte = 0;
        } else {
            $rechte = 1;
        }

        $erg = mysql_query("SELECT id FROM user WHERE name='".$username."'");
        $id = mysql_num_rows($erg);

        if ($id == 0) {
            $eintragen = mysql_query("INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
            if ($eintragen == true) {                
                echo '<br><div class="submit"><form action="login.php">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';  
            } else {        
                echo '<br><div class="submit"><form action="login.php">Fehler beim Speichern des Benutzernamens.<br><br><input type="submit" value="Zurück"></form></div>';
            }
        } else {
            echo '<br><div class="submit"><form action="login.php">Benutzername schon vorhanden.<br><br><input type="submit" value="Zurück"></form></div>';
        }
    }
    
    echo '</body>
        </html>';
?>
```




[EDIT]
Nur ein Problem habe ich damit noch: Es wird bei Klick auf "Registrieren" immer sofort ein "leerer" Benutzer angelegt.




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Dabei sollte doch genau das durch diese Zeile verhindert werden, oder?
	
	



```
if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {
```
[EDIT2]
Hab's schon. 
Die Zeile wirkt eh, nur die ifs mussten noch korrekt verschachtelt werden. Jetzt passt wirklich ALLES in login.php.


Spoiler





```
<?php
    session_start();
        
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch.<br><br></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
                exit;
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT id FROM user WHERE name='".$username."'");

                if ($id == 0) {
                    $eintragen = mysql_query("INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                        echo '<br><div class="submit"><form action="index.php">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';  
                    } else {        
                        echo '<br><div class="submit"><form action="index.php">Fehler beim Speichern des Benutzernamens.<br><br><input type="submit" value="Zurück"></form></div>';
                    }
                } else {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                }
            }
        }
    }
    
    echo '</body>
        </html>';
?>
```



Jetzt wird's Zeit, dass wir uns meine projektzeiterfassung.php nochmal vornehmen. Wie genau soll die jetzt über index.php mit formular.php "verbunden" werden?


----------



## DarkMo (17. Juli 2014)

aaaah, ich seh gerade, ich habe das ! beim "5. code" übersehen. und ich hab mich schon gewunder, wieso du sagtest, er zeigt dir immer das reggen formular ^^

nochmal zur grundsatzerklräung wegen meiner index.php. ich habe zwar auch meine 4 5 files, aber eigentlich ist das NUR die index.php. also alles in EINEM file. weil das eben irgendwann unübersichtlich wird, hatte ich zusammenhängende teile eben ausgegliedert. es gibt halt einen signifikanten unterschied zw einem include(seite) und einem link-zu-seite (oder eben aufruf-von-seite-durch-formular). beim include wird der ganze text in dem file eben einfach an die stelle vom include kopiert und fertig. ein aufruf soeiner teilseite aber öffnet nur diese seite.

also wie gesagt: im grunde habe ich NUR die index.php. alles läuft in einem file ab das sich immer wieder selber aufruft. und mittels der ausgliederung hab ich eben folgende reihenfolge nun drin:
- index.php
-> config.php
-> formular.php
-> entweder login.php oder zeiterfassung.php (je nach login status)

das sessionstart und session daten lesen (sofern gesetzt) würde bei mir in der config.php abgehandelt werden (ganz am anfang eben). dort hab ich bei mir auch den html-kopf mit drinne, da der nächste schritt die formular.php wäre - und hier kann es schon zu ausgaben kommen. joa, und dieser formular-part (will ichs mal nennen, nicht php ^^) kümmert sich eben um alles, was mit gesendeten formulardaten zu tun hat. welche buttons wurden gedrückt und was soll dann geschehen... (btnRegForm -> register-formular zeigen (kann man hier eigentlich ignorieren, da es nur html code ausgibt, aber nix speichert oder so), btnReg -> formular auswerten und user anlegen sowie einloggen, btnLog -> user einloggen, prev/nextWeek -> kalender um ne woche verschieben..., addToDB (oder so) -> zeugs in die db speichern, add/remLine -> eingabezeile hinzufügen/entfernen usw usf). anschließend dann eben je nach loginstatus das login-dingen zeigen oder eben deine tabelle.


edit: ach wegen deinem problem (vllt nichmal die problemlösung, aber ein hinweis):
teste mal nicht nur auf $post != "" sondern eber auf trim($post) != "". wenn du als username oder pw oder so "   " eingibst, ist das auch != "" aber ergibt wenig sinn ^^ trim löscht alle leerzeichen ausm string. als "    " wird also "" und dein vergleich schlägt an. wie gesagt, ich denke nicht, dass das jetzt die lösung deines probs war, aber ich wollts dennoch erwähnen 

hmm, ich werte formulare immer in der art aus:

```
<?php
  $form_ok = true;
  if(!isset($post_1) or trim($post_1) == "") $form_ok = false;
  if(!isset($post_2) or trim($post_2) == "") $form_ok = false;
  // ...
  if(!isset($post_n) or trim($post_n) == "") $form_ok = false;

  if($form_ok) {
    // eigentliches abarbeiten...
  }
?>
```


----------



## TessaKavanagh (17. Juli 2014)

```
<?php
    $login = false;
    
    include('formular.php');
    
    if (!isset($_SESSION['name'])) {
        include('login.php');
        $login = true;
    } else {
        include('projektzeiterfassung.php');
    }        
?>
```

Sag mal bin ich grade etwas durch oder sorgt das Script dafür das Wenn $_Session['name'] nicht gesetzt ist automatisch $Login = True gesetzt wird.


```
if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        }
```

Denn dieser Codeteil müsste auch mit leerem PW und Username funktionieren.


----------



## DarkMo (17. Juli 2014)

hmm, stimmt ^^
 die entgültige entscheidung, ob login = true gesetzt wird, muss in der login.php gefällt werden (ordentlich registriert und man will dann ein autologin haben bzw eben ordnungsgemäß eingeloggt).


----------



## boss3D (17. Juli 2014)

Wie das BEI DIR grundsätzlich funktioniert, habe ich schon verstanden. Ich versuche nur schon die ganze Zeit, das auch BEI MIR nachzubauen ... 

Im Moment ist's bei mir auch schon so, dass die meisten Buttons wieder index.php aufrufen. Lediglich auf ein Problem bin ich in login.php noch gestoßen, und zwar: Er lässt mich keine neuen Benutzer anlegen weil er immer meint "Benutzer schon vorhanden". Das lässt sich zwar leicht lösen, indem ich die auskommentierten Zeilen ...



Spoiler





```
<?php
    session_start();
        
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch.<br><br></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
                exit;
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT id FROM user WHERE name='".$username."'");

                //if ($id == 0) {
                    $eintragen = mysql_query("INSERT INTO user (name, passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                        echo '<br><div class="submit"><form action="index.php">Benutzer <b>'.$username.'</b> wurde erstellt.<br><br><input type="submit" value="Login"></form></div>';  
                    } else {        
                        echo '<br><div class="submit"><form action="index.php">Fehler beim Speichern des Benutzernamens.<br><br><input type="submit" value="Zurück"></form></div>';
                    }
                //} else {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                //}
            }
        }
    }
    
    echo '</body>
        </html>';
?>
```



... eben auskommentiere, aber dafür kann ich dann wieder zig idente User anlegen. Irgendeine Bedingung muss ich mir jetzt noch bauen, damit gleiche User nicht möglich sind. Was das "$id == 0" gemacht hat, war mir eh nie wirklich klar. Ich habe ja nicht mal einen User mit $id=0. 

Irgendwelche Ideen für eine passende Bedingung? 

[EDIT]
Okay, dann nehme ich das "$login = true;" erstmal wieder aus index.php raus ...

[EDIT2]
Jetzt habe ich mal alles redundante Zeugs in eine eigene config.php ausgelagert und dafür kriege ich jetzt in login.php bei Registrierversuchen ständig: "Fehler beim Speichern des Benutzernamens." und "Benutzername schon vorhanden." 

Also wenn man schon mal ALLES anders hat als du, das nochmal auf dein System abzuändern ist echt kein Spaß. Meine ganzen Variablen in projektzeiterfassung.php, die jetzt in der includeten config.php stehen, werden auch nicht erkannt, obwohl ich's ganz gleich habe wie du ...


----------



## DarkMo (17. Juli 2014)

ein grundsatz problem seh ich noch. du wolltest doch, dass du die login-form siehst, bei der ein button angeboten wird, mit dem man zur reggen-form kommt. dieser button braucht einen namen - ich nannte ihn btnRegForm. bei dir heißt er (wenn ichs richtige sehe) btnReg. soweit kein problem. nun haben wir den gedrückt und es baut sich das reggen-formular auf mit einem bestätigen button, um die form abzusenden. dieser button heißt bei dir nun AUCH btnReg! somit kannste nicht gescheit zwischen den 2 fällen unterscheiden  also nenne einen der beiden um (ich hab wie gesagt den zum aufrufen der form genau deswegen btnRegForm genannt gehabt.

jut, mal wegen dem eigentlichen prob schauen. aso, weitere grundsätzliche frage: passwort2 ist die bestätigung des passworts? also diese übliche sicherheitsmaßnahme um verschreiber zu verhindern? und da fällt mir grad noch ne anmerkung ein - nein, haste schon (type="password"). das wollt ich schon so oft anmerken, habs immer vergessen ^^ aber hast es ja schon 

wegen dem id: wie kommste da jetz eigentlich druff? wolltest checken, ob das der erste nutzer is bzw die tabelle leer is? also wegen meiner "autorechtevergabe" da. dann kanste das weglassen, hast ja schon selber ein ordentliches gegenargument gebracht. wäre halt ne idee gewesen, wie es auf ne simple art und weise klappen könnte. also das id gelumbe würd ich weglassen, erkenne da jetzt auch keinen sinn drin. aso, und wenn du das else wegmachst, müsstest auch die ausgabe mit wegmachen ^^

asö, das mit der id könnte uU der check gewesen sein, ob schon ein user mit diesem namen existiert. da langt aber auch wieder ein select * from... in der if würde ich dann aber nach der anzahl der zeilen fragen. also mysql_num_rows($id). sähe dann ca so aus (ausm kopf geschrieben):

```
<?php
                if (mysql_num_rows($id)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                         echo '<br><div class="submit"><form  action="index.php">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';  
                    } else {        
                         echo '<br><div class="submit"><form  action="index.php">Fehler beim Speichern des  Benutzernamens.<br><br><input type="submit"  value="Zurück"></form></div>';
                    }
                }
?>
```
ahja, in der fehlerausgabe stand der sinn dahinter ja auch drin


----------



## boss3D (17. Juli 2014)

Das hier ist jetzt mein ganzer login.php Code. Jetzt kriege ich zwar erstmal keine Fehlermeldungen, aber dafür wird beim Registrieren auch nichts in die DB geschrieben ... 

Dafür fragt mich Firefox, ob das eingegebene Passwort gespeichert werden soll. Also irgendwie erkennen tut er es scheinbar.


Spoiler





```
<?php
    // config.php

    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $login = true;
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);
    
    $verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");
?>
```






Spoiler





```
<?php
    // login.php

    session_start();
    
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder noch nicht registriert.<br><br></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnRegForm" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br></div>';
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT id FROM user WHERE name='".$username."'");

                if (mysql_num_rows($id)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                         echo '<br><div class="submit">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br></div>';  
                    } else {        
                         echo '<br><div class="submit">Fehler beim Speichern des  Benutzernamens.<br><br></div>';
                    }
                }
            }
        }
    }
    
    echo '</body>
        </html>';
?>
```



Den Button name habe ich BTW in Zeile 47 geändert. Hoffe, das stimmt.


----------



## DarkMo (17. Juli 2014)

hmm, hab da noch ein paar konzeptschwierigkeiten wieder. dein erstes isset (naja, das wäre das mit der session, ich meinte also eigentlich das 2. ^^) baut die reg-form mit button. HIER würde ich bei der abfrage schonmal den neuen buttonnamen nutzen (weil du musst ja nich nur den button namen ändern, sondern auch bei der formularauswertung auf diesen neuen namen anspringen). die form ist so ok. der dort verwendete button hat nen anderen namen (den bisherigen) und sollte ok sein so.

aso, das is wieder das NOT isset, was ich schonmal übersehen hab ^^ also das ist deine default-ausgabe szs... k. dann muss also da drin der button umbenannt werden (ich gehe jetzt davon aus, das btnReg die registrierung abschließt und btnRegForm überhaupt erstmal zur registrierung führen soll). vllt sollte man die bedingung auch umkehren. also if isset btnRegForm, male die reg-form, else male die loginform (wie du sie jetzt hast, nur eben den reggen button umbenannt. kann man bestimmt auch andersrum lassen, aber sorum find ichs irgendwie besser lesbar. aber gut, mach wie du denkst, die reihenfolge is am ende wurscht ^^ mach wie du besser klar kommst.

um das jetzt mal mit zeilenangaben zu würzen:
in zeile 20 den button umbenennen
in zeile 13 den abgefragten button ebenfalls umbenennen
wenn du das "not isset" so lassen magst, muss bei zeile 22 der else-teil rein, der das reggen-formular enthält. ansonsten musste halt die inhalte von if und else tauschen.

jut, den teil dadrunter hätte ich jetzt ja eher davor abgehandelt. also quasi alles ab zeile 24 über unsere eben diskutierte geschichte kopiert. also so in etwa zu zeile 6/7. ahja, der teil von zeile 26 an sieht soweit gut aus - HIER würde ich dann bei erfolgreichem einloggen $login auf true setzen btw  

oha, und da ist butten reg. der button name stimmt, aber wozu die form da? diese form hier müsste qusi oben im else teil drin sein (was ich zuerst besprochen hatte, das gefasel um das not isset ^^). was passiert sonst hier? du bekommst die login-maske angezeigt, drückst reggen und er switcht genau hier hin. er baut das formular auf - und gleich danach speichert er lustig drauf los >< du hast noch garnix eingegeben, da speichert er schon. also wie gesagt, die speicherei ist richtig, das formular ist an der falschen stelle.

gut, damit sind wir durch.


----------



## boss3D (17. Juli 2014)

Ich hab's umgebaut soweit ich's bei dir verstanden habe, aber irgendwas stimmt definitiv nicht. Jetzt hätte ich ja den allgemeinen html-Aufbau unter dem Login-Zeugs?!


Spoiler





```
<?php
    session_start();

    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX"; 
    
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder noch nicht registriert.<br><br></div>';
        }
    }
    
    if (!isset($_POST['btnRegForm'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnRegForm" value="Registrieren">';
        echo '</form></div><br>';
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnRegForm" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br></div>';
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT id FROM user WHERE name='".$username."'");

                if (mysql_num_rows($id)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                         echo '<br><div class="submit">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br></div>';  
                    } else {        
                         echo '<br><div class="submit">Fehler beim Speichern des  Benutzernamens.<br><br></div>';
                    }
                }
            }
        }
    }
    
    echo '</body>
        </html>';
?>
```



Und "$login = true;" sollte ich ans Ende des if-btnLog schreiben?


----------



## DarkMo (17. Juli 2014)

```
<?php
    session_start();

    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }

    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";

    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';

    if (isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            
            /**************************/
            /****/ $login = true; /****/
            /**************************/
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder noch nicht registriert.<br><br></div>';
        }
    }
    if (isset($_POST['btnReg'])) {
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {
                echo '<br><div class="submit">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br></div>';
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $check = mysql_query("SELECT * FROM user WHERE name='".$username."'");

                if (mysql_num_rows($check)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {
                         echo '<br><div class="submit">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br></div>';

                         /************************************************/
                         /****/ $_SESSION['name'] = $username;       /****/
                         /****/ $_SESSION['id'] = mysql_insert_id(); /****/
                         /****/ $_SESSION['rechte'] = $rechte;       /****/
                         /****/                                      /****/
                         /****/ $login = true;                       /****/
                         /****/                                      /****/
                         /****/ header('Location: ...'); /** Anmerkung ***/
                         /************************************************/
                    } else {
                         echo '<br><div class="submit">Fehler beim Speichern des  Benutzernamens.<br><br></div>';
                    }
                }
            }
        }
    }

    if (!isset($_POST['btnRegForm'])) {
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnRegForm" value="Registrieren">';
        echo '</form></div><br>';
    } else {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnRegForm" value="Registrieren">
            </form></div>';
    }

    echo '</body>
        </html>';
?>
```
so hier 

in den großen "kommentarkästen" hab ich die ergänzungen gepostet. im ersten ist die mögliche position für die login variable. hier wäre sie halt am sinnvollsten aufgehoben. beim erfolgreichen registrieren bleibt dann eben noch die folgende frage: soll er beim erfolgreichen registrieren automatisch eingeloggt werden? dann muss der kasten hier hin. ansonsten ist er zwar gereggt, aber muss sich dennoch normal über die login maske einloggen. hier auch die von mir genannte funktion, um an die id zu kommen. wäre deine entscheidung, wie du es handhaben möchtest.

und nochmal zu dem header geblubber. damit bindest du jetzt dann das "hauptfile" ein? hattest du jetzt umgebaut gehabt auf so eine "index.php"? ich glaubs oder? weil dann brauchst du das ned mehr. in der index.php checkst du ja den login-status. ist er false, wir die login-form gezeigt, ist es true, dein "hauptfile" ^^


----------



## boss3D (17. Juli 2014)

^^ Ich werd' verrückt ... Auch mit deinem Code landen keine Daten bei der Registrierung in der DB! Außerdem lande ich beim Aufruf von "localhost/db/index.php" jetzt immer auf projektzeiterfassung.php. 

Aber vielleicht liegt der Fehler jetzt woanders? Hier mal der ganze Rest:
index.php



Spoiler





```
<?php
    $login = false;
    
    include('config.php');
    
    //include('formular.php');
    
    if (isset($_SESSION['Reg'])) {
        unset($_SESSION['Reg']);
    }
    if (!isset($_SESSION['name'])) {
        include('login.php');
    } else {
        include('projektzeiterfassung.php');
    }        
?>
```



config.php



Spoiler





```
<?php
    session_start();

    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $user = $_SESSION['name'];
    $userid = $_SESSION['id'];
    $rechte = $_SESSION['rechte'];
    
    $login = true;
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);
    
    $verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");
?>
```



login.php



Spoiler





```
<?php
    session_start();

    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }

    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";

    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';

    if (isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;          
            $login = true;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder noch nicht registriert.<br><br></div>';
        }
    }
    if (isset($_POST['btnReg'])) {
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {
                echo '<br><div class="submit">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br></div>';
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $check = mysql_query("SELECT * FROM user WHERE name='".$username."'");

                if (mysql_num_rows($check)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {
                        echo '<br><div class="submit">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br></div>';

                         /************************************************/
                         /****/ $_SESSION['name'] = $username;       /****/
                         /****/ $_SESSION['id'] = mysql_insert_id(); /****/
                         /****/ $_SESSION['rechte'] = $rechte;       /****/
                         /****/                                      /****/
                         /****/ $login = true;                       /****/
                         /****/                                      /****/
                         /****/ header('Location: ...'); /** Anmerkung ***/
                         /************************************************/
                    } else {
                        echo '<br><div class="submit">Fehler beim Speichern des  Benutzernamens.<br><br></div>';
                    }
                }
            }
        }
    }

    if (!isset($_POST['btnRegForm'])) {
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnRegForm" value="Registrieren">';
        echo '</form></div><br>';
    } else {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnRegForm" value="Registrieren">
            </form></div>';
    }

    echo '</body>
        </html>';
?>
```


----------



## DarkMo (17. Juli 2014)

ahja, ich eh grad, du bastelst das wieder anders wie ich. mach mal aus

```
} else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {
                         echo '<br><div class="submit">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br></div>';

                         /************************************************/
                         /****/ $_SESSION['name'] = $username;       /****/
                         /****/ $_SESSION['id'] = mysql_insert_id(); /****/
                         /****/ $_SESSION['rechte'] = $rechte;       /****/
                         /****/                                      /****/
                         /****/ $login = true;                       /****/
                         /****/                                      /****/
                         /****/ header('Location: ...'); /** Anmerkung ***/
                         /************************************************/
                    } else {
                         echo '<br><div class="submit">Fehler beim Speichern des  Benutzernamens.<br><br></div>';
                    }
                }
```

folgendes:

```
} else {
                    mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')") OR die("Fehler beim Registrieren des Users!<br>".mysql_error());
                    echo '<br><div class="submit">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br></div>';

                    /************************************************/
                    /****/ $_SESSION['name'] = $username;       /****/
                    /****/ $_SESSION['id'] = mysql_insert_id(); /****/
                    /****/ $_SESSION['rechte'] = $rechte;       /****/
                    /****/                                      /****/
                    /****/ $login = true;                       /****/
                    /****/                                      /****/
                    /****/ header('Location: ...'); /** Anmerkung ***/
                    /************************************************/
                }
```
ich bin mir grad recht sicher, dass er mit dem sql ding irgendwelche probs hat. vllt wirft er dir so nen error raus. muss jetz aber erstmal wieder auf arbeit :/


----------



## boss3D (17. Juli 2014)

^^ Nein, er speichert auch damit keinen User in der DB (Error kommt auch keiner) ... 

[EDIT]
Dieser Code von der Vorseite funktioniert plötzlich einwandfrei:



Spoiler





```
<?php
    session_start();
        
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT passwort FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch.<br><br></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
                exit;
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT * FROM user WHERE name='".$username."'");

                if (mysql_num_rows($id)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                         echo '<br><div class="submit"><form  action="login.php">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';  
                    } else {        
                         echo '<br><div class="submit"><form  action="index.php">Fehler beim Speichern des  Benutzernamens.<br><br><input type="submit"  value="Zurück"></form></div>';
                    }
                }
            }
        }
    }
    
    echo '</body>
        </html>';
?>
```



K. A. was jetzt plötzlich anders sein soll, aber Hauptsache es geht endlich! 
-----------------

Damit wären wir ENDLICH wieder bei der projektzeiterfassung.php, wo eine gewaltige Baustelle wartet. 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        




Spoiler





```
<?php
    session_start();
    
    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);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="formular.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten2.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"></form></div>';

    } else {
        echo '</div>';
    }
    
    echo '</body>';
    echo '</html>';
?>
```



Aber vorher wieder eine grundsätzliche Frage: Ich versuche ja jetzt auch, wie bei dir trotz mehrerer Files den Code so zu haben, dass es durch die index.php eigentlich EIN Code ist.
Wäre es nicht jetzt eigentlich möglich, komplett auf die Session zu verzichten und das, was wir bisher als Session-Variablen hatten, als ganz normale Variablen in config.php anzulegen? Die müssten ja dann, da ich diese gleich als erstes in index.php inkludiere, in allen Files sichtbar sein?!


----------



## TessaKavanagh (17. Juli 2014)

Nö wäre es nicht. Du benutzt zwar immer wieder die Gleiche Datei, diese wird aber immer wieder neu geladen. An genau diesem Punkt verlierst du also deine Variablen. Formular absenden = alle Variablen weg, Link oder Button anklicken alle Variablen weg etc.


----------



## boss3D (17. Juli 2014)

Heißt das einfach ausgedrückt, dass ich die Session doch brauche?

BTW: Wird nicht bei DarkMo die index.php auch immer wieder neu aufgerufen? Oder was konkret ist jetzt immer noch der Unterschied zwischen seiner und meiner Version? Und was müsste ich immer noch ändern, um dahin zu kommen, wo er ist?

Wozu mache ich denn das ales sonst? Sonst hätte ich eh bei meinem Ansatz bleiben können ...


----------



## TessaKavanagh (17. Juli 2014)

Um es einfach zu sagen. Jedes Mal wenn du eine neue Seite lädst oder die aktuelle Seite neu lädst. Verlierst du zunächst alle Variablen.

Du musst diese also irgendwie auf die nächste Seite retten und dafür gibt es im Prinzip vier Möglichkeiten.

1. Session Variablen
2. POST Variablen
3. GET Variablen
4. COOKIES

Habe grade MO's Code nicht vorliegen. Aber auch er muss wenn er die Seite neu aufruft die Variablen irgendwie sichern.


----------



## boss3D (17. Juli 2014)

Das ist mir klar, aber ich bin mir gerade nicht sicher, ob ich seinen Ansatz richtig verstanden habe.

@ DarkMo
Lädt bei dir die index.php die anderen Seiten immer wieder neu, oder wird bei dir die index.php selbst immer wieder von den anderen Seiten neu geladen (diese laden sich selbst aber nicht neu)? Wie ist das bei dir mit dem Variableninhalten speichern, was Tessa erwähnt hat?
Und bin ich auf dem Weg zu deinem Ansatz, oder habe ich jetzt erst wieder nichts anderes gemacht, als an meinem alten weiterzubasteln?

Irgendwie komme ich da gerade nicht ganz mit. Jedenfalls war der Sinn der heutigen Arbeit in meinen Augen, dass ich eben versuche, meinen Code auf dein System umzuschreiben, damit wir dann endlich auch bei mir eine funktionierende Ausgabe hinkriegen, oder zumindest den Fehler schneller finden, wenn erstmal der Aufbau gleich ist wie bei dir.

Soweit ich's jetzt im Kopf habe, kommt DarkMo jedenfalls ohne Session aus?! Dann muss er's doch noch irgendwie anders haben als ich gerade?!

Das mit den Variablen ist jetzt eh erstmal das nächste/größte Problem. Ich dachte, das würde schon reichen, diese in config.php anzulegen und dann in den jeweiligen Files mit Werten zu füllen, aber offenbar doch nicht ...

So sieht projektzeiterfassung.php aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## Rho (17. Juli 2014)

Mal ernsthaft, bezahlt dich jemand für das, was du da machst?


----------



## DarkMo (18. Juli 2014)

@boss:
vorne weg: jop, ich komme OHNE session usw aus. wie mache ich das? ich habe keinen login drin ^^ das is der punkt 



stell dir mal ein c++ programm vor. du startest das, baust eine gui zusammen mit formularen und der aufbau dessen ist variabel. oder meinetwegen java. bei diesen sprachen/umsetzungen drückst du einen button und irgendwas wird geändert. du updatest die ausgabe und und und. alle variablen sind noch da. trenn dich bei php bitte schnellstmöglich von dieser betrachtungsweise. um das mit dem bsp von eben zu veranschaulichen: du hast also deine gui gebaut - ende. das programm ist vorbei. das ist eben der unterschied von php zu c oder so. es ist KEIN programm, es ist ein script. der server ruft ein programm auf (oder so), dass mittels deines scripts eine statische html datei erstellt, die der server dann verschicken kann. ist das ding gebaut . ist das programm beendet. wenn du jetzt die seite neu lädts, wird das programm neu gestartet - ALLE variblen sind wieder weg. da ist NICHTS mehr.

daher gibts eben diese "globalen" arrays GET, POST und SESSION (kA obs noch mehr gibt ^^). GET enthält alle daten, die an die URI angehängt wurden. POST enthält alle formulardaten, sofern sie mittels action post gesendet wurden und SESSION ist selbst befüllbar. das ist alles, was du hast, um irgendwelche daten von deinem schon generierten file zum bald neu generierten zu retten.

ums wieder mit c odr java zu vergleichen: die seite ist gebastelt (hier wäre dann eigentlich schluss, aber der browser verwaltet die eingaben...) und wenn man nen button drückt, wird quasi schnell noch alles in nen text-file geschrieben. das textfile ist immer da, aber eben meist leer. und es ist eben nicht flüchtig. die seite wird neu generiert (also das programm neu gestartet - alle flüchtigen daten (variablen im ram) sind natürlich hinnev), und diesmal stehen in unserem textfile aber noch  die daten vom letzten mal, alles gut ^^

ich hoffe, ich hab den kern deiner verunsicherung getroffen, und du verstehst jetzt eher, woran du bist. um explizit auf unser php zurück zu kommen: die index.php wird immer neu generiert. bzw AUS der index.php wird immer wieder aufs neue ein html file generiert. willst du jetzt den login status retten, musst du eben die session befüllen. machste ja auch. und wenn dir das zum verständnis meines codes eher hilf, kopier einfach den inhalt der includierten php's einfach direkt in die index.php anstelle des includebefehls. dann haste zwar nen recht langes dingen, aber es entspricht dem eigentlichen zustand. wie ich schonmal erwähnte: es ist im endeffekt nur eine einzige datei. ich habs halt der besseren bearbeitbarkei gesplittet.


dein problem mit den undefined variables bla is halt, dass du eine der ausgelagerten dateien der index.php direkt ansprichst. der zugriff darauf MUSS aber über die index.php erfolgen. hier nochmal ohne login meine index.php:

```
<?php
  include('config.php');
  include('formular.php');
  include('zeit.php');
?>
```
mit zeit.php mein ich dein proj-zeiterf.php dingen da - is mir einfach zu lang xD rufst du die index.php auf, dann wird erst config.php abgearbeitet, also die variablen erstellt, die sql verbindung aufgebaut usw. danach erfolgt die abarbeitung eventueller formulardaten. DANN wird die eigentliche datei ausgeführt. szs die kern-datei. aber sie braucht eben die daten, der beiden anderen files (besser gesagt "ausgelagerte code-schnipsel"). du rufst jetzt aber direkt die zeit.php auf. keine angelegten variablen durch config.php, keine sql verbindung, keine formulardaten (also bei dir hast du das ja teils nochmal in der "zeit.php" drin, daher geht nich alles in die hose ^^). aber du rufst einen teilcode direkt auf. dabei kann es nur zu fehlern kommen. eben weil es nur ein teil des ganzen ist. da fehlt unweigerlich was. du musst also immer über die index.php gehen. zumindest, wenn du es so baust, wie ichs vorgeschlagen hab  aber ich finde das eben sehr viel effizienter, da du keinen redundanten code hast. du "konfigurierst" deine variablen nur einmal, du baust nur einmal eine sql verbindung auf, du bearbeitest einmal zentral alle formulardaten. machst du das alles dezentral, darfste das in jedem file wieder und wieder machen - willste dann was ändern... viel spaß 

gut, ich hoffe, ich konnte etwas licht in die grundsätzliche arbeitsweise bringen. und wie gesagt: würde ich einen login nutzen, müsste auch ich mit dieser session arbeiten (oder aushilfsweise gingen wohl auch cookies). auf jedenfall bräuchte man irgendwas, um die daten zu "retten".


----------



## boss3D (18. Juli 2014)

^^ Vielen Dank, hat einiges klarer gemacht. 

Jedenfalls bin ich jetzt soweit, dass  ...
a) der ganze Login (inkl. Registrieren) einwandfrei funktioniert
b) das Durchschalten der Kalenderwochen in projektzeiterfassung.php funktioniert

Bei b) habe ich derzeit nur das Problem, dass er standardmäßig eine KW in 1970 anzeigt, und ich von da aus weiterschalten kann. Wie sollte ich das auf 2014 kriegen?

Darüber hinaus kapiere ich nicht, wieso ich in projektzeiterfassung.php auch meine Datenbankverbindung angeben muss, damit das bei mir funktioniert. Ich hätte das eigentlich schon in config.php gemacht und diese in index.php auch VOR projektzeiterfassung.php eingebunden, aber er erkennt's einfach nicht?!


Spoiler





```
<?php    
    include('config.php');
    
    include('formular.php');
    
    if (isset($_SESSION['Reg'])) {
        unset($_SESSION['Reg']);
    }
    if (!isset($_SESSION['name'])) {
        include('login.php');
    } else {
        include('projektzeiterfassung.php');
    }    
?>
```






Spoiler





```
<?php
    session_start();

    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $user = $_SESSION['name'];
    $userid = $_SESSION['id'];
    $rechte = $_SESSION['rechte'];
    
    $login = false;
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);
    
    $verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");
?>
```






Spoiler





```
<?php        
    $verbindung = mysql_connect('localhost', 'root', 'root') or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db('projektzeiterfassung') or die ("Datenbank konnte nicht ausgewählt werden.");

    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);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="index.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten2.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"></form></div>';

    } else {
        echo '</div>';
    }
    
    echo '</body>';
    echo '</html>';
?>
```



Meine SESSION Variablen aus config.php werden in projektzeiterfassung.php auch nicht erkannt. Muss ich die in allen Files angeben?

[EDIT]
Wenn ich das ganze Definitionszeugs in projektzeiterfassung.php am Anfang einfüge, dann sind alle warnings und Notices weg, und es wird auch bei einer KW in 2014 begonnen, von wo aus ich korrekt weiterschalten kann. Allerdings ist ja das nicht "Sinn der Sache"?! Ich meine, wozu habe ich dann jetzt config.php? 



Spoiler





```
<?php        
    session_start();

    $verbindung = mysql_connect('localhost', 'root', 'root') or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db('projektzeiterfassung') or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name'];
    $rechte = $_SESSION['rechte'];

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="index.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten2.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"></form></div>';

    } else {
        echo '</div>';
    }
    
    echo '</body>';
    echo '</html>';
?>
```



Oh, ein Problem habe ich gerade noch entdeckt: Bei jedem Weiterschalten der KWs gilt das scheinbar als "Bestätigen" und es entstehen "leere" Einträge in der DB! Das darf natürlich nicht passieren!




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Hm, ist schon klar: Die Buttons "Bestätigen", "<<" und ">>" sind alle in einer form enthalten, die index.php aufruft, in der wiederum formular.php inkludiert ist. Da wird bei jedem Button-Klick was in die DB geschrieben ohne zu prüfen, ob das jetzt vom "Bestätigen"-Button kommt. Da muss ich mir was schlaues überlegen ...

[EDIT2]
Wieder ein "workaround" ...

```
if (isset($_POST['confirm'])) {
    $_SESSION['confirm'] = ($_POST['confirm']);
}
```


```
if (isset($_POST['confirm'])) {
    include('formular.php');
}
```
Aber das sind halt alles keine "Ideallösungen"?!


----------



## TessaKavanagh (18. Juli 2014)

Wenn er dir eine KW in 1970 Anzeigt ist das vermutlich die erste KW den der UNIX Timestamp gibt die Sekunden seit dem 01.01.1970 0Uhr an. Folglich steht der Funktion vermutlich kein Timestamp zur Verfügung (fehler im Code?) und daher beginnt die Ausgabe beim Timestamp "0" also in 1970 .


----------



## boss3D (18. Juli 2014)

^^ Das habe ich schon gelöst. Es hat in projektzeiterfassung.php Code gefehlt, den ich in config.php stehen hatte, im Glauben, dass der durch das include in index.php eh sichtbar wäre. War aber scheinbar nicht so. Jetzt, wo der ganze Code in projektzeiterfassung.php steht, stimmt wieder alles.

Im Moment habe ich zwei Probleme:

1) Die userid wird ums Verrecken nicht erkannt. Es landet immer 0 in der DB.
(Wird hier in der Codemitte ermittelt -->)



Spoiler





```
<?php
    session_start();
        
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder nicht registriert.<br><br></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
                exit;
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT * FROM user WHERE name='".$username."'");

                if (mysql_num_rows($id)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                         echo '<br><div class="submit"><form  action="login.php">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';  
                    } else {        
                         echo '<br><div class="submit"><form  action="index.php">Fehler beim Speichern des  Benutzernamens.<br><br><input type="submit"  value="Zurück"></form></div>';
                    }
                }
            }
        }
    }
    
    echo '</body>
        </html>';
?>
```




2) Ich kriege immer noch keine Ausgabe, und in auswerten.php funktioniert auch das Durchschalten der KWs noch nicht. 


Spoiler





```
<?php
    session_start();
    
    $kw = date('W');  
    $jahr = date('Y');
    $monat = date('m');
    $wt = date('N');  
    $tag = date('j') - ($wt - 1);  
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);  
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);  

    $db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }
    
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<br><h1>Projektzeiterfassung: '.$user.'</h1>';
    echo '<form action="index.php" method="post">';
    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 (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"> Zurück zur Eingabe ...</form></div>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
?>
```




[EDIT]
Der Code in auswerten.php ist bis auf den Ausgabeteil völlig ident zu jenem in projektzeiterfassung.php. Gerade deswegen verstehe ich das überhaupt nicht, wieso das KW-Weiterschalten in auswerten.php nicht funktioniert.

projektzeiterfassung.php:



Spoiler





```
<?php        
    session_start();

    $verbindung = mysql_connect('localhost', 'root', 'root') or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db('projektzeiterfassung') or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name']; 
    $rechte = $_SESSION['rechte']; 

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="index.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten2.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"></form></div>';

    } else {
        echo '</div>';
    }
    
    if (isset($_POST['confirm'])) {
        $_SESSION['confirm'] = ($_POST['confirm']);
    }
    
    echo '</body>';
    echo '</html>';
?>
```



auswerten.php:



Spoiler





```
<?php
    session_start();
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name']; 

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="auswerten.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"> Zurück zur Eingabe ...</form></div>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
?>
```




[EDIT2]
Fragt mich bitte nicht, was jetzt anders ist, aber ich hab's gerade hinbekommen, dass das KW-Durchschalten jetzt auch in auswerten.php funktioniert. 


Spoiler





```
<?php
    session_start();
    
    $verbindung = mysql_connect('localhost', 'root', 'root') or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db('projektzeiterfassung') or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name'];
    $userid = $_SESSION['id'];    

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);
    
    $db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="auswerten.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"> Zurück zur Eingabe ...</form></div><br>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
?>
```



*Damit bleibt vorerst wirklich nur noch das Rätsel zu lösen, warum ich keine DB-Einträge ausgegeben kriege ...*


----------



## boss3D (18. Juli 2014)

@ DarkMo
Kann es sein, dass ich deswegen keine Ausgabe kriege, weil dein "Ausgabe-Code" nicht exakt zu meiner DB passt?

Hier dein Code:



Spoiler





```
$row_collector = array();
  if(mysql_num_rows($res)) {
    while($row = mysql_fetch_assoc($res)) {
      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>';
  }
```



Hier ist mein query:



Spoiler





```
$db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC;");
```



Und so habe ich jetzt mal versucht, meinen "Ausgabe-Code" anzupassen, kriege aber immer noch keine Ausgabe:



Spoiler





```
$row_collector = array();
    if (mysql_num_rows($db_erg)) {
        while ($row = mysql_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['t.id']])) {
                $row_collector[$row['t.id']] = array();
                $row_collector[$row['t.id']]['taet'] = $row['taetigkeit'];
                $row_collector[$row['t.id']]['data'] = array();
            }
            if (!isset($row_collector[$row['t.id']]['data'][$row['p.id']])) {
                $row_collector[$row['t.id']]['data'][$row['p.id']] = array();
                $row_collector[$row['t.id']]['data'][$row['p.id']]['prod'] = $row['produkt'];
                $row_collector[$row['t.id']]['data'][$row['p.id']]['desc'] = $row['beschreibung'];
                $row_collector[$row['t.id']]['data'][$row['p.id']]['user'] = $row['user'];
                $row_collector[$row['t.id']]['data'][$row['p.id']]['time'] = array();
            }
            $row_collector[$row['t.id']]['data'][$row['p.id']]['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>';
    }
```



In der DB habe ich in _zeiten_ bei "datum" jetzt wieder VARCHAR drinnen, am Rande bemerkt. Könnte es daran auch noch scheitern? Ich weiß sonst echt nichts mehr ... 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT]
Vielleicht liegt's doch auch irgendwie an der DB?! Ich habe jetzt mal testweise diesen Mini-Code ausführen lassen, aber er liefert ebenfalls keine Ausgabe, fast so als wäre die im Browser angezeigte Seite "unveränderbar". Da rührt sich überhaupt gar nichts, abgesehen davon, dass man die KWs durchschalten kann.

```
mysql_select_db('projektzeiterfassung', $verbindung); 
$rs = mysql_query("SELECT * FROM projekte WHERE id=154"); 
while ($zeile = mysql_fetch_array($rs)) {
    echo $zeile["name"];
}
```
[EDIT2]
Puh, nach stundenlangem Suchen: Ich habe den Fehler, oder besser gesagt die Ursache, gefunden ...

Das query ...
	
	



```
$db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = pr.id ORDER BY z.datum ASC");
```
... macht ganz offenbar nicht, was es soll!

Wenn ich es testweise durch folgendes stark vereinfachte ersetze ...
	
	



```
$db_erg = mysql_query("SELECT taetigkeit, produkt, beschreibung FROM projekte");
```
..., dann kriege ich sofort das hier:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Schaut zwar jetzt auf den ersten Blick nicht toll aus, aber es zeigt, dass DarkMo's Code stimmen muss und eine Ausgabe liefern würde. Lediglich die ganzen Array-Indexe passen halt nicht, aber da habe ich noch K. A., wie ich die sonst benennen soll.

Jedenfalls gilt es jetzt, das query zu richten und die Array Indexe anzupassen. DANN müsste es endlich mit der Ausgabe klappen ...


----------



## DarkMo (18. Juli 2014)

hui, ihr schreibt zuviel, wenn ich auf arbeit abhäng ^^ dann mal wieder stück für stück...

erste anmerkung:
es mag zwar klappen, aber sowas is für mich unschöner code:

```
$user = $_SESSION['name'];
    $userid = $_SESSION['id'];
    $rechte = $_SESSION['rechte'];
```
 schreib da eher immer sowas: if isset user = session else user = 0 bla. ah wo ichs grad seh: "ganz" anders...

```
$user = "";
    $userid = 0;   // id's fangen immer mit 1 an
    $rechte = -1;   /wir haben kein recht mit dem wert -1

    $login = false;

    if(isset($_SESSION['name']) {
      $user = $_SESSION['name'];
      $userid = $_SESSION['id'];
      $rechte = $_SESSION['rechte'];
    
      $login = true;
    }
```
zuerst defaultwerte vergeben und login auf false. dann checken, ob unsere session besteht (ist ein wert gesezt, sind sie alle gesezt ^^). wenn sie besteht, die werte übernehmen und login auf true. weil... wenn wir ne session haben, dann ist er ja auch eingeloggt. lässt man das login dingen weg, dann muss er sich bei jeden seitenreload neu einloggen ><

was der 3. code darstellt... projektzeiterfassung? weil da die button-abfragen mit drin sind (die ich eher formular.php (also nach meiner bezeichnung) zuordne ^^). kann ich bis hierhin erstmal nix weiter zu sagen.



> ^^ Hm, ist schon klar: Die Buttons "Bestätigen", "<<" und  ">>" sind alle in einer form enthalten, die index.php aufruft, in  der wiederum formular.php inkludiert ist. Da wird bei jedem Button-Klick  was in die DB geschrieben ohne zu prüfen, ob das jetzt vom  "Bestätigen"-Button kommt. Da muss ich mir was schlaues überlegen ...


das schlaue ist: check die button namen! nicht einfach stur bei ner gesendeten form alles speichern ^^ wenn der speichern-button (wie auch immer der interne namen davon is) nich gedrückt wurde, wird da garnix gemacht  ach, und dass er leeren krempel speichert zeugt vom nächsten prob ^^ da fehlt scheinbar der check, ob alle nötigen daten eingetragen wurden  hier fehlt mir wieder der code. auch für dein problem mit dem "er kennt die daten nicht (KW, sql...).

meine vermutung: beim login rufst du die projekt zeiterfassung immernoch über diesen header aufruf an. raus damit. der "fluss" durchs script ist so (frisch aufgerufen, uneingelogt:
-> index.php
- die config.php wird durchgeackert, sql verbindung aufgebaut, sonstiger krams vorbereitet (default werte von sonstewas)
-> session besteht nicht, login bleibt auf false
- die formular.php wird bemüht, aber da frischer aufruf, laufen alle if's ins leere und quasi geschieht hier nix. an den von config.php gebastelten defaults wird nix gerüttelt
- nun muss sich unser script entscheiden, ob login.php oder prj-zeiterf.php. da die variable login false ist, gehts ab nach login. ein gesetzter button namens btnRegForm is nicht vorhanden -> das login formular wird gebaut
- dann gehts wieder zur index.php und die abarbeitung des scripts endet quasi

nun sitzen wir vor unserer gebauten seite mit dem loginformular.
variante A: wir entscheiden uns, uns zu registrieren, drücken also diesen knopf (btnRegForm). jetzt rödelt der server also von neuem los:


Spoiler



-> index.php
- die config.php wird durchgeackert, sql verbindung aufgebaut, sonstiger krams vorbereitet (default werte von sonstewas)
-> session besteht nicht, login bleibt auf false
-  die formular.php wird bemüht, *kein frischer aufruf, dennoch nix, was uns hier dazu veranlasst, was zu tun*
- nun muss sich unser script  entscheiden, ob login.php oder prj-zeiterf.php. da die variable login  false ist, gehts ab nach login.* ein gesetzter button namens btnRegForm ist vorhanden -> das registrier formular wird gebaut*
- dann gehts wieder zur index.php und die abarbeitung des scripts endet quasi


hat sich an sich nur das fette geändert. wir sitzen jetzt also vorm registrier-formular, tippeln unsere daten ein und schwupps, drücken btnReg. und wieder von vorn... (ich geh jetzt mal davon aus, dass man nicht automatisch eingeloggt wird, wenn man sich gereggt hat):


Spoiler



-> index.php
- die config.php wird durchgeackert, sql verbindung aufgebaut, sonstiger krams vorbereitet (default werte von sonstewas)
-> session besteht nicht, login bleibt auf false
-  die formular.php wird bemüht, *diesmal springt ein if an! btnReg wurde gedrückt. also wird alles geprüft und gespeichert, der kerl ist registriert, der user in der db angelegt*
- nun muss sich unser script  entscheiden, ob login.php oder prj-zeiterf.php. *da die variable login auch hier noch  false ist, gehts ab nach login. ein gesetzter button namens btnRegForm  is diesmal wieder nicht vorhanden* -> das login formular wird gebaut
- dann gehts wieder zur index.php und die abarbeitung des scripts endet quasi


so, zurück beim login screen, diesmal tipeln wir unsere eben erstellten daten ein, und drücken btnLog...


Spoiler



-> index.php
- die config.php wird durchgeackert, sql verbindung aufgebaut, sonstiger krams vorbereitet (default werte von sonstewas)
-> session besteht nicht, login bleibt auf false
-  die formular.php wird bemüht, *btnLog gedrückt! aus den federn, arbeit ^^ alles wird geprüft und für richtig befunden, die session wird befüllt und login auf true gesetzt.*
- nun muss sich unser script  entscheiden, ob login.php oder prj-zeiterf.php.* nun endlich ist die variable login true, ab nach prj-zeiterf.php. -> unsere tabelle mit all dem krams wird gebaut*
- dann gehts wieder zur index.php und die abarbeitung des scripts endet quasi


tadaaa. nun drücken wir meinetwegen auf "<<" und zack, es geht schon wieder von vorne los *ächtz*...


Spoiler



-> index.php
- die config.php wird durchgeackert, sql verbindung aufgebaut, sonstiger krams vorbereitet (default werte von sonstewas)
-> *eine session besteht!, login wird auf true gesetzt*
-  die formular.php wird bemüht, *der prevWeek button wurde hart gedrückt, wir ändern die wochen-timestamp variablen und berchnen den anderen käse neu*
- nun muss sich unser script  entscheiden, ob login.php oder prj-zeiterf.php. die variable login ist true, ab gehts nach prj-zeiterf.php -> *wieder wird unsere tabelle gebaut, nur diesmal eben mit den daten letzter woche*
- dann gehts wieder zur index.php und die abarbeitung des scripts endet quasi



und so weiter und so fort... wenn du hier jetzt bei login einfach manuel die prj-zeiterf.php aufrufst, dann wird keine config bemüht, kein formular.php behandelt irgendwas... ^^



weiter gehts, post #403... ich hab dir doch die richtige reihenfolge für die formulare gegeben, wieso is das scho wieder so fürn huf >< so solls aussehn (kurzform):

```
if (!isset($_POST['btnReg'])) {
  // login form bauen
} else {
  // registrier form bauen
}
```
es nutzt nix, wenn die reggen form gebaut wird und dann gleich zeuch gespeichert wird, ohne das man was eingeben konnte 

gut, mit dem problem meinst du das hier?

```
if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder nicht registriert.<br><br></div>';
        }
```
also das $_SESSION['id'] = $row->id; 0 liefert? achne, du meintest eher, dass 0 in der db landet... also wohl eher beim reggen... aber ich will erst nochmal kurz hier bleiben. du fragst die daten aus der db ab und vergleichst dann das pw. das könnte vllt zu sicherheitsproblemen führen, kA. ich fänds jedenfalls sinniger, das pw gleich in der sql anfrage mit unterzubringen. also where user = user and pw=pw. dann wird dir garnich erst zeugs aus der db gesendet, wass nen hacker (wie auch immer, die sind ja leider einfallsreich xD) abgreifen könnte ^^ gehen tuts so auch, wie du es hast. aber wie gesagt, ich bin kein hacker und kenn die möglichkeiten nich. ich trau den pfeifen lieber zuviel zu wie zu wenig 

so, zurück zum "er trägt immer 0 als id in die db ein". ich vermute das reggen und daher diese zeile:
$eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
wenn er hier als id immer 0 einträgt - fehlt die angabe autoincrement? check mal plz die spalten-einstellungen deiner user-id spalte. ansonsten wüsst ich jetz auch ned weiter auf die schnelle.

dann zu auswerten php: hier wieder vermutlich das selbe - wie rufst du die auf? in deiner vorhin geposteten index.php steht davon garnix ^^ also scheinst du die wieder "händisch" aufzurufen und das nicht über die index.php zu regeln -> du musst wieder den code aus index da rein kopieren, damit überhaupt was klappt. btw: wieso trennst du ausgabe und eingabe eigentlich? versteh ich immernoch nich. es ist eine tabelle, wieso nich auch als eins behandeln (siehe mein bsp-code).



post #404:


> @ DarkMo
> Kann es sein, dass ich deswegen keine Ausgabe kriege, weil dein "Ausgabe-Code" nicht exakt zu meiner DB passt?


das kann durchaus sein. was heißt, der code - die sql abfrage. die ist ja auf meine db gemünzt und ich hab ja keinen blassen, was du so als spaltennamen genommen hast - ob du überhaupt alle tabellen hast, die ich auch habe und hierfür benötige. hmm, dazu muss ich jetz doch mal den rechner wechseln, hier habsch des ned druff ^^ bis gleich


----------



## DarkMo (18. Juli 2014)

so, weiter gehts. nich wundern, hab mal nen neues avatarbild gebaut xD inspiriert von meinem heimweg heute  war ein sehr angenehmer abschluss einer arbeitswoche  gut, konzentrieren *versuch*...


ich wollt den sql dingens da suchen. da isser ja scho:

```
$sql = "SELECT
                t.Bezeichnung AS Taetigkeit,
                p.Bezeichnung 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
                z.User = '".$user."' AND
                u.ID = z.user AND
                pr.ID = z.projekt AND
                pr.Taetigkeit = t.ID AND
                pr.Produkt = p.ID
          ORDER BY
                z.Datum ASC;";
```
jo genau, ich bemühe die tabelle zeiten natürlich. das ist ja quasi der kern. jede zeitangabe für ein projekt ist hier gespeichert. für ein projekt kann es eben mehrere zeitangaben geben - aber dann muss sich das datum eben unterscheiden. gleiches datum in gleichem projekt -> update. jut, die tabelle sieht bei mir so aus:



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        


die obligatorische id, gefolgt von den ID-verweise für das projekt und den user, der das erstellt hat sowie dem datum ALS INT ^^ und eben der zeit des erstellens/updates des eintrags als date.

um unsere php-tabelle gescheit anzeigen zu könne, brauchen wir also noch die fehlenden daten aus der projekte tabelle, folgt auch gleich nach from zeiten. die sieht dann so aus bei mir:



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        


die id, dann wieder id-verweise zu tätigkeiten, projekte und user plus die beschreibung als varchar. damit haben wir erstmal grundsätzlich alle daten, die auch in der tabelle angezeigt werden. allerdings halt bei vielen sachen nur die id. um die id's noch "aufzulösen" zu den eigentlichen bezeichnungen/namen, frage ich eben auch noch die 3 tabellen tätigkeiten, produkte und user ab. die sehen dann (in der eben genannten reihenfolge) so aus:



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        




zu bachten ist halt, dass die spaltennamen natürlich differieren können, das müsstest du natürlich an deine anpassen. da ich alles nen aliasnamen gebe, brauchste am restlichen code nix ändern. musst halt nur aufpassen, dass du fetch_assoc nutzt, sonst musste aus $row['spalte'] halt immer eine $row->spalte machen (mit fetch_object).

wenn du jetzt mal in den where teil schaust: da wird das datum abgefragt mit unseren timestamps als grenzen. da fällt mir auf, das müsste man eventuell auch anpassen ^^ uU zeigt er sonst was nich an. joa, beim sonntag könnts probs geben, da müsste man auch ein = anhängen. also so hier:
z.Datum >= '".$wochenanfang."' AND
z.Datum <*=* '".$wochenende."' AND

so, falls du diese 2 zeilen mal testweise löscht, und DANN zeigt er dir was an, dann ist das problem tatsächlich, dass du das nicht als int gespeichert hast. weil wie soll er eine zahl ($wochenende... ist nunmal ne zahl) mit einem string (datum als varchar angegeben) vergleichen. ich hab kA ob er das automatisch irgendwie hinbekommt.


----------



## boss3D (19. Juli 2014)

Also, um den ganzen Code wieder und wieder und wieder umzukrempeln, dazu haben wir leider keine Zeit mehr. Ich hab's ja eh schon die ganze letzte Woche versucht, aber es hat nie wirklich geklappt, das ganze auf dein System umzuschreiben. Vor allem, weil bei mir die config.php von gut der Hälfte der anderen Files nie erkannt wurde. Habe ich bspw. die DB-Verbindung nur in der config.php angegeben, kam von projektzeiterfassung.php gleich mal ein Error, dass ja gar keine bestehen würde ... 
Ähnliches auch mit einigen Variablen. Alles unbekannt, wenn ich's nur in config.php reinschreibe. Selbes gilt auch für session_start(), das ich erst wieder in allen Files angeben muss, oder es werden die SESSION Variablen nicht erkannt.

Jedenfalls kann ich jetzt nur noch auf das nötigste eingehen:

*1)* Ja, der 3. Code aus #403 ist projektzeiterfassung.php. Steht drüber.

*2)* Auf das Button-Namen-checken bin ich schon gekommen. Bei Klick auf "<<" und ">>" wird nichts mehr in die DB geschrieben, bei Klick auf "Bestätigen" wird korrekterweise formular.php aufgerufen.

index.php
	
	



```
<?php    
    include('config.php');
    
    if (isset($_POST['confirm'])) {
        include('formular.php');
    }
    
    if (isset($_SESSION['Reg'])) {
        unset($_SESSION['Reg']);
    }
    if (!isset($_SESSION['name'])) {
        include('login.php');
    } else {
        include('projektzeiterfassung.php');
    }    
?>
```
*3)* Ja, im header() wird projektzeiterfassung.php in login.php immer noch aufgerufen, aber wenn ich das irgendwie ändere, geht wieder gar nichts mehr. Und wie gesagt: Ich habe keine Zeit mehr, mir zu überlegen, wie ich wieder alles umbasteln müsste, damit auch das nur noch über index.php läuft. Lieber ein "funktionierendes Chaos", als ein formal korrekter Code, bei dem nichts geht.

login.php:



Spoiler





```
<?php
    session_start();
        
    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden.");
    mysql_select_db ("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            header('Location: http://localhost/db/projektzeiterfassung.php');
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder nicht registriert.<br><br></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
                exit;
            } else {
                @$passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT * FROM user WHERE name='".$username."'");

                if (mysql_num_rows($id)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                         echo '<br><div class="submit"><form  action="login.php">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';  
                    } else {        
                         echo '<br><div class="submit"><form  action="index.php">Fehler beim Speichern des  Benutzernamens.<br><br><input type="submit"  value="Zurück"></form></div>';
                    }
                }
            }
        }
    }
    
    echo '</body>
        </html>';
?>
```



*4)* "warum ist das schon wieder so fürn huf" ... Ich kann's nicht so aufsplitten wie von dir vorgeschlagen, weil bei mir der Login und das Registrieren längst nur noch EIN Code (= 1 File) ist. Nach deiner Logik bräuchte ich ja ein File für Login und ein weiteres File für Registrieren. DANN könnte ich immer das jeweils benötigte inkludieren. 

Übrigens habe ich auch diese ganzen Fehler längst beseitigt, dass "leere" Daten in die DB gespeichert wurden oder er mich gar nicht registrieren lassen wollte, weil User angeblich schon vorhanden. Wir sind längst bei auswerten.php angekommen. Alles bis dahin (registrieren, login, Dateneingabe) habe ich noch letzte Woche selbst richten können. 

*5)* Nein, nicht bei der Registrierung landet 0 als User-ID in der DB, da stimmt's noch. Da hat "test" bspw. id=6, "hallo" id=7, und der nächste User würde id=8 kriegen. Aber diese korrekt gespeicherte ID kann scheinbar nicht korrekt ausgelesen und in andere Tabellen übernommen werden?! Jedenfalls wird mir in _projekte_ und _zeiten_ immer nur für alle User id=0 eingetragen. Meine Vermutung ist, dass irgendwo in folgendem Code-Schnipsel was schief geht:
	
	



```
if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
```
^^ Das ist in login.php. In allen anderen Files wird die userid dann nur noch über "$userid = $_SESSION['id'];" abgegriffen, wo vermutlich längst schon nur noch "0" abgeholt wird?!

*6)* SQL-query ... nun, ich habe ja extra deines hergenommen und bin es ganz langsam durchgegangen, um bloß jede einzelne Angabe an meine DB-Benennungen anzupassen. Meine Vermutung: Ich habe irgendwas bei dir falsch interpretiert?! Ist ja auch nicht leicht, wo du selbst auch mehrmals noch was geändert hast; z. B. anfangs, soweit ich mich erinnere, war pr produkte und p projekte, dann hast du's wieder umgetauscht. 
Ich geh's jetzt nochmal durch, aber auf jeden Fall wäre genau DAS hier der Grund, warum ich noch keine Ausgabe durch auswerten.php kriege. Hat man ja gesehen: Nehme ich testweise ein mit Sicherheit richtiges query, liefert dein Code sofort die gewünschten Daten. Der Code stimmt also. 

Allerdings:
- Wenn ICH INT für das "datum" einstelle, dann speichert er bei mir nicht diese lange Zahl, die du hast. Bei mir wird dann wieder z. B. "1607" für den 16.07.2014 gespeichert. Und das sind halt alles so Dinge, die mich nur frustrieren, weil ich ja im Grunde das gleiche machen will wie du, aber bei mir läuft's nie auf das gleiche hinaus. Und ich weiß dann nie, was hast du denn sonst wieder alles anders? 

^^ Irgendwas hast du noch anders. Nur in der DB INT anzugeben reicht jedenfalls nicht, damit dort 1405332000 gespeichert wird.
---------------

Hier noch mein ganzer Code, damit du dir mal alles gemeinsam anschauen kannst, und nicht immer nur einzelne Teile: 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT]
Kannst du bitte mal folgende Zeile mit meiner DB (siehe zip) vergleichen? Ich habe das jetzt gefühlt 100 Mal nach deinem Schema nachzubasteln versucht, aber es geht nichts. Ich kriege nur zig Errors, dass er Angaben in der WHERE clause nicht erkennen würde. 

```
$db_erg = mysql_query("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 z.userid = '".$userid."' AND u.id = z.userid AND pr.Taetigkeit = t.id AND pr.Produkt = p.id ORDER BY z.Datum ASC;");
```


----------



## DarkMo (19. Juli 2014)

ich weis nich, wie ichs noch erklären soll. ausführlicher als mit den spoilern, gehts doch garnich mehr >< hier nochmal dein code:

```
<?php    
    include('config.php');
    
    include('formular.php');
    
    if (isset($_SESSION['Reg'])) {
        unset($_SESSION['Reg']);
    }
    if (!isset($_SESSION['name'])) {
        include('login.php');
    } else {
        include('projektzeiterfassung.php');
    }    
?>
```
bis auf das mit der session is das doch vollkommen ok und "vollständig", wenn du es nur richtig baust. unten im else wird deine datei aufgerufen - aber da kommt der code doch nie an, da du über den besichnen header-befehl gehst >< du musst nur 2 dinge sicherstellen: KEIN aufruf über einen header-befehl, $login muss beim einloggen (bzw beim abfragen der session) auch auf true gesetzt werden. aso, du gehst direkt über die sesion statt über ne hilfsvariable - k, mag auch gehn. aber sabotiere dich doch ned selber :/

wir machens mal anders: nimm mal deine index.php her und schreib überall nen echo befehl davor. so in etwa:

```
<?php
    echo 'los gehts - config.php<br>';
    include('config.php');
    
    echo 'weiter zu formular.php<br>';
    include('formular.php');
    
    if (isset($_SESSION['Reg'])) {
        unset($_SESSION['Reg']);
    }
    if (!isset($_SESSION['name'])) {
        echo 'entscheidung a) - login.php<br>';
        include('login.php');
    } else {
         echo 'entscheidung b) - projektzeiterfassung.php<br>';
        include('projektzeiterfassung.php');
    }    
?>
```
schwupps, haste ein echo debugging der simplen form gebaut. mich würds nich wundern, wenn du nie das letzte echo ausgegeben bekommst. und dann KANN dein konstrukt nich funtzen, wenn du diese datei nie über die index aufrufst.


----------



## DarkMo (19. Juli 2014)

hab mir jetzt mal deine formular.php angeschaut... erm ^^ ich denke, du prüfst, ob nen button gedrückt wurde? oO da gehts sofort los mit der forschleife zum speichern. freilich macht der da bei jedem seiten laden nur mist lol. aus deiner projekt bla php:
[...]<input type="submit" name="*confirm*" value="Bestätigen"> Schreibt Einträge in Datenbank ...[...]
wäre es da jetzt so unverschämt um diese vermaledeite forschleife ne if zu bauen, die genau diesen mistigen button abfragt? jetzt ernsthaft, wozu schreib ich dir das wieder und wieder in ausfürhlichster form, wenn du es nicht anwendest. wenn das mit dem rest genauso lief, weis ich schon, wieso nix funzt ^^

ich bin jetzt mal der reihe nach die files durchgegangen.
index.php sieht grundsätzlich gut aus - nur dass du eben EINE knöpfchen-drück bedingung per workaround auch noch AUSSERHALB der formular-php anwendest. was machst du, wenn du irgend nen anderen knopf abfragen willst? der sinn der formular.php ist es, diese ganzen knöppken drückereien gesammelt an einer stelle zu verwalten. die grobe form dieser datei sollte so aussehen:

```
wurde button A gedrückt?
    tue dies und das, was button A eben bewirken soll

wurde button B gedrückt?
    tue dies und das, was button B eben bewirken soll

wurde button C gedrückt?
    tue dies und das, was button C eben bewirken soll

...

wurde button X gedrückt?
    tue dies und das, was button X eben bewirken soll
```
ob ein button gedrückt wurde -> isset post button-name. die formular.php wird dann auch IMMER (bedingungslos szs) ausgeführt. also nur als hinweis: das MUSS man so nich machen. man kann die abfragen auch sonstwo im code machen, aber so find ich persönlich das ganze einfach übersichtlicher. auch sinnvoller irgendwo ^^ aber wenn du es auf diese weise machen magst, dann auch richtig 

gut, dann eben config.php, die ja zuerst aufgerufen wird. der loginstatus wird gesichert, passt soweit. fehlt halt der kalenderkrams zum bsp. wirste wohl aber da raus haben, weils ja "nich funktioniert hat" denk ich mal. aber an dieser stelle war eben kein fehler. ach siehste, die session wird auch ned gestartet, müsste da auch mit rein  wenn du in der index.php den login status per variable nich abfragst sondern direkt über die gesetzte session gehst, dann kannste die $login variable eigentlich auch rauswerfen. es dürfte auf deine weise eigentlich auch gehn. wüsst jetzt im schnell ünberblick nich, was da schief gehen könnte.

gut, jetz schau ich mir nochmal die login.php an. und das mit dem "fürn huf"... ich frag mich ernsthaft, wieso dein gewurschtel überhaupt funzt >< aha, HIER kommt jetzt der session start xD wie gesagt, der gehört in die config rein, da du hier schon die session variablen abfragst. jup, der rest is wieder der selbe käse. sry, aber es ist käse so. ich hab dir doch schon 2mal ne ordentliche version geschrieben. bei dir siehts momentan so aus:
wenn nicht btnReg gedrückt ist, baue das login formular mit den buttons btnLog (zum einloggen) und btnReg (zum wechseln zur registrieren form)
als nächstes:
wenn btnLog zum einloggen gedrückt wurde, logg ihn ein
und jetzt kommt der große haufen mist:
ansonsten, wenn btnReg gedrückt wurde (schon wieder der selbe button name? hatten wir das thema nich auch schon? ausführlich lang und breit erklärt?) baue die registrierungsform mit einem button btnReg zum abschicken der registration. und die härte: sofort danach ohne unterbrechung fänngst du schon mit der behandlung der formulardaten an! lass mich raten, die inputfelder der input-form haben die selben namen wie die der reggen form? jop. WIE willst du unterscheiden, ob das jetzt vom loggin-dingens kam oder vom reggen? das einzige, was dir den orsch rettet, ist das fehlen von password2 in der loginform. aber auf sowas kannste nich bauen!

ich könnt mir grad nur die haare raufen >< wer baut denn sowas zurecht? wieso nicht die naheliegende und simple logik:
is btnRegForm gedrückt, zeige die reg-form
sonst zeige die login-form
und die behandlung der FORMULAR daten machst du in... *tromelwirbel* ^^ FORMULAR.php  auch DORT hast du zugriff auf die POST variablen. vorallem: DORT ist VOR der entscheidung in der index.php, ob er login oder das andre anzeigen soll. loggst du ihn erst in login.php ein, ist er an dem punkt schon längst vorbei und der drops ist gelutscht. du bist zwar eingeloggt, siehst aber nur die login.php


das is halt der punkt: ich schreib mir die pfoten wund und erklär alles ins detail und du setzt nichts davon um. gugg dir den code doch an, das KANN doch ned funktionieren :/ ich hab dir schon sooft jetzt geschrieben wo es wurmt und wieso und was du ändern musst.


----------



## DarkMo (19. Juli 2014)

fast vergessen, den sql string mal anschauen:

```
$sql = "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
                z.user = '".$user."' AND
                u.id = z.user AND
                pr.id = z.projekt AND
                pr.taetigkeit = t.id AND
                pr.produkt = p.id
          ORDER BY
                z.datum ASC;";
```
so müsste es rein von den bezeichnungen her passen. einige fehler sind allerdings drinne, bei deinen db-tabellen, wenn DIESE anfrage funktionieren soll:
tabelle taetigkeiten: die spalten taetigkeit und produkt sind varchars - das müssen ints sein. fummelst dann halt händisch für die ersten beiden einträge die richtigen id's rein (oder löscht sie oder so)
tabelle zeiten: datum muss ein int sein - ah, haste also schon. dann mal schauen, wieso er da sonen murks speichert...


ah ich seh grad deinen "trick"...
if (isset($_POST['confirm'])) {
$_SESSION['confirm'] = ($_POST['confirm']);
und die session fragste dann in der index.php ab, bevor du formular.php includest... umständlicher gehts nich mehr oder? ^^ frag doch einfach den blöden confirm button ab, bevor du INNERHALB von formular.php diese olle speichern forschleife ausführst... gut, dann hier mal das meisterwerk 

```
for ($a = 1; $a <= $add; $a++) {
        $taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];  

[COLOR=red]        $erg2 = mysql_query("SELECT id FROM taetigkeiten WHERE taetigkeit='".$taetigkeit."'");
        $erg3 = mysql_query("SELECT id FROM produkte WHERE produkt='".$produkt."'");        $row2 = mysql_fetch_object($erg2);
        $taetigkeitid = $row2->id;
        $row3 = mysql_fetch_object($erg3);
        $produktid = $row3->id;
    
        $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeitid', '$produktid', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
    
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }        
        }        
    }
```
ich nutze mal den code tag, da kann man farbig drin rumpinseln... erstmal die beiden rot markierten sql abfragen... WHY? sag nich, du speicherst bei deinen select-inputs NICHT die id's als value oO was juckt mich als programmierer der klartextname einer option/eines db eintrags ^^ mich intressiert doch zu internem gerödel eigentlich nur irgendeine idendifikationsnummer. in der db speicher ich ned den namen, sondern die id, im code greife ich auf den klartextnamen über dessen id (in nem array zum bsp) zu usw usf. mal kurz schauen... aye -.-

```
echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['[STRIKE][B][COLOR=red]taetigkeit[/B][/STRIKE][B][COLOR=seagreen]id[/B]'].'">'.$taetigkeit['taetigkeit'].'</option>';
        }
        echo '</select></td>';
```
schon sparste dir ZIG db anfragen. dann wird aus

```
$taetigkeit = $_POST['taetigkeit'.$a.''];
        $produkt = $_POST['product'.$a.'']; 
        $beschreibung = $_POST['beschreibung'.$a.''];  

        $erg2 = mysql_query("SELECT id FROM taetigkeiten WHERE taetigkeit='".$taetigkeit."'");
        $erg3 = mysql_query("SELECT id FROM produkte WHERE produkt='".$produkt."'");
        $row2 = mysql_fetch_object($erg2);
        $taetigkeitid = $row2->id;
        $row3 = mysql_fetch_object($erg3);
        $produktid = $row3->id;
    
         $stunden = array("montag".$a."", "dienstag".$a."",  "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."",  "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
         $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('$taetigkeitid',  '$produktid', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
```
nämlich

```
$stunden = array("montag".$a."", "dienstag".$a."",  "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."",  "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
         $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('$_POST['taetigkeit'.$a.'']',  '$_POST['product'.$a.'']', '$userid', '$beschreibung', '$erstellt')");
        $taetprodid = mysql_insert_id();
```

gut, jetzt kommen wir wohl zum kern der sache... als datum speicherst du $tag = $_POST[$data[$b]]; wobei data-b zu mo di mi... wird. das sind deine inputnamen der wochentage, in denen die zeiten stehen. jetzt frag ich mich gerade, WAS du da überhaupt speicherst. also der wert dieses post's ist ja die eingetragene zeit - den kannste also ja schonmal nich speichern. den namen auch ned, was sollen wir mit mo oder so anfangen ^^ jetzt seh ich grad, für zeit greifste nicht auf mo, sondern auf montag (usw) zu - hä? hast du da 2 inputs für einen tag oder wie? gleich mal guggen... ne, du hast da nur die stunden-inputs (also montag... aber von mo... is da nix zu finden). also speicherst du quasi garnix? wo nimmt er dann überhaupt die werte her? oO

also um meine lösung des problems mal zu verdeutlichen: jeder tag hat einen gewissen timestamp. der montag entspricht ganz einfach dem timestamp $wochenanfang. für den dienstag müssen wir einen tag (in sekunden) dazu rechnen. also äh 86400 glaube (60*60*24). der dienstag hat also den timestamp $wochenanfang + $tag (wobei $tag eben diesem wert 86400 entspricht). der mittwoch ist nun der wochenanfang + 2 tage usw usf. in ner forschleife sehr billig umzusetzen. in genau so einer erstelle ich auch meine mo-so inputs. als NAME der inputs nehme ich den entsprechenden timestamp. der VALUE ist das, was der benutzer eingetragen hat - also die zeit (in stunden). das sieht dann so aus:

```
for($i = 0; $i < 7; $i++) {
    $ts = $wochenanfang + ($i * 60 * 60 * 24);
    echo '  <td><input type="text" name="'.$ts.'[]" maxlength="6" size="4"></td>';
  }
```
am montag ist i = 0, es wird also kein tag draufgerechnet. am di ist i = 1 - es wird 1 tag dazugerechnet usw usf. ich frag mich immernoch, wieso ich das $ts genannt hatte ^^ irgendwas mit tag - aber wofür das s stand... is ja auch wurst. auch zu beachten: ich nutze ganz billig das [] als namens anhängsel. wozu sonen heckmeck mit der angehängten variable machen?

jut, was haben wir nun also damit gewonnen? wir haben in einem inputfeld 2 werte übertragen. wobei wir zum zugreifen dann den namen erst wieder generieren müssen, aber wir haben halt direkt den timestamp, den wir in die spalte datum speichern können. meine speicherung des ganzen sieht dann bei mir so aus:

```
if(isset($_POST['btnAdd'])) {
    foreach($_POST['taetigkeit'] as $key => $val) {
      $sql_chk = "SELECT * FROM projekte WHERE Taetigkeit='".$val."' AND Produkt='".$_POST['produkt'.$val][$key]."' AND User='".$user."';";
      $res_chk = mysql_query($sql_chk) OR die("Projektkontrolle fehlgeschlagen.<br>".mysql_error());
      if(mysql_num_rows($res_chk)) {
        $row_chk = mysql_fetch_assoc($res_chk);
        if($row_chk['Beschreibung'] != $_POST['desc'][$key]) {
          $sql_upd = "UPDATE
                          projekte
                      SET
                          Beschreibung = '".addslashes(htmlspecialchars($_POST['desc'][$key]))."'
                      WHERE
                          Taetigkeit='".$val."' AND
                          Produkt='".$_POST['produkt'.$val][$key]."' AND
                          User='".$user."';";
          mysql_query($sql_upd) OR die("Fehler beim Aktualisieren der Projektdaten!<br>".mysql_error());
        }
      } else {
        $sql_ins = "INSERT INTO projekte
                        (Taetigkeit, Produkt, Beschreibung, User)
                    VALUES
                        ('".addslashes(htmlspecialchars($val))."',
                         '".addslashes(htmlspecialchars($_POST['produkt'.$val][$key]))."',
                         '".addslashes(htmlspecialchars($_POST['desc'][$key]))."',
                         '".addslashes(htmlspecialchars($user))."');";
        mysql_query($sql_ins) OR die("Fehler beim Erzeugen der Projektdaten!<br>".mysql_error());
        $proj_id = mysql_insert_id();
        for($i = 0; $i < 7; $i++) {
          $ts = $wochenanfang + ($i * 60 * 60 * 24);
          $sql_chk = "SELECT * FROM zeiten WHERE Projekt='".$proj_id."' AND Datum='".$ts."' AND User='".$user."';";
          $res_chk = mysql_query($sql_chk) OR die("Zeitenkontrolle fehlgeschlagen.<br>".mysql_error());
          if(mysql_num_rows($res_chk)) {
            $row_chk = mysql_fetch_assoc($res_chk);
            if($row_chk['Zeit'] != $_POST[$ts][$key]) {
              $sql_upd = "UPDATE
                              zeiten
                          SET
                              Zeit = '".addslashes(htmlspecialchars($_POST[$ts][$key]))."',
                              Erstellt = NOW();
                          WHERE
                              Projekt='".$proj_id."' AND
                              Datum='".$ts."' AND
                              User='".$user."';";
              mysql_query($sql_upd) OR die("Fehler beim Aktualisieren der Zeitendaten!<br>".mysql_error());
            }
          } else {
            if($_POST[$ts][$key] > 0) {
              $sql_ins = "INSERT INTO zeiten
                              (Projekt, User, Zeit, Datum, Erstellt)
                          VALUES
                              ('".addslashes(htmlspecialchars($proj_id))."',
                               '".addslashes(htmlspecialchars($user))."',
                               '".addslashes(htmlspecialchars($_POST[$ts][$key]))."',
                               '".addslashes(htmlspecialchars($ts))."',
                               NOW());";
              mysql_query($sql_ins) OR die("Fehler beim Erzeugen der Zeitendaten!<br>".mysql_error());
            }
          }
        }
      }
    }
  }
```
oder runtergebrochen aufs wichtige:

```
if(isset($_POST['btnAdd'])) {  // das wäre dein confirm
    foreach($_POST['taetigkeit'] as $key => $val) {
      // check, ob es das projekt (als kombination aus tät. und produkt) von diesem user schon gibt
      // wenn ja, schau nach, ob die beschreibung sich geändert hat
      if(mysql_num_rows($res_chk)) {
        // wenn sie sich geändert hat, update das projekt
        if($row_chk['Beschreibung'] != $_POST['desc'][$key]) {
        }
      } else {
        // gibts das projekt noch nicht, leg es halt an ^^
        // speicher die projekt-id
        $proj_id = mysql_insert_id();

        // hier wieder unser krams für die einzelnen wochentage. im grunde wieder die selbe for schleife.
        for($i = 0; $i < 7; $i++) {
          // berechne den "tages timestamt" - ach, ts für timestamp! xD
          $ts = $wochenanfang + ($i * 60 * 60 * 24);
          // mach lucki lucki, obs schon eine zeit für dieses datum gibt...
          $sql_chk = "SELECT * FROM zeiten WHERE Projekt='".$proj_id."' AND Datum='".$ts."' AND User='".$user."';";
          // wenn ja, schau wieder nach, ob sich die eingetragene zeit geändert hat
          if(mysql_num_rows($res_chk)) {
            if($row_chk['Zeit'] != $_POST[$ts][$key]) {
              // und update sie in diesem fall
            }
          } else {
            // wenns da noch nix gibt, prüfe mal nach, ob wir überhaupt ne eingetragene zeit haben (also im formular), oder ob das feld ne nullnummer is
            // so eigentlich könnte man diese frage schon weit früher stellen xD
            if($_POST[$ts][$key] > 0) {
              // wenn wir also ne zeit vom formular für diesen tag bekommen haben, speichere sie
              $sql_ins = "INSERT INTO zeiten
                              (Projekt, User, Zeit, Datum, Erstellt)
                          VALUES
                              ('".addslashes(htmlspecialchars($proj_id))."',
                               '".addslashes(htmlspecialchars($user))."',
                               '".addslashes(htmlspecialchars($_POST[$ts][$key]))."',  // <-- der VALUE des posts
                               '".addslashes(htmlspecialchars($ts))."',   // der nachgebildete NAME des posts
                               NOW());";
              mysql_query($sql_ins) OR die("Fehler beim Erzeugen der Zeitendaten!<br>".mysql_error());
            }
          }
        }
      }
    }
  }
```
dann haste auch die richtige zahl gespeichert. und da ich wie gesagt nicht mit 'name'.$a arbeite sondern mit 'name[]', kann ich den ganzen kram auch einfach mit einer foreach abrackern. als bezugspunkt für foreach nehm ich mir irgendeins der inputfelder heraus (ich hab tätigkeit genommen) und lasse mir das aufsplitten in den index (-> $key) und dessen wert (-> $val):
foreach($_POST['taetigkeit'] as $key => $val)...
in der ersten reihe meiner erstellten inputs wird aus taetigkeit[] mit dem übergebenen wert 2 (zum bsp) dann eben teatigkeit[0] (der $key ist 0) mit dem wert 2 (=$val). alle anderen inputs haben dann genau den selben index. also das dazugehörige produkt-input mit namen produkt[] kann ich nun mittels dem $key ansprechen -> produkt[$key]. und im ersten durchgang ist das ja 0, wie eben gesehn. $val ist aber uch hier immernoch auf taetigkeit[$key] bezogen  jedenfalls kann man so ganz easy alle zusammengehörigen inputs abfragen.


----------



## boss3D (20. Juli 2014)

Den Zeit-Teil aus der zweiten Hälfte deines letzten Postings lassen wir erstmal, vorher lieber alles andere richten ...

Jedenfalls kriege ich 2 Probleme, wenn ich das alles so nachbastle:
1) Er kommt bei mir nie zum Login (bzw. _login.php_), sondern landet bei Aufruf von _index.php_ immer gleich bei _projektzeiterfassung.php_.
2) Und seit ich den verkürzten Code nach deinem "nämlich" eingefügt habe, kriege ich jetzt, bevor wir überhaupt so weit kommen, von _formular.php_ folgende Nachricht:





> *Parse error*:  syntax error, unexpected ''  (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable  (T_VARIABLE) or number (T_NUM_STRING) in *C:\xampp\htdocs\db\formular.php* on line *43*


Aber ich finde den Syntaxfehler ums Verrecken nicht. Alle anderen INSERT-Zeilen in dem Code schauen syntaktisch ident aus. Ein " am Anfang und eines am Ende?!
---------

Jetzt nochmal zu dem ganzen Zeit-Teil: Bei der for-Schleife (4-Zeiler oben bei dir) habe ich, glaube ich, nicht ganz kapiert, wo die rein soll?! Wir reden da von _formular.php_, oder?
Und bei deinem langen Code habe ich das Problem, dass a) bei mir die Zeilen hinzufügen bzw. entfernen Funktionalität völlig anders realisiert ist (durch einen Code von Tessa), sodass ich das jetzt nicht einfach so von dir übernehmen kann ohne mir damit wahrscheinlich einiges zu zerschießen?! Und b) dass wahrscheinlich die Bezeichnungen wieder alle nicht mit meiner DB zusammenpassen?!

BTW: Du hattest dich wegen "mo", "di", "mi", ... und "montag", "dienstag", "mittwoch", ... bei mir gewundert. Die kurzen Versionen sind die Namen der input-Felder direkt neben MO, DI, MI, ... auf der Website; da soll der User das Tagesdatum eingeben (wie sinnvoll das jetzt noch ist, wo eh die WK angezeigt wird, sei mal dahingestellt). Die langen Versionen sind die Namen der Felder unter dem jeweiligen Tag, wo der User auf der Website die Stunden eingibt. 

Hier jedenfalls mal meine überarbeiteten Code:

index.php



Spoiler





```
<?php
    echo 'los gehts - config.php<br>';
    include('config.php');
    
    echo 'weiter zu formular.php<br>';
    include('formular.php');
    
    if (!isset($_SESSION['name'])) {
        echo 'entscheidung a) - login.php<br>';
        include('login.php');
    } else {
         echo 'entscheidung b) - projektzeiterfassung.php<br>';
        include('projektzeiterfassung.php');
    }    
?>
```



config.php



Spoiler





```
<?php
    session_start();
    
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $user = "";
    $userid = 0;   
    $rechte = -1;   

    if (isset($_SESSION['name'])) {
      $user = $_SESSION['name'];
      $userid = $_SESSION['id'];
      $rechte = $_SESSION['rechte'];
    }
        
    $verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");
?>
```



login.php



Spoiler





```
<?php     
    if (isset($_POST['btnReg'])) {
        $_SESSION['Reg'] = ($_POST['btnReg']);
    }
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    if (!isset($_POST['btnReg'])) {    
        echo '<table><th>Login</th></table>';
        echo '<p>Ihr Username:</p>
                <input type="text" size="24" maxlength="50" name="username"><br>';
        echo '<p>Ihr Passwort:</p>
                <input type="password" size="24" maxlength="50" name="password"><br><br>';
        echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">';
        echo '</form></div><br>';
    }
            
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder nicht registriert.<br><br></div>';
        }
    } elseif (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
    }
    
    echo '</body>
        </html>';
?>
```



formular.php



Spoiler





```
<?php         
    $erstellt = date('Y-m-d-h-i-s');    
    $add = $_POST['add'];
    
    if (isset($_SESSION['Reg'])) {
        unset($_SESSION['Reg']);
    }
    
    if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
        $passwort = $_POST['passwort'];
        $passwort2 = $_POST['passwort2'];
        if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
            echo '<br><div class="submit"><form action="login.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
            exit;
        } else {
            $passwort = hash('sha512', ($passwort).$salt);
            if ($username == "test") {
                $rechte = 0;
            } else {
                $rechte = 1;
            }

            $id = mysql_query("SELECT * FROM user WHERE name='".$username."'");

            if (mysql_num_rows($id)) {
                echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
            } else {
                $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                if ($eintragen == true) {                
                     echo '<br><div class="submit"><form  action="login.php">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';  
                } else {        
                     echo '<br><div class="submit"><form  action="index.php">Fehler beim Speichern des  Benutzernamens.<br><br><input type="submit"  value="Zurück"></form></div>';
                }
            }
        }
    }
    
    if (isset($_SESSION['confirm'])) { 
        for ($a = 1; $a <= $add; $a++) {    
            $stunden = array("montag".$a."", "dienstag".$a."",  "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."",  "sonntag".$a."");   
            $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
            $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('$_POST['taetigkeit'.$a.'']', '$_POST['product'.$a.'']', '$userid', '$beschreibung', '$erstellt')");
            $taetprodid = mysql_insert_id();  
        
            for ($b = 0; $b < 7; $b++) {
                if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                    $dauer = $_POST[$stunden[$b]];
                    $tag = $_POST[$data[$b]];                                
                    $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
                }        
            }        
        }
    }
?>
```



projektzeiterfassung.php



Spoiler





```
<?php        
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name']; 
    $rechte = $_SESSION['rechte']; 

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="index.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

    for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['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>';

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten2.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"></form></div>';

    } else {
        echo '</div>';
    }
    
    if (isset($_POST['confirm'])) {
        $_SESSION['confirm'] = ($_POST['confirm']);
    }
    
    echo '</body>';
    echo '</html>';
?>
```



auswerten.php



Spoiler





```
<?php   
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name'];
    $userid = $_SESSION['id'];    

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);
    
    
    $db_erg = mysql_query("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 z.user = '".$user."' AND u.id = z.user AND pr.id = z.projekt AND pr.taetigkeit = t.id AND pr.produkt = p.id ORDER BY z.datum ASC;";);
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.mysql_error());
    }

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="auswerten.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 (mysql_num_rows($db_erg)) {
        while($row = mysql_fetch_assoc($res)) {
            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></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"> Zurück zur Eingabe ...</form></div><br>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
?>
```




_PS: bei deinem "ts" hätte ich auf eine Verkürzung von "timestamp" getippt, nicht "tag" und noch was._


----------



## DarkMo (20. Juli 2014)

zuerst: jop, das würd ich auch sagen. es hatte halt thematisch irgendwie zusammen gehört, daher hatte ichs mit aufgeführt. wenn man die ganzen checks weglässt, isses auch nich so aufgebläht ^^ aber wie gesagt: jop, lass erstmal wech. soa, du kommst also nie zu login.php. also muss session-name gesetzt sein. das kann theoretisch nur in der onfig.php passieren... hmm, da is aber nix... mach mal ne testausgabe, ganz oben bei deiner index.php als allererstes (bevor config oder oder):
if(isset(session-name)) echo "is set, value: [".session-name."]<br>"; else echo "is not set";

ich vermute die ausgabe "is set, value: []". dann wäre das prob, dass der wert immer gesetzt ist, und wir beser prüfen, ob er ungleich "" ist. ist aber jetzt nur ne vermutung. andernfalls - ne, die login variable wieder nutzen bringt auch nix, da wir in config ja das selbe (session-name) prüfen wie jetzt schon. also würde login genauso true werden und es ändert sich nix. hmm. naja, probier das erstmal. wenn garnix geht, lass mal die user-id variable nach dem aufruf der config.php ausgeben. wenn die da 0 ist, könnten wir das als prüfparameter nutzen (userid == 0 -> login.php else...).

wegen dem error da: ich glaub ich seh wieso. ich hatte deine post variablen stumpf anstelle der von dir erstellten variablen (aus der db gelesenen) kopiert. also anstelle von $taetigkeitid (oder wie es hieß) hab ich dein $_POST['taetigkeit'.$a.''] geschrieben und raus kam dabei:

```
$eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt)
VALUES ('$_POST['taetigkeit'.$a.'']',  '$_POST['product'.$a.'']', '$userid', '$beschreibung', '$erstellt')");
```
erstmal, bei $_POST['taetigkeit'.$a.''] - wozu der rote teil? du hängst nix an? ^^ kannste weglassen. und jetzt zum eigentlichen prob: ich denke mal, wir sollten da lieber dann mit dem .-operator arbeiten, ich befürcht er bekommt mit den vielen ' probleme. wie gesagt, ich mag diese kurzschreibweise nich so wirklich :/ also quasi sowas hier draus machen (zumindest bei den post variablen):

```
$eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt)
VALUES ('".$_POST['taetigkeit'.$a]."',  '".$_POST['product'.$a]."', '$userid', '$beschreibung', '$erstellt')");
```
ich HOFE, das wars ^^ wenn nich, müssmer mal weiter suchen.


der 4zeiler mit dem ts (jop, ich kam mittlerweile auch wieder drauf dass das timestamp heißen sollte xD ) soll in deiner projektzeiterfassung.php diesen code ersetzen:

```
echo '<td><input name="montag'.$a.'" type="text" size="10" maxlength="5""></td>';
        echo '<td><input name="dienstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="mittwoch'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="donnerstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="freitag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="samstag'.$a.'" type="text" size="10" maxlength="5"></td>';
        echo '<td><input name="sonntag'.$a.'" type="text" size="10" maxlength="5"></td></tr>';
```
du erstellst mit der forschleife diese 7 inputs in einem ritt. alle haben gleich diesen timestamp als namen (und anstelle der [] im namen kannste auch dein $a anhängen (ich würd es aber mit nem _ trennen, also $ts.'_'.$a). dann sollte das auch kompatibel mit deiner forschleife bei der abfrage sein.

sind wir gleich beim nächsten thema. is jetzt ohne es wirklich nachgeschaut zu haben, aber im groben sollte es reichen, wenn du meine foreach mit deiner for $a... ersetzt und in meinem code alles, was [$key] lautet mit .$a ersetzt. bei den tages-inputs dann natürlich ggf _.$a (alles kurzschreibweise, hoff du weist, was ich meine). dann müsste es eigentlich schon laufen. ich benutze ja die inputs als arrays, du vergibst manuell nen index (den du anhängst - also kein array gleicher namen, sondern eben immer einen einzigartigen namen (der rekonstruierbar ist)).

zu deinem BTW: joa, das kannst du an und für sich weglassen. die daten, die du dort manuell angeben lässt, würden ja mit dem "ts-code" von mir automatisch generiert werden.


jut, zu den codes. bei der formular.php - jain. du fragst im ersten teil direkt die input-feldnamen ab, NICHT den button. überlege dir: WANN muss ich denn überhaupt checken, ob das reggen-formular ordentlich ausgefüllt wurde (bzw analog mit dem loggen formular)? dass musst du NUR, wenn der entsprechende button auch gedrückt wurde. also if isset btnLog prüfe, ob alle eingaben ok sind und speicher dann. wenn allerdings btnReg gedrückt wurde, kümmer dich um die registration des typen. genauso kannst du alle anderen buttons (die formulardaten auswetung zur folge haben oder irgendwelche anderen berechnungen anstoßen) hier abarbeiten.

wenn man solche buttons wie btnRegForm betrachtet, sieht man ne 2. variante der button nutzung: dieser button ist nicht dazu gedacht, irgendwelche formulardaten auswerten zu lassen, sondern dient nur als ne art "link". wenn man den button drückt, wird nicht die loginform gemalt, sondern die rggen form. es ensteht also der eindrück, man hat dadurch ne andere seite aufgerufen. das könntest jetzt auch als wink mit dem zaunspfahl verstehen, was deine auswerten.php's betrifft  mal ne beispiel index.php:

```
<?php
    echo 'los gehts - config.php<br>';
    include('config.php');
    
    echo 'weiter zu formular.php<br>';
    include('formular.php');
    
    if(!isset($_SESSION['name'])) {
      echo 'entscheidung a) - login<br>';

      if(isset($_POST['btnRegForm'])) {
          echo 'entscheidung a) 1) - register.php aufrufen<br>';
          include('login.php');
      } else {
        echo 'entscheidung a) 2) - login.php aufrufen<br>';
        include('login.php');
      }
    } else {
      echo 'entscheidung b) - projektzeiterfassung<br>';
      if(isset($_POST['btnAuswForm'])) {
        echo 'entscheidung b) 1) - auswerten.php<br>';
        include('auswerten.php');
      } else if(isset($_POST['btnAuswAdminForm'])) {
        echo 'entscheidung b) 2) - auswerten2.php<br>';
        include('auswerten2.php');
      } else {
        echo 'entscheidung b) 3) - projektzeiterfassung.php<br>';
        include('projektzeiterfassung.php');
      }
    }    
?>
```
die einzelnen php's enthalten dann NUR den (html und php) code der entsprechenden formulare bzw tabellen usw. die auswertung der gesendeten formulardaten kommt wieder in formular.php. wenn dir die zu groß wird, kannste das ja dann dort auch aufsplitten in einzelne files. wäre aber halt kosmitik des codes, bessere les- und editierbarkeit bla.

achja, dann haste da halt noch dieses if (isset($_SESSION['confirm'])) drin. mach aus dem session einfach ein post und fertig. schau dir mal folgenden bsp code an:

```
$a = 'hallo welt';
$b = $a;
$c = $b;
echo $c;
```
anstatt einfach direkt $a auszugeben, speicherst du das nochmal in ner anderen variablen ab und gibst diese dann aus -> sinnlos 


die login-php, teil es vllt wirklich mal auf in 2 files. eines was die registrierungs-form baut und eines das die loginform baut. wie du beide aufrufen kannst, hab ich ja schon eben in der modifizierten index.php gezeigt. dann kannst du nämlich auch gleich in deiner projektzeiterfassung.php die "multi-forms" rausnehmen. hier hättest dann nämlich wieder das problem, dass du in auswerten.php keinerlei formulardaten zum auswerten bekommst und dass du die php wieder direkt aufrufst und nicht über die index (die dann erst config und dann formular php aufruft). anhand des gedrückten button namens entscheidest dann halt, welche php ausgegeben wird.

und btw haste dann auch in auswerten php keine fehlenden variablen mehr


----------



## boss3D (20. Juli 2014)

Okay. Ich habe bis heute Abend leider nicht viel Zeit, daher erstmal das, was ich jetzt noch geschafft habe. Am Abend dann geht's weiter ...

*1)* Deine if-Zeile aus deinem ersten Absatz klappt so nicht. Ich habe sie dann folgendermaßen probiert ...
	
	



```
if (isset($_SESSION['name'])) {
    echo "is set, value: ['".$_SESSION['name']."']<br>"; 
} else {
    echo "is not set";
}
```
^^ Dabei kommt "is not set" raus. Müsste also eigentlich alles passen?! K. A. warum ich trotzdem nicht zu _login.php_ komme, wenn ich _index.php_ aufrufe. 
*
2)* Die zweite Version von "eintragen1 = ..." funktioniert jetzt, das passt.

*3) *Die 4zeilige for-Schleife habe ich jetzt statt den 7 echos eingefügt, aber das mit dem _ statt irgendwas habe ich jetzt auf die Schnelle noch nicht ganz verstanden. Da denke ich mich heute Abend noch rein. Dürfte aber kein für die Funktionalität essentieller Unterschied zur jetzigen Version sein?!

*4)* Den ganzen Teil mit neuerlichem Aufsplitten von Login und Registrieren mache ich auch heute Abend. Das ist zumindest klar. So, wie ich's jetzt habe (in einem File), wäre jedenfalls dein inneres if-else in _index.php_ umsonst, weil eh in beiden Fällen _login.php_ aufgerufen würde. Die Unterscheidung würde in _login.php_ passieren.

*5)* _auswerten.php_ schaue ich mir an, sobald bis _projektzeiterfassung.php_ alles stimmt und funktioniert.


----------



## DarkMo (20. Juli 2014)

1) hmm k. und wenn du es jetzt mal stück für stück "nach unten" versetzt? also nicht vor config, sondern danach (vor formular) und dann ggf nochmal nach formular. wenn sich irgendwo der status ändert/die ausgabe, dann wissen wir schonmal, wo es hackt.

2) gut 

3) beispiel: der aktuele timestamp ist meinetwegen 1234567 und du willst dein $a anhängen, um den index im namen zu haben. lass $ jetzt mal 5 sein, dann ist der name des inputs also 12345675 - das kann zu problemen führen. daher würde ich es eben eher in dieser form speichern: 1234567_5. so ist gleich klar, was ist timestamp und was ist index. also statt $ts.$a ein $ts.'_'.$a speichern. mehr sollte das nicht bedeuten.

4) genau.

5) jops. allerdings solltest du eben den aufruf n der prj zeiterf php ändern. nicht den button in ne eigene form packen usw. einfach mit in die form, die zu index.php zurück leitet mit reinpacken und nen einzigartigen namen geben, den du dann in der index php wie gezeigt auswerten kannst, um zu entscheiden, welche php nun ausgegeben werden soll.


----------



## boss3D (20. Juli 2014)

Nur mal kurz zu *1)*, am Rest arbeite ich noch ...

Wenn ich das if-Konstrukt unter include(config.php) setze, kommt "is set, value: ['test']". Also kann's in meinen Augen nur daran liegen, dass ich in _config.php_ session_start() drinnen habe?! Es ändert sich allerdings nichts, wenn ich den in _index.php_ reintue (statt _config.php_). Jetzt weiß ich nicht, wie ich das lösen soll. 

index.php
	
	



```
<?php
    echo 'los gehts - config.php<br>';
    include('config.php');
 
    if (isset($_SESSION['name'])) {
        echo "is set, value: ['".$_SESSION['name']."']<br>"; 
    } else {
        echo "is not set";
    }
    
    echo 'weiter zu formular.php<br>';
    include('formular.php');
    
    if (!isset($_SESSION['name'])) {
        echo 'entscheidung a) - login.php<br>';
        include('login.php');
    } else {
         echo 'entscheidung b) - projektzeiterfassung.php<br>';
        include('projektzeiterfassung.php');
    }    
?>
```
config.php
	
	



```
<?php
    session_start();
    
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $user = "";
    $userid = 0;   
    $rechte = -1;   

    if (isset($_SESSION['name'])) {
      $user = $_SESSION['name'];
      $userid = $_SESSION['id'];
      $rechte = $_SESSION['rechte'];
    }
        
    $verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");
?>
```


----------



## DarkMo (20. Juli 2014)

k, genau das war mein vermutung. probier mal bitte das hier:
     session_start();
     session_regenerate_id();

statt nur
     session_start();


*gespannt bin* mein "mentor" damals hatte mir gesagt, das es sehr viel sinnvoller ist, diese zusatz dingens zu nutzen. ich vermute gerade, dass das teil das session array von vorhergehenden sitzungen leert, so dass man es wirklich immer neu anlegen muss. dann wäre mir jetzt nach ein paar jahren auch endlich mal der sinn des aufrufs klar  aber probier erstmal


----------



## boss3D (20. Juli 2014)

Ich hätte es gerade probiert, aber es kam ... 





> *Parse error*:  syntax error, unexpected '$ts' (T_VARIABLE), expecting ',' or ';' in *C:\xampp\htdocs\db\projektzeiterfassung.php* on line *120*


... weil ich zuvor *3)* gemacht habe, aber anscheinend falsch?!

War das wirklich so gemeint?
	
	



```
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>';
}
```


----------



## DarkMo (20. Juli 2014)

naja, du nutzt für den string " und dann darfst du natürlich nicht '_' schreiben  -> "_"


----------



## boss3D (20. Juli 2014)

Also ich hab's jetzt noch so ...
	
	



```
echo '  <td><input type="text" name="'$ts.'"_"'.$a'" maxlength="6" size="4"></td>';
```
... und so ...
	
	



```
echo '  <td><input type="text" name="'$ts."_".$a'" maxlength="6" size="4"></td>';
```
... probiert, aber der Error bleibt.


----------



## DarkMo (20. Juli 2014)

name="'  ach ne, ich bin ja doof ^^ du hast ja doch ' verwendet, wart mal...
echo '  <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';

so >< also du hast den punktoperator vor ts und nach a nur vergessen gehabt. die ' hatten gestimmt ^^


----------



## boss3D (20. Juli 2014)

Okay, also auch mit dem "session_regenerate_id();" landen wir immer noch sofort bei _projektzeiterfassung.php_, wenn wir _index.php_ aufrufen. Der erreicht einfach _login.php_ nie ...


----------



## DarkMo (20. Juli 2014)

ah ok, regenerate id baut nur ne neue session id. hmm. also unser prob ist atm, dass wir dauerhaft eingeloggt sind ^^ dann müssen wir wohl etwas schärfer rangehn *hm* ich hatte damals bei mir noch nen "auto-logout" drin gehabt. also nach 5 mins nix tun wurde man automatisch rausgeworfen. dazu hatte mein user ne spalte pff last_on oder so. da wurde halt die zeit des letzten seitenaufrufs gespeichert für den kerl. bevor man dann die seite baut, hatte ich dann eben die jetzige zeit mit der gespeicherten verglichen. war das zeitlimit nicht überschritten, wurde die zeit geupdated, andernfalls wurde er ausgeloggt. das war so das grundprinzip davon.

ich schau erstmal fix, ob ich das ausloggen noch find ^^

```
function logout() {
       $_SESSION = array();
       if (isset($_COOKIE[session_name()])) {
         setcookie(session_name(), '', time()-42000, '/');
       }
       session_destroy();
       return true;
     }
```
oha, wie du siehst, hatte ich da noch mit cookies gewerkelt ^^ also ich denke, das wichtigste ist das destroy und das leeren des arrays (kA ob nötig). ich würd jetzt erstmal ganz stumpf das session destroy ganz oben mit reinschreiben (nach session start? mal probieren). dann biste erstmal auf die harte tour wieder drausen ^^

jetzt kannste dich entscheiden, ob du einen autologin nach zeit mit drin haben magst, oder ob du einfach erstmal nen logout button baust. dessen behandlung würde ich ans ende der formular.php hauen - sicher is sicher ^^ benannte 2 zeilen wären dann mMn alles, was der knopfdruck auslöst (und login = false, aber das nutzt du ja nicht mehr  ).


----------



## boss3D (20. Juli 2014)

Hallelujah ... während du überlegt und gepostet hast, habe ich die _login.php_ wieder in zwei Teile zerlegt: _login.php_ und _registrieren.php_. Jetzt, mit deinem "session_destroy();", landet er bei Aufruf von _index.php_ immer sofort auf _registrieren.php_. Diese führt nach einer Registrierung zwar korrekt zur neuen kurzen _login.php_, aber dieser macht nach einem Login nichts mehr, außer sich selbst neu zu laden. 

Da habe ich mir jetzt wohl ein paar Verweise von einem File zum anderen zerschossen?!

index.php



Spoiler





```
<?php
    include('config.php');
    
    include('formular.php');
    
    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnReg'])) {
            include('registrieren.php');
        } else {
            include('login.php');
        }
    } else {
        if (isset($_POST['auswerten'])) {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin'])) { 
            include('auswerten2.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }    
?>
```



config.php



Spoiler





```
<?php
    session_start();
    session_destroy();
    
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $user = "";
    $userid = 0;   
    $rechte = -1;   

    if (isset($_SESSION['name'])) {
      $user = $_SESSION['name'];
      $userid = $_SESSION['id'];
      $rechte = $_SESSION['rechte'];
    }
        
    $verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");
?>
```



login.php



Spoiler





```
<?php    
    $verbindung = mysql_connect('localhost', 'root', 'root') or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db('projektzeiterfassung') or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="index.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';  
    echo '<table><th>Login</th></table>';
    echo '<p>Ihr Username:</p>
            <input type="text" size="24" maxlength="50" name="username"><br>';
    echo '<p>Ihr Passwort:</p>
           <input type="password" size="24" maxlength="50" name="password"><br><br>';
    echo '    <input type="submit" name="btnLog" value="Einloggen"><br><br>
            <input type="submit" name="btnReg" value="Registrieren">';
    echo '</form></div><br>';
    
    if (isset($_POST['btnLog'])) {    
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
        } else {            
            echo '<br><div class="submit">Benutzername und/oder Passwort waren falsch oder nicht registriert.<br><br></div>';
        }
    }
    
    echo '</body>
        </html>';
?>
```



registrieren.php



Spoiler





```
<?php
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="login.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    
    if (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
    }
    
    echo '</body>
        </html>';    
?>
```



Übrigens kriege ich, wenn ich Verbindungsaufbau und Session Start nur in der _config.php_ habe, die ganze Zeit dieses nervige Zeugs:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ich muss den Verbindungsaufbau zumindest auch in _login.php_ drinnen haben?!

[EDIT]
Firefox-Reload offenbart auch immer wieder neue Zustände ...

Aktueller Zustand (mit den Codes aus diesem Posting):
_index.php_ aufrufen --> landet korrekt auf _login.php_ --> will man sich einloggen, lädt sich _login.php_ nur neu aber es passiert nichts / klickt man auf "Registrieren" --> _registrieren.php_, aber Eingaben landen nicht in DB

^^ Irgendwie kommt mir der _registrieren.php_ Code gerade "komisch" vor?! Da fehlt doch was?! Die beiden Passwörter verlange ich vom User, aber dann passiert nichts mehr damit?!
Seh's gerade: Der hat ja auch kein INSERT. Klar, dass da nichts passieren wird.

[EDIT2]
Jetzt habe ich diesen vollständig aussehenden_ registrieren.php_ Code, aber der führt da rein:


Spoiler





```
<?php
    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
    
    echo '<!doctype html>';
    echo '<html><head><meta charset="ISO-8859-1">';
    echo '<link rel="stylesheet" type="text/css" href="style.css">';
    echo '<title>Projektzeiterfassung</title></head><body>';
    echo '<br><div class="submit"><form action="index.php" method="post">';
    echo '<br><h1>Projektzeiterfassung</h1>';
    
    if (isset($_POST['btnReg'])) {
        echo '<table><th>Registrierung</th></table>
                <p>Bitte geben Sie einen Usernamen ein:</p>
                    <input type="text" size="24" maxlength="50" name="username"><br>
                <p>Bitte geben Sie ein Passwort ein:</p>
                    <input type="password" size="24" maxlength="50" name="passwort"><br>
                <p>Passwort wiederholen:</p>
                    <input type="password" size="24" maxlength="50" name="passwort2"><br><br>
                <input type="submit" name="btnReg" value="Registrieren">
            </form></div>';
        $username = $_POST['username'];
        if (isset($_POST["passwort"]) and $_POST["passwort"] != "" and isset($_POST["passwort2"]) and $_POST["passwort2"] != "") {    
            $passwort = $_POST['passwort'];
            $passwort2 = $_POST['passwort2'];
            if ($passwort != $passwort2 or $username == "" or $passwort == "") {    
                echo '<br><div class="submit"><form action="index.php">Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br><br><input type="submit" value="Zurück"></form></div>';
                exit;
            } else {
                $passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $id = mysql_query("SELECT * FROM user WHERE name='".$username."'");

                if (mysql_num_rows($id)) {
                    echo '<br><div class="submit">Benutzername schon vorhanden.<br><br></div>';
                } else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen == true) {                
                         echo '<br><div class="submit"><form  action="index.php">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';  
                    } else {        
                         echo '<br><div class="submit"><form  action="index.php">Fehler beim Speichern des  Benutzernamens.<br><br><input type="submit"  value="Zurück"></form></div>';
                    }
                }
            }
        }
    }
    
    echo '</body>
        </html>';    
?>
```






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT3]
Ich dreh durch! Das Aufsplitten der _login.php_ hat mir jetzt scheinbar alles zerlegt! Alle Buttons in sämtlichen Files machen nur noch irgendwas! Die Pfeilbuttons in _projektzeiterfassung.php_ führen jetzt plötzlich zur Login-Seite!


----------



## DarkMo (20. Juli 2014)

ja, das war ja jetz erstmal nur die holzhammer notlösungs methode ^^

jetzt sollten wir das ganze noch ebbes hübsch verpacken. den ganzen html code (also seiten start bis body und seiten ende ab /body) würd ich im übrigen aus den einzel files raushalten. hatte mir da auch schon was überlegt:
grundsätzliche strukturierung der ganzen geschichte:
- config.php erstellt 2 neue variablen: $protokoll und $site_title *vorschlag* ( und setzt sie auf leer = ''
- formular.php greift ggf auf beide zu und ändert die. sinn ist es, dass die formular.php selbst noch KEINE ausgabe erzeugt, diese aber szs vorbereitet.
- in der index.php nach dem include von formular.php käme dann dein html zeugs hin. um index.php sauber zu halten, kannstes ja wieder auslagern. meinetwegen include('html_header.php'); oder so.
- als letzte zeile in der index.php käme dann der seitenabschluss. wenn wir dem auslagern treu bleiben wollen, dann zum bsp include('html_footer.php');

der inhalt der files wäre dann in etwa dieses hier (wenn du meine namensvorchläge verwendest):
html_header:

```
echo '<!doctype html>';
    echo '<html>';
    echo '  <head>';
    if($site_title == '') echo '    <title>Projektzeiterfassung</title>';
    else echo '    <title>Projektzeiterfassung - '.$site_title.'</title>';
    echo '    <meta charset="ISO-8859-1">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '  </head>';
    echo '  <body>';
    echo '    <div class="submit">';
    echo '      <form action="login.php" method="post">';
    if($protokoll != '') echo '        <p>'.$protokoll.'</p><br><hr>'; // kann man ja ggf noch schön mit css gestalten ^^
    echo '        <h1>'.$site_title.'</h1>';
```

html_footer beendet all das nun:

```
echo '      </form>';
    echo '    </div>';
    echo '  </body>';
    echo '</html>';
```
jut, was das soll, ist schon angedeudet. der header baut alles, was wir immer anzeigen. den seiten titel können wir also ggf in formular.php anpassen. zum bsp wenn btnRegForm gedrückt wurde, wird $site_title = "Registrierung"; gesetzt und schwupps ist der titel und die überschrift angepasst. wurden irgendwelche fehler erzeugt oder man will ne bestätigungsnachricht ausgeben, macht man bspw dann halt $protokoll.="Es wurden x Einträge in die DB gespeichert.<br>"; oder so. dann wird das ganz oben ausgegeben.

so, der footer ist dann für das abschließen all unseres krempels ausm header wieder zuständig. UND wir können hier lustig erweitern, sofern wir irgendwelchen krempel hinzufügen wollen, der IMMER am ende ausgegeben werden soll. zum bsp nen logout button ;P das könnte dann meinetwegen so aussehen:
abgeänderte html_footer:

```
if(isset($_SESSION['name'])) echo '        <input type="submit" name="logout" value="Ausloggen">';
    echo '      </form>';
    echo '    </div>';
    echo '  </body>';
    echo '</html>';
```
nun haben wir also (im eingeloggten status) immer einen logout button mit dem formschönen namen logout. in der formular.php behandeln wir ihn (ich würde wie gesagt empfehlen, den als letztes zu behandeln) dann in etwa so:
formular.php:

```
<?php
    // ...
    if(isset($_POST['logout'])) {
      $_SESSION = array(); // session-array löschen (durch neu anlegen szs)
      session_destroy();
    }
?>
```
als letzten schritt müsste dann natürlich das session destroy aus der config raus.


----------



## boss3D (20. Juli 2014)

Jetzt ist alles hinüber, ich kenne mich gar nicht mehr aus ...


----------



## BenRo (20. Juli 2014)

Ich hab mich jetzt nicht durch die 43 Seiten gearbeitet, aber einfach mal in das Zip reingeschaut, ein paar erste Anmerkungen auf den ersten Blick hin:
- Die SQL-Queries sind offen für SQL-Injections (im Zweifelsfall den Begriff googeln). Man muss entweder mit mysql_real_escape_string/mysql_escape_string oder prepared queries oder irgendeiner anderer Form von Escaping arbeiten. Sonst kann das jedes Script Kiddie "hacken" und die Datenbank leeren. 
- Genau so schlimm: Usereingaben einfach so im HTML-Code ausgeben! Sicher wirds mit einem htmlspecialchars() drum rum (z. B. bei den '.$username.' wurde erstellt, sollte besser '.htmlspecialchars($username).' wurde erstellt' sein
- mysql_query und Konsorten sind veraltet, man sollte mysqli_query oder (besser) PDOs verwenden, siehe auch PHP-Dokumentation. Die Funktionen werden in Zukunft entfernt werden - d. h. in neuen PHP-Versionen wird es einfach aufhören zu funktionieren
- meta-tags, insbesondere charset sollte vor dem title-tag stehen
- Muss es unbedingt ISO-8859-1 (und latin1 in der Datenbank) sein? Spricht etwas gegen UTF-8? Wie gesagt, habe mir die 43 Seiten hier nicht durchgelesen. Aber ich mag UTF-8. 
- Das hier ist illegal: <input type="submit" value="<<" name="prevWeek" class="switch" - permanent werden unnötigerweise entities encodiert (z. B. ü), aber hier nicht?!? value muss natürlich "<<" lauten (oder einen Text wie "vorherige Woche" verwenden), das gleiche bei dem Button für die nächste Woche
- Ich finde Inline CSS bäh und würde das in eine externe Datei auslagern; das width-attribut von Tabellenspalten ist ja noch mehr Bäh, das kann erst Recht CSS sein
- Wozu um aller Welt wird hier ein leerer String per Concat angefügt: "montag".$a."" - das gleiche täte "montag".$a (genau so mit allen anderen Tagen)
- Verstehe nicht, warum der HTML-Code per PHP ausgegeben wird (z. B. in login.php), ist doch völlig unnötig
- "Ihr Username" und "Ihr Passwort" sollten ggf. mit label-Tags umschlossen sein, damit diese Labels den jeweiligen Formularfeldern zugeordnet werden können
- Mehrere <br>s hintereinander, die keinen semantischen Wert haben, sondern einfach nur Abstand erzeugen sollen, finde ich persönlich furchtbar, wozu gibts denn CSS?
- Die schließenden ?> am Ende der Dateien können jeweils weggelassen werden - ist auch sinnvoll, da ja hier teilweise mit Session Cookies gearbeitet wird. Ein versehentliches Leerzeichen nach dem ?> in config.php könnte zum Beispiel einen Fehler verursachen
- Die Idee von DarkMo header und footer auszulagern ist gut
- Ein paar Kommentare würden helfen. Wenn du den Code fertig stellst und in einem halben Jahr ist ne Änderung fällig musst du dich dann nicht wieder stundenlang einarbeiten

Folgendes ist mir dann aufgefallen, als ichs mal testweise auf meinen Server geschoben. Stell zum Testen bei dir auf jeden Fall ein, dass auch PHP Notices angezeigt werden. Dadurch fällt z. B. auf, dass
- $salt nie gesetzt wird - dadurch ist ein Salting natürlich sinnlos.
- $beschreibung nie gesetzt wird - soll vermutlich $_POST['beschreibung'.$a] sein
- ich würde allgemein empfehlen: Nenn die Formularfelder NICHT beschreibung1, beschreibung2, usw. sondern einfach beschreibung[] - Das macht alles so viel einfacher und übersichtlicher!

Nochwas, was kein Fehler per se ist, aber sehr irritierend: Unter dem Loginformular ist ja ein Button "Registrieren", also nahm ich an, um mich zu registrieren könnte ich meinen Benutzernamen und mein Passwort eingeben und dann jenen Button klicken. Keines Wegs, der Button führt erst zum Registrierungsformular, noch nichtmal mein eingegebener Benutzername wird in jenes übernommen.


----------



## BenRo (20. Juli 2014)

EDIT: Kann gelöscht werden, war doppelt, sorry.


----------



## DarkMo (20. Juli 2014)

ok, ich schreib mal der reihe nach auf, was ich gemacht hab:

```
- die beiden neuen dateien html_header.php und html_footer.php erstellt (inhalt wie oben)
- beide wie erwähnt in index.php eingepflegt

- config.php:
  - die kalender variablen (defaults) dort mit angelegt
  - wie gesagt die beiden neuen variablen angelegt
  - deine $add variable mit 1 initialisiert

- formular.php:
  - die [echo ]'s in [$protokoll .= ]'s verwandelt ^^
  - behandlung der registrieren form: erm, der button lautet doch btnReg und nicht registrieren? habs mal angepasst
  - gleich die nächste zeile (check, ob die eingaben ok sind) aufpoliert - du checkst btw nicht den usernamen -> ergänzt
  - oha, beim check, ob die paswörter übereinstimmen (eingabe und bestätigung) fragst du plötzlich den usernamen ab und prüfst NOCHMAL, ob pw leer war ^^ -> gestutzt
  - die protokollmeldung angepasst (hier ist das bestätigungs pw falsch, es geht NICHT um ne falsch ausgefüllte form ^^)
  - die meldung über den eingabefehler an der korrekten stelle eingebaut
  - $id in $check umbenannt - finde ich sinnvoller (und variablen namen sollten stets aussagekräftig sein)
  - diverse forms entfernt ;) das zerhaut dir nur wieder alles
  - die kalender-buttons usw mit aufgenommen
  - die add/rem buttons hier mit aufgenommen
    -> auch gleich in der funktion angepasst (addLine und remLine als auslöse-ereignisse...)
  - logout button behandlung hinzugefügt

- login.php:
  - auf die tabelle itself zurechtgestutzt (den rest haben wir ja nun in header und footer drin)
  - fehlendes </table> ergänzt ;P erm, ok. du baust das irgendwie ganz anders oO
  - gut, also: erstmal ne ordentliche nutzbringende tabelle gebaut (deine war a) fehlerhaft (kein tr tag) und b) sinnfrei ^^ - ne tabelle mit einer zelle? ><)
  - den button, der die registrier form aufruft umbenannt -> btnRegForm

- registrieren.php:
  - im endeffekt das selbe. btw hattest du bei login password als name und bei reggen passwort (d - t) - hattest du das dann überhaupt richtig abgefragt? nachher mal schauen :P
  - auch hier passworD verwendet als name
  - nen abbrechen button gebaut (sollte eigentlich zurück zu login führen, der name is eigentlich irrelevant)

- projektzeiterfassung.php:
  - die kalender variablen (defaults) hier entfernt
  - die kalender buttons usw rausgeschmissen
  - add remove buttons geschmissen
  -> formular.php ;)
  - auch hier wieder den header/footer krams geschmissen
  - scheiss die wand an, was haste denn hier für verrückte button konstruktionen drin? oO hab die mal umgebaut
    -> zeile hinzufügen von button zu input geändert, name addLine
    -> zeile löschen von button zu input geändert, name remLine

- auswerten.php:
  - auch wieder den kalender krams rausgeworfen
  - header/footer raus
  - wieder unnötige forms raus
    -> das mit dem export habsch erstmal unberührt gelassen

- auswerten2.php
  - auch wieder den config krams rausgeworfen (session start, db verbindung, kalender)
  - rest eigentlich wie bei auswerten.php
```
joa, hab jetzt an und für sich nich sehr viel am eigentlichen code (darstellung der tabellen mit den daten/inputs unverändert) geändert, hab mich eher erstmal um die grundstruktur gekümmert. also dass die buttons die richtigen namen haben, dass sie ordentlich angesprochen werden, dass alles dort behandelt wird, wo es sinn macht (aufgeräumter code usw)... schaus dir mal an (anhang). die änderungen hab ich ja komplett aufgeschrieben  kannst ja mal schauen, ob es überhaupt funzt (sicher dir dein zeugs auf jeden fall!) und kannst dann ja die änderungen mal schritt für schritt durchgehen.


----------



## DarkMo (20. Juli 2014)

@Ben: größtenteils bekannt und bereits erwähnt. aber wir kämpfen gerade noch mit dem grundlegenden aufbau ^^ das value="<<" war auf meinem mist gewachsen ^^ hätt ich aber auch drauf kommen können ehrlich gesagt ><

jedenfalls kommt die "schönheits kur" am ende mal irgendwann. bisher is alles noch im dev mode szs und es soll überhaupt erstmal laufen. und er wird sicher nich seine eigene db hacken  und dafür ist der code gut genug und es verwirrt nicht zusätzlich. natürlich am ende nochmal mit aufwand verbunden, das is klar.



edit: habs doch nochmal kurz getestet, mein lieber scholli. session_start muss wirklich gaaaaaanz am anfang kommen, da darf nichmal nen include befehl stehn... bis ich auf die idee kam. nu funzt es aber. hab noch paar fehler ausgemerzt (fehlende ; oder nen { zuviel ^^) und paar logiklücken geschlossen (seitentitel ordentlich anzeigen) und auch das << gefixt


----------



## boss3D (21. Juli 2014)

@ DarkMo
Ich habe mir deine aktuellste Version mal angeschaut, aber da geht auch vieles nicht ...

- _index.php_ führt sofort zu _projektzeiterfassung.php_
- beide Buttons in _login.php_ machen nichts
- beide Buttons in _registrieren.php_ machen nichts
- _projektzeiterfassung.php_ liefert das hier:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



- _auswerten.php_ liefert das hier:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        


--------------

Mein Code wäre ja gestern Abend noch schön gelaufen ... bis ich eben die _login.php_ wieder in zwei Teile aufgesplittet habe. Danach ging plötzlich gar nichts mehr. 

Jedenfalls werden wir alt, wenn wir in deinem Code jetzt die zig Fehler suchen gehen. Ich schaue, dass ich meinen wieder auf den Stand bringen kann, als Login und Registrieren noch ein File waren. Dann hätten wir nämlich vorerst nur den einen Fehler, dass _index.php_ zuerst zu _projektzeiterfassung.php_ führt.

BTW, wegen dem ganzen Sicherheitszeug, das immer wieder erwähnt wird: Es erhalten genau 15 Leute aus dieser Abteilung hier Zugriff drauf und keiner davon sollte Interesse daran haben, irgendwas zu hacken. Es sind ziemlich belanglose Daten und die bisherigen Excel Tabellen waren auch für jeden einsehbar.

[EDIT]
Also ich bin jetzt wieder auf Stand #421.

Damit müsste ich es jetzt erstmal schaffen, dass beim Registrieren Daten in der DB landen, _index.php_ zur _login.php_ führt, und diese dann weiter zu _projektzeiterfassung.php_, anstatt sich selbst neu aufzurufen.

[EDIT2]
Es ist wirklich alles nur noch verpfuscht. Deinen Code habe ich noch weiter getestet und festgestellt, dass wirklich absolut gar nichts damit (korrekt) funktioniert, außer Zeile hinzufügen und Zeile löschen. Mein eigener hat aber auch so viele Fehler, dass ich gar nicht mehr weiß, wo ich noch ansetzen soll. 

Ich habe jetzt diesen alten Code hier von vor einigen Seiten ausgegraben. Der kommt von allen Versuchen noch am ehesten dahin, was ich haben will: 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Der Code hat "nur" noch folgende Probleme:
1) _index.php_ ruft sofort _projektzeiterfassung.php_ auf und nicht _login.php_
2) Keine Ausgabe von Daten in _auswerten.php_ und _auswerten2.php_, aber da wissen wir ja mittlerweile, dass es am query scheitert. Da muss ich nochmal schauen, wie das mit dem läuft, das du ein paar Seiten später zusammengebastelt hast.

*Kann mir bitte wer helfen, einfach "nur" genau DIESE 2 DINGE zu richten?*


----------



## BenRo (21. Juli 2014)

DarkMo schrieb:


> und er wird sicher nich seine eigene db hacken



Drei Gründe das trotzdem jetzt schon richtig zu machen:
1. Jemand anderes schafft es, sich Zugang auf die Seite zu verschaffen und hat böse Absichten. Dieser Person muss man es ja nicht unnötig leicht machen
2. Er möchte einen Usernamen für Bobby Tables anlegen (oder macht versehentlich etwas kaputt)
3. Er vergisst irgendwann, dass dieses Problem besteht, verwendet den Code in irgendeinem öffentlichen Projekt (oder macht dieses hier öffentlich) und dann passierts halt



> edit: habs doch nochmal kurz getestet, mein lieber scholli. session_start muss wirklich gaaaaaanz am anfang kommen, da darf nichmal nen include befehl stehn...



Das Session Cookie muss im Response header gesetzt werden, also darf der Response Content nicht geschrieben werden, bevor die Session gestartet wird. Auch Leerzeichen sind Zeichen. Könnte wie gesagt mit den ?> zusammenhängen. Oder mit PHP-Fehlermeldungen.

EDIT: Den Query reparieren ist nicht schwierig. z.user muss u.name heißen (würde das zwar über die User-Id machen, aber gut). z.projekt muss z.taetprodid heißen. Dann kommt zumindest keine Fehlermeldung mehr. Es wird dennoch nichts ausgegeben, weil das Datum nie korrekt in die Datenbank geschrieben wird, siehe hier:

```
$eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit) VALUES ('$userid', '$taetprodid', '$dauer')");
```
Da fehlt das datum einfach.

Die Formularfelder für die Zeitangabe heißen außerdem völlig anders, als das, was dann später geprüft wird (die Felder heißen sowas wie 1405936800_1, in formular.php wird aber nach Feldern namens montag1 etc. gesucht.)

Nach wie vor Fehlerhaft ist auch das Eintragen der Beschreibung:

```
$eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '$beschreibung', '$erstellt')");
```
muss heißen

```
$eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt')");
```

Noch eine Kleinigkeit: Das Datumsformat von $erstellt passt nicht ganz, da steht

```
$erstellt = date('Y-m-d-h-i-s');
```
das sollte besser

```
$erstellt = date('Y-m-d H:i:s');
```
sein. Wichtig ist das große H, damit es im 24h-Format gespeichert wird.


----------



## boss3D (21. Juli 2014)

^^ Ich sitze eh gerade am Query-reparieren ... Vielen Dank, ich denke, das wird schonmal weiterhelfen. Was ich bis heute nicht verstanden habe, ist, wie ich denn nun wirklich 1405936800_x in die DB kriegen soll. Bei mir wird nach wie vor nur z. B. 2303 eingetragen. Aber vielleicht komme ich noch selber drauf. DarkMo hätte es ja schon erklärt gehabt. Allerdings müsste ich für seine Version wieder Code in meinen nun endlich funktionierenden einbauen, bei dem ich mir sicher bin, dass danach wieder nichts mehr geht?! Da bin ich mittlerweile sehr vorsichtig geworden.

Wie gesagt: Lieber ein funktionierendes "Chaos" (das ich aber verstehe), als die "perfekte" Struktur, die aber hinten und vorne gar nicht funktioniert (wie DarkMo's Code, als ich den getestet habe).

[EDIT]
Bis auf u.name hätte ich eh schon alles richtig gehabt:
	
	



```
$db_erg = mysql_query("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;");
```
Das datum ist in meiner aktuellen Version auch längst (wieder) da:
	
	



```
for ($b = 0; $b < 7; $b++) {
    if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
        $dauer = $_POST[$stunden[$b]];
        $tag = $_POST[$data[$b]];                                
        $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
    }        
}
```


----------



## BenRo (21. Juli 2014)

$_POST enthält alle Daten die per HTTP-POST (also dein Formular) gesendet werden. Die Schlüssel des Post-Arrays also das was hier zwischen den Anführungszeichen steht:

```
$_POST['lustigerschluessel']
```
enstprechen den Namen deiner Formularfelder

```
<input type="text" name="lustigerschluessel">
```

Du hast ja schon eine for-Struktur. Damit kannst du 1,2,3,4... ja durchgehen. Per Concat (Der .-Operator) wird diese Ziffer in einer Schleife angehängt:

```
for($i=1;$i<=$maximalerWert;$i++) { $key = '1405936800_'.$i; }
```
Key enthält nun in diesem Beispiel nacheinander 1405936800_1, 1405936800_2, 1405936800_3, usw....

Das was ich hier $maximalerWert nenne, heißt in deiner Datei $add

Soweit alles klar?

Es wird alles etwas einfacher, wenn du nicht 1405936800_1 sondern 1405936800[] verwendest, d. H. so:

```
<input type="text" name="1405936800[]">
```

PHP macht dann aus allen Einträgen automatisch einen Array, sodass du anstatt for das in diesem Fall praktischere foreach benutzen kannst:

```
foreach($_POST['1405936800'] as $value) {
  // $value enthält nun die Dauer
}
```

Das Formularfeld 1405936800 zu nennen, halte ich persönlich für extrem verwirrend und würde da DarkMos-Empfehlung folgen, es montag zu nennen.

Bzw. wenn das ganze montag, dienstag, usw. heißt:

```
<input type="text" name="montag[]">

foreach($_POST['montag'] as $value) {
  // $value enthält jeweils die Dauer
}
```

Wie foreach funktioniert findest du in der PHP-Dokumentation. Ggf. wird es wichtig, dass die numerischen Keys bei 0 beginnen.

Hoffe das hilft erstmal weiter


----------



## boss3D (21. Juli 2014)

Das was du hier (be)schreibst, steckt irgendwo in DarkMo's Code drinnen (du hast dir wahrscheinlich irgendeine Version von gestern Abend angeschaut?!), den ich aber weder verwenden kann, noch 100 %ig verstehe.

In MEINEM Code, mit dem ich hier arbeite, gibt's kein "key" und auch diese Zahl nicht, und ich wüsste auch beim besten Willen nicht, wo ich das reinbasteln sollte. 

So schaut's bei mir gerade aus:
projektzeiterfassung.php



Spoiler





```
<?php        
    $verbindung = mysql_connect('localhost', 'root', 'root') or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db('projektzeiterfassung') or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name']; 
    $rechte = $_SESSION['rechte'];

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="index.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 <input name="mo" type="text" size="10" maxlength="10"></th>
                <th width="150">DI <input name="di" type="text" size="10" maxlength="10"></th>
                <th width="150">MI <input name="mi" type="text" size="10" maxlength="10"></th>
                <th width="150">DO <input name="do" type="text" size="10" maxlength="10"></th>
                <th width="150">FR <input name="fr" type="text" size="10" maxlength="10"></th>
                <th width="150">SA <input name="sa" type="text" size="10" maxlength="10"></th>
                <th width="150">SO <input name="so" type="text" size="10" maxlength="10"></th>
            </tr>';
    
    $taetigkeiten = array();
    $sql_t = "SELECT * FROM taetigkeiten;";
    $res_t = mysql_query($sql_t) or die ("Get Taetigkeiten failed.<br>".mysql_error());
    if (mysql_num_rows($res_t))
        while ($row_t = mysql_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

    $products = array();
    $sql_p = "SELECT * FROM produkte;";
    $res_p = mysql_query($sql_p) or die ("Get Produkte failed.<br>".mysql_error());
    if (mysql_num_rows($res_p))
        while ($row_p = mysql_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
      
    if( isset($_GET['add'])) {
        $add = $_GET['add']; 
        $add++;
    } elseif (!isset($_GET['rem'])) {
        $add = 1;
    }
    if ( isset($_GET['rem'])) { 
        $add = $_GET['rem']; 
        $add--;
    }
    
    /*
    if (isset($_POST('Einträge editieren'))) {
        include('vorbeleg.php');
    } else {
    */
    
    for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
        }
        echo '</select></td>';

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

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

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

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

    echo '<div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div>';
    echo '</form>';
    
    echo '<div class="submit"><br><br><br><form action="auswerten.php"><input type="submit" value="Bisherige Einträge in Datenbank anzeigen"> Eigene Einträge anzeigen ...</form>';
    if ($rechte == 0) {
        echo '<br><form action="auswerten2.php"><input type="submit" value="Einträge für folgenden Mitarbeiter anzeigen"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"></form></div>';
    } else {
        echo '</div>';
    }
    
    echo '</body>';
    echo '</html>';
```



formular.php



Spoiler





```
<?php      
    $user = $_SESSION['name'];
    $userid = $_SESSION['id'];
        
    $erstellt = date('Y-m-d H:i:s');    
    $add = $_POST['add'];

    for ($a = 1; $a <= $add; $a++) {
        $stunden = array("montag".$a."", "dienstag".$a."",  "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."",  "sonntag".$a."");   
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
        $beschreibung = $_POST['beschreibung'.$a.'']; 
        
        $eintragen1 = mysql_query("INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt')");   
        $taetprodid = mysql_insert_id();
        
        for ($b = 0; $b < 7; $b++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "" and isset($_POST[$data[$b]]) and $_POST[$data[$b]] != "") {        
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysql_query("INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }        
        }        
    }
```



auswerten.php



Spoiler





```
<?php
    session_start();
    
    $verbindung = mysql_connect('localhost', 'root', 'root') or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db('projektzeiterfassung') or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);

    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;
    }
    
    $user = $_SESSION['name'];
    $userid = $_SESSION['id'];    

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);
    
    // in DB müssen lange Zahlen gespeichert werden! Nicht nur z. B. 2303!
    $db_erg = mysql_query("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: '.mysql_error());
    }

    echo '<!doctype html>
            <html>
            <head>
            <meta charset="ISO-8859-1">
            <link rel="stylesheet" type="text/css" href="style.css">
            <title>Projektzeiterfassung</title>
            </head> 
            <body>
            <form action="auswerten.php" method="post">';
    echo '    <link rel="stylesheet" type="text/css" href="style.css">';
    echo '    <br><h1>Projektzeiterfassung: '.$user.'</h1>';
    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 (mysql_num_rows($db_erg)) {
        while ($row = mysql_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['t.id']])) {
                $row_collector[$row['t.id']] = array();
                $row_collector[$row['t.id']]['taet'] = $row['taetigkeit'];
                $row_collector[$row['t.id']]['data'] = array();
            }
            if (!isset($row_collector[$row['t.id']]['data'][$row['p.id']])) {
                $row_collector[$row['t.id']]['data'][$row['p.id']] = array();
                $row_collector[$row['t.id']]['data'][$row['p.id']]['prod'] = $row['produkt'];
                $row_collector[$row['t.id']]['data'][$row['p.id']]['desc'] = $row['beschreibung'];
                $row_collector[$row['t.id']]['data'][$row['p.id']]['user'] = $row['user'];
                $row_collector[$row['t.id']]['data'][$row['p.id']]['time'] = array();
            }
            $row_collector[$row['t.id']]['data'][$row['p.id']]['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></form>';

    echo '<br><div class="submit"><form><input type="button" value="Einträge editieren" onClick="history.go(-1);return true;"> Zurück zur Eingabe ...</form></div><br>';
    echo '<form action="export.php" method="post" name="export_excel"><div class="submit"><div class="controls"><button type="submit" id="export" name="export" class="btn btn-primary button-loading" data-loading-text="Loading...">Exportiere MySQL Daten zu Excel File</button></div></div></form>';
```


----------



## BenRo (21. Juli 2014)

Verstehe, hatte anderen Code vor Augen. Kannst du mir deinen nochmal zippen und hier reinstellen. Dann schau ich mir das nochmal an.


----------



## boss3D (21. Juli 2014)

Ja, du hast vermutlich den gesehen, den DarkMo und ich übers WE gebastelt hatten. Da ging's im Prinzip drum, mein "Chaos" so umzuschreiben und aufzuteilen, dass es seinem System mit "einem Code über mehrer Files" entspricht. Aber mein Code war bereits viel zu komplex dafür. Ab dem Moment, wo ich dann meine login.php aufgesplittet hatte, ging dann gar nichts mehr, weil's alle Referenzen zerschossen hatte ... 

Deswegen habe ich mir heute Früh einen "alten" aber weitestgehend funktionierenden Code von mir von vor einigen Seiten hier zusammengesucht, den jetzt aber trotzdem mit allen Tipps von DarkMo und dir optimiert (lediglich das mit salt habe ich noch nicht verstanden, aber lassen wir das vorerst). Damit sollte es ein halbwegs "sauberer" Code sein, aber eben nach meinem "System". 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



PS: Die _vorbelegt.php_ bitte vorerst vergessen, auch wenn du schon erahnen kannst, was ich da vor habe. Aber das ist noch nicht fertig implementiert und erstmal nur ein grobes Konstrukt.


----------



## BenRo (21. Juli 2014)

Lass dir die PHP Notices anzeigen (siehe error_reporting). Dann siehst du z. B. das in projektzeiterfassung.php die Session nicht gesetzt ist, weil das session_start fehlt. session_start() darf auch nicht zweimal aufgerufen werden 

Es gibt diverse kleine Fehlerchen (z. B. das maxlength="5"" in projektzeiterfassung.php), aber im großen und ganzen funktionierts, wenn die sessions funktionieren.

Mir ist unklar, wozu die Formularfelder im Tabellenkopf sind.


----------



## DarkMo (21. Juli 2014)

nurmal als ganz bescheuerte frage: WAS hast du denn bei dir laufen? oO bei mir läuft der code fehlerfrei >< vorallem unreferenzierte variable? sowas kennt php doch garnich xD is doch so ein punkt, wo sich alle drüber aufregen *dacht* in anderen sprachen musste explizit int variable; sagen, damit die variable bekannt ist (bei php kann man glaube - wegen der typlosigkeit - var $variable sagen, aber ich hab das NIE gebraucht oO). oder hat sich da seit php 5. irgendwas was geändert diesbezüglich? ich hab bei mir ääh - wo find ich das raus xD aha version 5.3.0

wie gesagt, ich hab keine ahnung, wo bei dir irgendwelches fehler herkommen. bei mir funzt das absolut flutschig, habs doch extra nochma getestet gehabt. und wie gesagt, an den eigentlichen geschichten hab ich nix gedreht (ordentliche anfragen, ordentliche abarbeitung der formulardaten, ordentliche aufbereitung in tabellenform...).


und wegen dem session_start, was ich in index php direkt als allererstes schreiben musste:
er hat am php von config.php gemosert, dass DAS nen header setzt oO da war kein leerzeichen oder irgendwas. einfach ein <? statt <?php hat (wie erwartet) nich gefunzt - da hat er das ganze file ignoriert. die php tags (<?php und ?>) wegzulassen endete in ner simplen ausgabe meines textes als html >< und nur das platzieren vor include config hphp brachte abhilfe oO


aber wie gesagt, wieso der code bei dir ned funzt is mir unbegreiflich.



edit: wenn ich mir deine fehlerchens so anschaue: fehlt da die config.php? er hat keine db verbindung, die ganzen variablen fehlen (obwohl das php mMn noch nie gestört hatte - was fehlt wurde einfach angelegt >< das war ja das geile an dem stück code ^^).


edit2:
http://php.net/manual/de/language.variables.scope.php
http://www.php.de/php-tipps-2010/72227-erledigt-php-notice-undefined-variable.html

sowas hab ich jetz alles mal gelesen - das MUSS gehn >< kA was du gemacht hast. der erste link sagt, dass es so funzt, wie ich sagte. der 2. zeigt nen bsp auf, wo sowas auftritt. in dem konkreten fall von wochenanfang, wochenende und kw aus deinem ersten bild ist das auch NICHT gegeben. sie haben explizit einen default wert bekommen. wie gesagt, es deuted irgendwie alles darauf hin, dass du irgendwas mit der config.php gemacht hast, dass die nicht aufgerufen/gefunden/what ever wird. darauf deuted allein schon die fehlende sql verbindung hin. es gibt keinen grund, wieso das nich funzen sollte *haare rauf*


----------



## boss3D (21. Juli 2014)

@ DarkMo

Ich teste deinen Code jetzt gerade zuhause (heute Früh war's in der Firma). Also ...

1) _index.php_ führt mich gleich mal hier hin. Zum Login komme ich nicht.




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



2) Klicke ich auf "Ausloggen", komme ich zum Login. Das ganze als Tabelle ist jetzt m. E. nicht wirklich schön, aber gut. Will ich mich als "test" einloggen, kriege ich das:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Login also nicht möglich. Okay, mal Registrieren probieren ...

3) Registrieren funktioniert, aber warum "Zurück zum Login", wenn ich eh schon da lande?




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



4) Mit dem neuen Benutzer kann ich mich jetzt einloggen und lande wieder da:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



5) Zeile hinzufügen/entfernen funktioniert, eingegeben Daten landen aber bei "Bestätigen" nur teilweise in der DB. In "projekte" wird keine Beschreibung gespeichert und in "zeiten" wird gar nichts gespeichert.

6) Mal Ausgeben probieren ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        


-------------

Wie du siehst, bei mir läuft das mehr schlecht als recht. 
Jedenfalls mache ich nicht mehr, als deinen db Ordner aus dem zip in htdocs einzufügen, in xampp Apache und PHP zu starten, und dann im Browser index.php aufzurufen.

[EDIT]
Ist alles da, auch die _config.php_ ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## DarkMo (21. Juli 2014)

na jetzt funzt es doch auch xD wie ich sagte, hab ich mich erstmal nur darum gekümmert, dass all deine buttons alles ordentlich "verlinken". um die logik deiner db anfragen hab ich mich garnich gekümmert. auch den aufbau der tabellen hab ich nich angefasst (ausser eben login un reggen). btw, wieso sind alle tabellen auf width 100%?


wegen dem "zurück zu login": das is einfach nur, falls man sich verklickt hatte oder so ^^ find es einfach schön, wenn man solche möglichkeiten anbietet. und wie gesagt, mir gings erstmal darum, dass die grundstruktur, das fundament, erstmal ordentlich steht. um den aufbau, also die sql abfragen, ordentlich dargestellte tabellen usw, kann man sich im anschluss kümmern. das war nicht ziel meiner änderungen. mal bös gesagt: wenn das nich funzt, ist es deine schuld 

aber jetzt wäre erstmal gewährleistet, dass du IMMER über die index.php gehst und die alles korrekt verknüpft, so dass du in jedem file alle benötigten daten hast. das alles gemacht ist usw.



edit: aso, und dass du erst ausloggen musstest hatten wir doch gestern schon: er löscht die doofe session ja bisher ned von allein. man muss manuell ausloggen. deine session bestand wohl noch von gestern, also galtest du als eingeloggt -> default seite für den eingeloggten zustand ist prj zeiterf php


----------



## boss3D (21. Juli 2014)

Die "kleinen Fehlerchen" suche ich mir schon selbst zusammen, keine Sorge ... 
^^ Dazu gleich ne Frage: BenRo meinte, ich solle mir über das error_reporting Notices anzeigen lassen. Das passiert doch eh schon die ganze Zeit, ohne dass ich das jetzt noch was "aktivieren" müsste, oder?

"Zurück zum Login" halte ich immer noch irgendwie für sinnlos, weil das ja auf der Login-Seite angezeigt wird (das ist so, als würdest du im Warenkorb einen Button machen "Zum Warenkorb"). width 100 % wollte ich haben, damit sich die Tabellen unabhängig von der Display-Größe des Users immer schön über den ganzen Monitor erstrecken. Und in _projektzeiterfassung.php_ hätte das ja auch gut ausgeschaut, aber in _login.php_ und _registrieren.php_ leider eben nicht, wie man an deinem Code sieht. Da fand ich meine Version schöner, aber vielleicht kann man das nochmal hinbasteln?! Oder hast du die ganze html-Ausgabe bereits so "automatisiert", dass alles nur noch als Tabelle dargestellt werden kann?

BTW: Dass es bei mir hier so "halbwegs" läuft, heißt leider nicht viel. Ich hatte ja in der Firma ein identes Setup, aber es ging gar nichts. Es war schon immer mehr Glück und Zufall als sonst was, ob irgendwas geht. Und leider lassen sich die ganzen Fehler auch nie wirklich reproduzieren. Oft reicht ein Seiten-Reload um ein Notice wegzubringen, dafür taucht ein anderes auf, etc. ... so geht das schon die ganze Zeit.


----------



## DarkMo (21. Juli 2014)

die darstellung is bums. es is nur wichtig, dass die inputs zw <form...> und </form> stehen ^^ wie die da angeordnet sind... aber du hattest halt diese einzellen-tabelle, daher hatte ich das einfach ausgebaut. btw musst du ja nicht generell jede tabelle so behandeln per css. ohne es angeschaut zu haben, hast bestimmt table { css-formatierung } gemacht oder? machste einfach ein table.class_name {...} draus und hängst an jede tabelle die dieser formatierung folgen soll ein class="class_name" an. also <table class="class_name"> bspw. bei login und php lässte das eben weg.

und btw: login und register sind 2 verschiedene seiten. so wie auch projektzeiterfassung und auswerten 2 verschiedene sind. daher find ichs schon sinnvoll, nicht nur von login zu reggen switchen zu können, sondern auch zurück.

wegen den notices: ich wüsst grad nichma, wie es geht *duck* aber dachte auch bisher, dass das alles angezeigt wird ><



jut, wegen den fehlern im "büro" - was haste denn dort für ein "system"? auch xammp wie bei dir @home oder läuft da was anderes? andere version, neuer, älter, was grundverschiedenes? wer weiß, wie ein anderes webserver programm die gleichen daten behandelt. auf jedenfall ist das ein nicht unwichtiger punkt. bringt ja nix, wenns @home läuft und dann auf arbeit nur rumspackt ^^



edit: aso, falls daran interesse besteht, hier nochmal meine css:


Spoiler





```
td.head_cap {
  background: #AFA;
  text-align: center;
  border: 1px solid #5A5;
  border-radius: 0.5em 0.5em 0 0;
}

td.head {
  background: #AFA;
  text-align: center;
  border: 1px solid #5A5;
}

td {
  border: 1px solid #888;
}

input.switch {
  background: none;
  border: none;
  color: #5A5;
}

input.switch:hover {
  background: none;
  border: none;
  color: #030;
  text-shadow: 0px 0px 15px #0F0;
}

button.switch {
  background: none;
  border: none;
  color: #5A5;
}

button.switch:hover {
  background: none;
  border: none;
  color: #030;
  text-shadow: 0px 0px 15px #0F0;
}

td.head_foot {
  background: #AFA;
  text-align: center;
  border: 1px solid #5A5;
  border-radius: 0 0 0.5em 0.5em;
}
```


----------



## boss3D (21. Juli 2014)

Also den MAs "zuzumuten", sich zuerst ausloggen zu müssen, um sich einloggen zu können, halte ich für etwas viel verlangt ... Da sollten wir schon noch auf eine Lösung kommen, sodass man wirklich gleich zum Login kommt, ohne außer dem Seitenaufruf irgendwas machen zu müssen. Und nein, meine Session bestand nicht noch von gestern, ich habe das wirklich alles erst vor ~ 30 Minuten gestartet.

Beim "Zurück zum Login" Button reden wir immer noch aneinander vorbei. Ich glaube, du wolltest den auf der Registrieren-Seite haben, wo er auch tatsächlich Sinn gemacht hätte. In der Tat befindet er sich aber auf der Login-Seite (siehe mein Screenshot), wo er leider absolut keinen Sinn macht.

Ich habe im Büro, wie auch zuhause: Windows 7, xampp (idente Version), Firefox 30, notepad++. Dennoch kann ich nie davon ausgehen, dass was auch dort gehen wird, nur weil's hier läuft.

[EDIT]
Das wird ja alles noch "lustig", wenn wir das dann auf den Firmen-Webserver verfrachten müssen, wo definitiv kein xampp laufen wird ... dafür weiß Gott was sonst. Wenn dann nix läuft, Hallelujah!


----------



## DarkMo (21. Juli 2014)

hattest du dich gestern ausgeloggt? ich vermute eben, nicht. was weis ich denn, wie lange der den kram speichert ^^ als ich das ganze komplett neu gestartet hatte gestern zum testen, kam jedenfalls wie gewünscht erst der login. ohne logout -> kein login. da wir bisher nur eine variante des logouts drin haben (händisches ausloggen per button), wird sich da halt auch nich viel dran ändern. was wir noch machen können ist wie gesagt die geschichte mit dem zeitbasierten logout (timeout der sitzung quasi) und/oder ip-wechsel. gerade letzteres ist wieder ein sicherheits-dingen. wenn einer deine session übernimmt, dann wird er automatisch ausgeloggt (da seine ip nicht deiner entspricht). das übernehmen der session wäre also ohne kenntnis der logindaten sinnlos. weiß mich, wie wichtig dir das wäre, je nachdem könnten wir da mal was zusammen basteln *denk*

ach wegen dem zurück zum login - raffsch nid ^^ in login.php hab ich 2 buttons drin: einloggen (btnLog) und zur registration (btnRegForm). und in registrieren.php hab ich auch 2 drin: registrieren (btnReg) und abbrechen (name irrelevant). wo siehst du also das "zurück zum login?" ^^



edit: AAAAHSO. das is in der formular.php beim abrödeln der registrierung. du hattest da auch irgend was drin, das hatte ich umgetüdelt. gut, das is wirklich latte und kann weggelassen werden ^^


----------



## boss3D (21. Juli 2014)

Ich habe deinen Code auf dem/meinem PC hier vor einer Dreiviertelstunde zum allerersten Mal ausgeführt. Da kann gar nichts gespeichert gewesen sein. Übrigens würde ich auch nicht davon ausgehen, dass sich MAs nach ihrer Benutzung der Website verlässlich ausloggen und diese nicht einfach nur schließen. Da sollten wir uns schon noch was überlegen. Nicht, dass dann der nächste MA Probleme kriegt ...

BTW: Jetzt klar?  Da hat's was:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ "Zurück zum Login" auf Login bringt nichts!


----------



## DarkMo (21. Juli 2014)

hab den entsprechenden teil mal angepasst, sieht jetzt so aus:
(änderungen fett und grün markiert)

```
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>';
            else {
                $passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") $rechte = 0;
            else $rechte = 1;

                $check = mysql_query("SELECT * FROM user WHERE name='".$username."';");
                if(mysql_num_rows($check)) $protokoll .= '- Benutzername schon vorhanden.<br>';
                else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if($eintragen) $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                    else [B][COLOR=blue]{[/B]
                      $protokoll .= '- Fehler: Der Benutzername war schon vorhanden.';
                      [B][COLOR=blue]$_POST['btnRegForm'] = true;
                      unset($_POST['btnReg']);
                      $site_title = "Registrieren";
                    }[/B]
                }
            }
        } else [COLOR=blue][B]{[/B]            $protokoll .= '- Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br>';
            [COLOR=blue][B]$_POST['btnRegForm'] = true;
            unset($_POST['btnReg']);
            $site_title = "Registrieren";
        }[/B]    }
```
im erfolgsfalle landet man direkt wieder bei login, so wie das bisher "ausversehen" schon so war ^^ im fehlerfalle allerdings manipuliere ich (ungetestet - hoffentlich erfologreich ><) dann die post-dinger so, dass man wieder zur reggen-form kommt (und pass auch den seitentitel wieder an).


----------



## DarkMo (21. Juli 2014)

weschen dem login bla:
ich hab jetzt mal ne schnelle variante mit dem ipchange-autologout gebaut (hoff das funzt auch so simpel ^^).

änderungen an der config.php wie eben hervorgehoben:

```
<?php
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    [COLOR=blue][B]function logout() {
      $_SESSION = array(); // session-array löschen (durch neu anlegen szs)
      session_destroy();
    }[/B]    
    $protokoll = '';
    $site_title = 'Login';
    
    $user = "";
    $userid = 0;   
    $rechte = -1;   
    $ipadresse = $REMOTE_ADDR;

    if(isset($_SESSION['[B][COLOR=blue]id[/B]'])) {
      [B][COLOR=blue]if($_SESSION['id'] == $ipadresse) {[/B]
        $user = $_SESSION['name'];
        $userid = $_SESSION['id'];
        $rechte = $_SESSION['rechte'];

        $site_title = 'Projektzeiterfassung';
      [B][COLOR=blue]} else {
        logout();
      }[/B]
    }
        
    $verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");

    $kw = date('W');
    $jahr = date('Y');
    $monat = date('n');
    $wt = date('N');
    $tag = date('j') - ($wt - 1);
    $wochenanfang = mktime(12, 0, 0, $monat, $tag, $jahr);
    $wochenende = mktime(12, 0, 0, $monat, ($tag + 6), $jahr);
    
    $add = 1; // eine eingabezeile by default
?>
```
unsere logout funktionalität in eine funke ausgelagert, so dass wir den code ggf nur einmal ändern brauchen. dann gleich die ip der session abgefragt (is glaube nichmal nötig, aber fühlte sich irgendwie sicherer an xD) und noch ne innere if hinzugefügt, die eben prüft, ob die ip noch stimmt. wenn nicht, logout...

in der formular.php dann folgendes:

```
// ...
    if(isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            [B][COLOR=blue]$_SESSION['ip'] = $ipadresse;[/B]

            $site_title = 'Projektzeiterfassung';
        } else {
            $protokoll .= '- Benutzername und/oder Passwort waren falsch oder nicht registriert.<br>';
        }
    }

    // ...

    if(isset($_POST['logout'])) {
        [B][COLOR=blue]logout();[/B]
    }
    // ...
```
auch hier das logout gelumbe über die neue funke aufgerufen und eben beim login sichergestellt, dass auch die ip mitgesichert wird. sofern es nen netsplit gibt und sich die ip täglich ändert, dürfte das schonmal funtzen. is natürlich die frage, ob das bei nem vermuteten intranet dingens auch so geht ><



edit: wegen diesem salt error: den hab ich wohl gelöscht? find ihn jedenfalls ned mehr >< am besten das teil ($salt = "#sf$!\"ä\"$asd³s²a~§653 sa51d75qÖAa@üeX";) bei config.php mit angeben. oder spricht da was dagegen @mitleser ^^


----------



## Rho (21. Juli 2014)

Wann ist eigentlich Abgabefrist für das Meisterwerk? Oder schreibt ihr hier die unendliche Geschichte?
Ganz anderes Thema, was sagt eigentlich dein Arbeitgeber dazu, dass du den Source-Code veröffentlichst?

Vielleicht habe ich ja diesmal Chance auf eine Antwort. Ist auch ganz bestimmt nicht "pseudosarkastisch" gemeint.


----------



## DarkMo (21. Juli 2014)

so, nachtrag:
wegen dem fehlenden salt wird wohl unser login mit test/test nich geklappt haben. leider wird nun unser neu angelegter futzi nich mehr einloggbar sein (da ich jetz zumindest den salt wieder in config mit reingekritzelt hab). aber eben deine ursprünglichen sollten wieder gehn *denk*

gut, dann habsch nen fehler bei meinem ip-code gefunden: hab session id statt ip abgefragt >< hab jetzt das ganze nochmal um nen 5 minuten timeout erweitert (der hoffentlich funzort) ^^ aber das lässt sich ja eigentlich easy testen (runtersetzen auf testweise 2 secs, kurz warten zw klicks, dann sollte der logout kommen.

config.php sieht nun so aus (also der wichtige teil):

```
// ...
    $ipadresse = $REMOTE_ADDR;
    $now = getdate();
    $timeout = 5 * 60; // 5 minuten bis auto-logout

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

          $site_title = 'Projektzeiterfassung';
        } else {
          logout();
          $protokoll .= "- Die Sitzung wurde aufgrund eines Timeouts unterbrochen (zu lange keine Aktion durchgeführt). Bitte loggen Sie sich erneut ein.";
        }
      } else {
        logout();
        $protokoll .= "- Die Sitzung wurde aufgrund eines IP-Wechsels unterbrochen. Bitte loggen Sie sich erneut ein.";
      }
    }
    // ...
```
und formular.php beim einloggen das hier:

```
// ...
    if(isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysql_query("SELECT * FROM user WHERE name='".$username."'");
        $row = mysql_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';
        } else {
            $protokoll .= '- Benutzername und/oder Passwort waren falsch oder nicht registriert.<br>';
        }
    }
    // ...
```
*gespannt bin* hab extra die ip-meldung höher priorisiert, da ich das als wichtiger empfinde. wäre doof, wenn man nach 5mins und einer sec nich mehr die meldung bekommt, dass die ip geändert wurde (wegen hack bspw ^^). hoffe, ich hab jetz nich wieder irgendwelche fehler reingemehrt ><


edit: natürlich wieder ; vergessen xD



edit2:
ok, er wollte das nich so recht machen. hatte da eine vermutung: lokal aufm rechner wird dat mit der ip nix, was uns so einiges zerfummelt. vermutung richtig gewesen >< habs daher nun so abgeändert (nur config.php):

```
// ...
    $ipadresse = $REMOTE_ADDR;
    if($ipadresse == '') $ipadresse = "localhost";
    $now = getdate();
    $timeout = 5 * 60; // 5 minuten bis auto-logout

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

          $site_title = 'Projektzeiterfassung';
        } else {
          logout();
          $protokoll .= "- Die Sitzung wurde aufgrund eines Timeouts unterbrochen (zu lange keine Aktion durchgeführt). Bitte loggen Sie sich erneut ein.<br>";
        }
      } else {
        logout();
        $protokoll .= "- Die Sitzung wurde aufgrund eines IP-Wechsels unterbrochen. Bitte loggen Sie sich erneut ein.<br>";
      }
    }
    // ...
```


ach und beim registrieren hab ich gesehn, das ich 2 fehlermeldungen übersehen hatte. da kam zwar ordnungsgemäß der fehler, aber man wurde wieder zu login geworfen und blieb nicht beim reggen. habs daher auch angepasst:

```
// ...
    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) [B][COLOR=blue]{[/B]
              $protokoll .= '- die Bestätigung des Passworts stimmt nicht.<br>';
              [COLOR=blue][B]$_POST['btnRegForm'] = true;
              unset($_POST['btnReg']);
              $site_title = "Registrieren";
            }[/B] else {
                $passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") $rechte = 0;
            else $rechte = 1;

                $check = mysql_query("SELECT * FROM user WHERE name='".$username."';");
                if(mysql_num_rows($check)) [B][COLOR=blue]{[/B]
                  $protokoll .= '- Benutzername schon vorhanden.<br>';
                  [COLOR=blue][B]$_POST['btnRegForm'] = true;
                  unset($_POST['btnReg']);
                  $site_title = "Registrieren";
                }[/B] else {
                    $eintragen = mysql_query("INSERT INTO user (name,  passwort, rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if($eintragen) $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                    else {
                      $protokoll .= '- Fehler: Der Benutzername war schon vorhanden.';
                      $_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";
        }
    }
    // ...
```
funzte bei mir soweit erstmal alles. gut, trotz salt in der config, konnt ich mich ned mit test/test einloggen >< aber wie erwartet war mein selbst erstellter login auch hinnev xD


----------



## Festplatte (22. Juli 2014)

DarkMo schrieb:


> wegen den notices: ich wüsst grad nichma, wie es geht *duck* aber dachte auch bisher, dass das alles angezeigt wird



error_reporting(E_ALL); zeigt sämtliche Fehler an. Ich hoffe, ich hab die Frage richtig verstanden.


----------



## boss3D (22. Juli 2014)

Das ist wirklich irre ... hier in der Firma geht wieder gar nichts ... 

@ DarkMo
Ich habe zwar alle deine Änderungen noch gemacht, aber rauskommen tut gleich mal zu Beginn das hier:

*gelöst, siehe EDIT*

Wenn ich dann gleich _login.php_ aufrufe und dort auf "Registrieren" klicke, passiert auch wieder gar nichts. Der Button macht nichts.
^^ Selbes Szenario, wenn ich manuell _registrieren.php_ aufrufe und Daten eingebe. Da kann ich auf die Buttons klicken so oft ich will, passiert gar nichts. 

Und _projektzeiterfassung.php_ liefert letztendlich noch das:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



 Kann sein, dass es bei mir zuhause ginge (kann ich erst heute Abend testen), aber das würde auch nichts nützen, weil es ja HIER in der Firma laufen muss!

Ich schau mal, ob ich ein paar der Notices wegbringen kann, aber dass _index.php_ und auch die Buttons gar nicht funktionieren, macht das ganze kompliziert.

[EDIT]
google sagt: Dein "REMOTE_ADDR" ist php4, jetzt heißt das "$_SERVER['REMOTE_ADDR']". Damit hätte ich schon mal diese beiden Notices weg ...

BTW: Die ganzen Fehlermeldungen kommen jetzt daher, weil ich "error_reporting(E_ALL);" ganz oben in _config.php_ eingefügt habe. 
Jedenfalls versuche ich gerade, erstmal alles nötige auf mysqli umzuschreiben um die deprecated warnings wegzukriegen. Dabei kriege ich aber immer wieder "query empty" Meldungen. Da scheinen noch einige Abfragen nicht mit der DB zusammenzupassen?!




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Was mir auch aufgefallen ist: Seit wann ist denn sowas hier ( "SELECT * FROM produkte;"; ) korrekte Syntax? Gehört ; hinter produkte nicht weg? Jedenfalls finde ich das so in keinem Tutorial.


----------



## DarkMo (22. Juli 2014)

wegen den nicht funktionierenden buttons:
klar geht das nich  die beiden einzelfiles haben ja nichmal nen form tag. der wird ja in html_header geöffnet und in html_footer geschlossen. wie gesagt, NUR über index.php aufrufen.

wegen ip: aha, gut zu wissen. aber das offenbart genau das, was ich befürchtet hab: du hast wohl auf arbeit ne neuere version von php laufen und die zickt mit dem "alten" code rum *vermut* aber wie du richtig erkannt hast: das muss gefixt werden. was mir am ehesten kopfzerbrechen bereitet is die meldung, dass variablen undefiniert sein sollen (kannst ja mal probieren, ob ein var davor was ändert - also da, wo ne variable erstmalig genannt wird (meist also wohl config)). und eben, dass er nichmal ne db ausgewählt hat. mit bissl glück langts, wenn du das mit dem mysqli gelumbe hinbekommst, aber ich wüsst hat len, was das mit den anderen variablen zu tun haben soll :/


ach und wegen dem ; im sql sting: das ist sehr interessant, dass das in tutorials fehlt >< das ding ist an und für sich pflicht. damit gibt man dem dbms bekannt, dass hier die anfrage endet. schau dir mal deine .sql datei an. hier werden viele viele anfragen nacheinander gebaut. ohne ; wüsste das teil nu garnich, wo eine anfrage ended und die andere anfängt. bei einer einzelnen anfrage kann mans notfalls auch weglassen, ohne das was passiert (wie bei unseren aufrufen eigentlich immer), dennoch gehört das teil eigentlich dran.


----------



## boss3D (22. Juli 2014)

Ja, dass ich deine Codeteile NUR über _index.php_ aufrufen sollte, hatte ich schnell kapiert ... 

Allerdings führt mich auch _index.php_ sofort wieder zu _projektzeiterfassung.php_, ohne jemals einen Login zu sehen. DAS ist ja wieder das doofe an der Geschichte. 

Das Fehlerbeheben geht eh flott dahin, sobald man mysqli einigermaßen zu durchschauen beginnt. Z. B. ist es optional, den DB-Namen im Verbindungsaufbau anzugeben, soweit so gut, allerdings wird dann nie eine DB-Verbindung zustande kommen. K. A. wie die sich das Logik-mäßig vorstellen. Jedenfalls hat's bei mir gleich wieder geklappt, nachdem ich auch noch DATABASE in den Verbindungsaufbau reingeschrieben hatte. 

Wegen dem ; --> Zeig mir ein Tutorial, wo das so angegeben wird. Sonst kann ich dir gerne sofort mind. 3 zeigen, wo ein ; erst nach ("SELECT ..."); kommt, also am Zeilenende. Mag natürlich sein, dass du recht hast, nur ist das über google nicht rauszufinden. 
----------

Jedenfalls kämpfe ich derzeit mit folgendem Problem:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



BTW: Ich habe, wie gesagt, hier auf der Arbeit die exakt selbe xampp Version wie auch zuhause. Ergo selbe PHP Version! Warum geht's dann hier nicht, zuhause aber schon (wobei ich aber deinen aktuellsten Code zuhause noch nicht testen konnte)? 

[EDIT]
Hab's schon. So muss es aussehen:
	
	



```
$taetigkeiten = array();
$res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<br>".mysql_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>".mysql_error());
if (mysqli_num_rows($res_p))
    while ($row_p = mysqli_fetch_assoc($res_p)) {
        $products[count($products)] = $row_p;
    }
```
Interessanterweise will er mir scheinbar eh den Login anzeigen, landet aber trotzdem auf _projektzeiterfassung.php_?! 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT2]
Soweit das ganze jetzt mal in mysqli: *


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

*

^^ Folgende Probleme hat der Code (zumindest hier am Firmen-Rechner):

*a)* Bei aufruf von _index.php_ lande ich scheinbar beim Login, wobei mir da aber offenbar nur dieser Header, allerdings mit dem Code aus _projektzeiterfassung.php_, angezeigt wird?! Beim echten Login lande ich erst nach "Ausloggen" (oder wenn die Zeit abgelaufen ist, wobei mir da 5 Minuten arg knapp vorkommen).
*b)* Dabei habe ich noch was interessantes festgestellt:





> *Warning*:  session_destroy(): Trying to destroy uninitialized session in *C:\xampp\htdocs\db\formular.php* on line *138*


Anscheinend wird also unsere Session gar nie gestartet?! Obwohl sie ganz zu Beginn von _index.php_ steht?!
*c)* Wenn ich in _auswerten.php_ (und vermutlich auch _auswerten2.php_) auf "<<" oder ">>" klicke, führt das zurück zu _projektzeiterfassung.php_. Korrekterweise sollten aber ebenfalls die KWs durchgeschaltet werden. K. A. was es da noch hat ???
*d)* Mein Export-Button führt derzeit auch nur zurück zu _projektzeiterfassung.php_, aber das ist ja noch klar, weil wir den Button bis jetzt in _formular.php_ nicht bedacht haben. Den baue ich jetzt gleich mal rein.
*e)* Bei "Bestätigen" landen nur Einträge in der Tabelle _projekte_, nicht aber in _zeiten_. Irgendwo hierin muss der Fehler liegen:
	
	



```
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."");
        $data = array("mo", "di", "mi", "do", "fr", "sa", "so");
    
        $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++) {
            if (isset($_POST[$stunden[$b]]) and $_POST[$stunden[$b]] != "") {
                $dauer = $_POST[$stunden[$b]];
                $tag = $_POST[$data[$b]];                                
                $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }
        }
    }
}
```
Wobei ich mir bei dem data-array eh nicht mehr ganz sicher bin. Früher hatten wir ja die 7 echos mit "mo", "di", ... , aber das haben wir ja längst in _projektzeiterfassung.php_ durch diese Schleife ersetzt:
	
	



```
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>';
}
```


----------



## DarkMo (22. Juli 2014)

> Wegen dem ; --> Zeig mir ein Tutorial, wo das so angegeben wird.  Sonst kann ich dir gerne sofort mind. 3 zeigen, wo ein ; erst nach  ("SELECT ..."); kommt, also am Zeilenende. Mag natürlich sein, dass du  recht hast, nur ist das über google nicht rauszufinden.


kann dir als quelle nur meinen sql-prof nennen  bei dem hab ich grundlagen sql und 2 vertiefungen geschrieben und jeweils gut bestanden ^^ ich mag sql *g* also wie gesagt, bei einer einzelnen machts scheinbar nichts aus, vllt ist mysql da auch nicht so penetrant wie oracle's sql, aber ich habs mir halt gleich angewöhnt, eine sql anfrage immer mit ; zu beenden 


generell lese ich raus, dass die verbindung nun wieder steht? wie siehts mit diesen undefined gerödel aus? und wenns gelöst ist: wie? ^^ würde mich echt brennend interessieren, was er da zu mosern hat.



> Interessanterweise will er mir scheinbar eh den Login anzeigen, landet aber trotzdem auf _projektzeiterfassung.php_?!


das hatte ich bei mir auch schon. er merkt sich irgendwie nich, auf welcher seite man war. aber gut, im eingeloggten zustand müsste er dennoch prjzeiterf. anzeigen und nicht login. kam aber gestern nich mehr zum rumexperimentieren. ich habe früher bei meinen dingern da immer mit nem get-parameter gearbeitet. weil das wid auch das problem sein, dass er dich zu prj-zurückwirft, wenn du in auswerten was klickst.

zu deiner liste...
a) wäre ja quasi gerade das angesprochene,  dass hier meine logik noch nich ganz hinhaut (er zeigt login als  überschrift an). den timeout kannste ganz easy in config anpassen. da  steht atm 5*60, machste halt 10*60 oder sonstwas draus ^^
b) ist interessant oO
c) wieder wie in a) schon angesprochen - meine lösungsidee auf die schnelle wäre das mit diesem get parameter. oder man versuchts mit nem weiteren hiddenfield oder so. kA wie es alles machbar ist. mal schauen. jedenfalls müssen wir irgendwie mitgeben, von wo aus wir etwas gesendet haben und das dann beim neuaufruf übernehmen. nur buttondrückerei zum wechseln zu anderen "seiten" darf diesen wert dann übermalen ^^ ist so dir grundidee.
e) it grundsätzlich recht simpel. da du ja nun nach meinem vorschlag statt mo/montag... den timestamp nutzt, wird er bei deiner inneren schleife nix mehr finden. ABER es sollte recht easy ummodelbar sein. du müsstest nur wieder ts mit reinbringen (statt i*... eben b* schreiben, da dein index der for schleife hier b ist) und deine abfragen leicht ändern. aus post stunden b wärde dann zum bsp post ts_b werden (wieder kurzschreibweise ^^ hoff du weist was ich mein). und das datum selbst (also deine tag variable) wäre einfach ts.


```
for ($b = 0; $b < 7; $b++) {
            $ts = $wochenanfang + ($b * 60 * 60 * 24);
            if (isset($_POST[$ts.'_.'$b]) and $_POST[$ts.'_.'$b] != "") {
                $dauer = $_POST[$ts.'_.'$b];
                $tag = $_POST[$ts];                                
                $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
            }
        }
```


----------



## boss3D (22. Juli 2014)

Bei der Verbindung war das Problem, dass du in mysql stehen hattest:
	
	



```
$verbindung = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die ("Verbindung zur Datenbank konnte nicht hergestellt werden"); 
mysql_select_db(DATABASE) or die ("Datenbank konnte nicht ausgewählt werden.");
```
In mysqli ist die zweite Zeile nicht nötig, aber ich hatte anfangs vergessen, dafür DATABASE als vierten Parameter in der ersten Zeile einzufügen. Also wusste er erstmal nicht, zu welcher DB denn die Verbindung hergestellt werden sollte. So stimmt's jetzt und funktioniert einwandfrei:
	
	



```
$mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, DATABASE);
if ($mysqli->connect_errno) {
    echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
```
"undefined" kriege ich auch keine mehr. Ich habe generell ALLE Errors, Warnings und Notices bis auf eines weggekriegt. Eben das mit dem "session_destroy()" in formular.php ist geblieben. Bei $salt war das Problem, dass das einfach gar nirgends im Code stand. Ich hab's einfach schnell aus nem alten Code rauskopiert und bei uns jetzt in _config.php_ eingefügt, schon hat's gepasst. 

Den Unterschied zwischen $_GET und $_POST hatten wir ja schon ein paar Mal, aber ich lese mir das trotzdem gerade nochmal durch. Noch sehe ich aber nicht, inwiefern das bei uns hier das Problem *a)* lösen soll.
*b)* Jo, das mit der Session ist immer noch ne komische Geschichte. 
*c)* Das witzige ist ja, ich hatte das ja schon mal laufen, in einem meiner früheren "Chaos-Codes". Und in _projektzeiterfassung.php_ machen diese beiden Buttons ja auch genau das richtige. Ich suche deshalb schon die ganze Zeit einen Unterschied im Code zu _auswerten.php_. Eigentlich habe ich die nämlich ursprünglich als copy-paste erstellt. Irgendwas kleines muss sich durch unsere Rumbastlerei gerade so viel geändert haben, dass die Buttons jetzt nicht mehr das richtige machen. Oder vielleicht liegt's auch daran, wie wir _auswerten.php_ in _index.php_ aufrufen?!
*d)* Da ist mein Versuch relativ schnell gescheitert ...
	
	



```
if (isset($_POST['export'])) {
    include('export.php');
}
```
^^ Das in formular.php eingefügt funktioniert jedenfalls nicht. Muss ich weiterüberlegen.
*e)* Ja, dass es jetzt über $ts läuft, hatte ich schon vermutet und angedeutet. Wir haben ja kein "mo", "di", etc. mehr. Ich schaue mir das gleich mal an. BTW: Sind die einfachen Hochkomma bei dir richtig gesetzt? Sollte nicht das rechte links vom Punkt stehen?

[EDIT]
Ui, da hat's was ...

Die Hochkomma müssen so ausschauen:
	
	



```
for ($b = 0; $b < 7; $b++) {
     $ts = $wochenanfang + ($b * 60 * 60 * 24);
     if (isset($_POST[$ts.'_'.$b]) and $_POST[$ts.'_'.$b] != "") {
         $dauer = $_POST[$ts.'_'.$b];
         $tag = $_POST[$ts];                                
         $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
     }
}
```
Allerdings kriege ich folgende Meldung (und lande beim Login ):




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



In Spalte "datum" in _zeiten_ wird nur "0" eingetragen.

[EDIT2]
Es ist echt nur kurios: Auf dieser Seite ist dann Firefox eingefroren und ich konnte nur noch über den Taskmanager beenden. Dann Firefox neugestartet und _index.php_ aufgerufen, schon lande ich endlich mal beim Login ... ABER: Ich kann mich nicht als "test" einloggen. Da kriege ich nur:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        





Habe jetzt "test" neu erstellt, Login scheint zu klappen. Jetzt schaut aber auch der PW-hash ganz anders aus. Vermutlich wird der erst jetzt richtig berechnet. Nach "Bestätigen" bleiben wir jetzt auch korrekterweise auf _projektzeiterfassung.php_, aber der Offset-Fehler bleibt ...


----------



## BenRo (22. Juli 2014)

Ich fürchte ich habe bzgl error_reporting und Notices Verwirrung gestiftet, das tut mir Leid.

Warum sollte man die Anzeige der Notices aktivieren?
Ganz einfach, man erkennt sehr viele kleine Fehler schneller, z. B. Tippfehler von Variablen (wobei das allerdings auch jeder gute PHP-Editor / IDE erkennt):

```
$meinButon = 'Klicken';
print($meinButton);
```

Ist es ein Fehler, eine Variable nicht zu initialisieren?
Nein. Sonst würde auch keine Notice angezeigt, sondern ein Error. Das kann man gut finden, oder schlecht, aber folgender Code ist korrektes (wenn auch unsinniges) PHP.

```
<?php
print($a * 4); // Ich muss mal eben die Ziffer 0 ausgeben...
```

Sollte man es trotzdem tun?
Meiner Meinung nach ja. Auch das offizielle PHP-Handbuch empfiehlt das.
Gerade wenn, wie hier, Dateien per include eingebunden werden und man Variablen an anderer Stelle weiter verwendet. Dann ist der Code weniger verwirrend und man entdeckt oben erwähnte Tippfehler schneller usw.
Initialisierung ist in PHP nichts anderes, als einen Wert zuzuweisen also $foo = 'bar';

EDIT:
Dann zum Thema ?>
Der schließende PHP-Tag, also ?>, ist nicht notwendig, er kann weggelassen werden. Das habe ich mir nicht ausgedacht, sagen auch andere, siehe hier:
http://www.sitepoint.com/should-you-close-your-php-code-tags/

Warum sollte man ihn weglassen?
Ganz einfach: Wenn man keinen guten Editor / IDE hat, dann kann es passieren, dass man nicht merkt, dass man versehentlich nach dem ?> noch ein Leerzeichen stehen hat

```
?>
```
Sieht doch identisch aus wie ?> ohne Leerzeichen dahinter, oder? Ist es aber nicht. Ein Leerzeichen ist output, genau so wie ein A oder ein X. 

Warum ist das Leerzeichen da schlimm?
Ich könnte jetzt lang und breit erklären, aber in aller Kürze: Es kann (in diesem Fall) Probleme mit cookies/sessions verursachen und weitreichende Folgen haben. Allgemein können keine header gesendet werden, wenn bereits begonnen wurde, die response zu senden.
Bei weiterem Interesse siehe bei Google unter anderem: "closing php tag", "header already sent", "php output buffering", "http response header", hängt letztlich alles zusammen.

Noch ein EDIT:
Gerade erst gesehen, dass dazu sogar was in der offiziellen Doku steht:



> Der schließende Tag eines PHP-Blocks am Ende einer Datei ist optional, und in einigen Fällen ist das Weglassen hilfreich, wenn Sie include oder require verwenden, so dass ungewollte Whitespaces nicht am Ende einer Datei auftreten und Sie noch im Stande sind, später weitere Header an die Response hinzuzufügen. Es ist ebenfalls praktisch, wenn Sie Output Buffering verwenden und keine ungewollten Whitespaces am Ende eines durch die eingebundenen Dateien erzeugten Parts sehen wollen.


Von hier: http://php.net/manual/de/language.basic-syntax.instruction-separation.php

Noch was ganz anderes:
Einerseits ist Sicherheit wohl wurscht (Zitat DarkMo "und er wird sicher nich seine eigene db hacken"), andererseits wird mit einem salted hash gearbeitet? Paradox. Aber egal. Es ist euch vielleicht schon klar, aber falls nicht weise ich darauf hin: Natürlich bringt der salted hash SO nichts. Erstens muss salt für jeden User anders aussehen (einfach den salt selbst in der User-Tabelle speichern), zweitens wenn man einen fixen salt verwendet (den man sich wie gesagt auch sparen kann, ist genau so sicher wie kein Salt), dann sollte der natürlich geändert werden, bevor das System live geht, denn nun wissen zumindest alle im Forum schonmal den Salt, sowie das Hashingverfahren.


----------



## boss3D (22. Juli 2014)

Mal ne erfreuliche Nachricht: Ich habe soeben den Code zuhause gestartet und bin sofort am Login gelandet ... 
In der Firma dürfte wirklich das Problem sein, dass durch das stundenlange Arbeiten und immer nur Seite-reloaden im Firefox Sessions nie korrekt (falls überhaupt) beendet werden und das ganze dadurch Zustände erhält, die für uns wie Fehlverhalten ausschauen. 

Wie das dann aber im "Produktiveinsatz" ausschauen wird, wenn das Zeug erst wieder 24/7 läuft, weiß ich nicht. Hoffentlich kommt dann trotzdem jeder MA bei Seitenaufruf zum Login. Oder vielleicht sollten wir uns zur Sicherheit wirklich noch einen Auto-Logout überlegen?! Damit bloß kein MA "unwissentlich" unter dem Namen seines Vorbenutzers Daten einträgt.
------------

@ BenRo
Danke für die Ausführung, aber ich hatte dir das mit dem optionalen ?> auch schon nach dem erstmaligen Erwähnen geglaubt. 
Ich hab's BTW hier nachgelesen, aber es besagt im Grunde eh das selbe wie deine Quelle.

Zur Sicherheit: "Live" im Sinne von "aus dem Internet aufrufbar" wird das ganze eh nie gehen. Das kommt auf den Firmen-Webserver (vorrausgesetzt, wir schaffen das; sonst wird's wohl irgendeine xampp-Lsg) und wird dann genau für die ~15 MAs aus meiner Abteilung aufrufbar. Es wird ja auch keine echte Adresse geben, sondern vermutlich wird das dann irgendwie so ausschauen: xxx.xx.xxx.xx/index.php (wobei die x für die [hoffentlich statische] IP des Servers stehen). Zumindest so wie ich mir das bis jetzt vorstelle. 

Und wie gesagt: Die Excel-Tabellen, in die die MAs bisher ihre Daten eingetragen haben, waren/sind für jeden einseh- und editierbar. Und wenn die sich bis jetzt nichts gegenseitig manipuliert haben, dann gehe ich nicht davon aus, dass sich da einer hinsetzen und die DB zu hacken probieren wird. 
Außerdem sind's wirklich relativ belanglose Daten. 

Dass der Salt so relativ umsonst ist, habe ich mir auch selbst schon gedacht. Im Moment würde er nur dadurch wirken, dass ihn (vermutlich) noch kein MA kennt und somit keiner weiß, was noch am PW dranhängt, damit diese Hashes entstehen. Für den praktischen Einsatz wär's dann aber natürlich besser, wenn der Salt per Zufallszahlengenerator oder sonst wie dynamisch erzeugt würde. Wenn am Ende Zeit bleibt, schaue ich mir das gerne an.
------------

Im Moment wäre jedenfalls das wichtigste Problem, dass ich keine Ausgabe kriege, was aber sicher noch damit zusammenhängt, dass für "datum" nur "0" in der DB landet. Der Fehler wird irgendwo hier in der inneren for-Schleife liegen:
	
	



```
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.'_'.$b]) and $_POST[$ts.'_'.$b] != "") {
                    $dauer = $_POST[$ts.'_'.$b];
                    $tag = $_POST[$ts];                                
                    $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$tag')");
                }
            }
        }
    }
```
Hier kriege ich ja den Offset-Fehler, den ich zwar lösen könnte, indem ich einfach nur bei $ts alles zwischen = und ; nochmal in Klammern setze, aber dann wird gleich in der ganzen "zeiten" Tabelle kein Eintrag erstellt, lediglich in "projekte".


----------



## BenRo (22. Juli 2014)

Schleife: Ich kanns grad nicht testen, aber sollte leicht zu lösen sein:

Ändere $tag = $_POST[$ts] in

```
$tag = $ts;
```

$ts enthält ja bereits den jeweiligen Tag.



Salt:

Also, entweder du hast Angst, dass die MAs kriminelle Energie genug haben, um sich als jemand anderes einzuloggen, dann solltest du aber auch die SQL-Queries per escaping schützen oder prepared statements verwenden.

Oder du hast keine Angst, dass die MAs kriminelle Energie haben, dann brauchst du auch keinen salt und kannst dir Entwicklungszeit und potenzielle Fehlerquelle einsparen.


----------



## DarkMo (22. Juli 2014)

zuerst, weil mir grad die schuppen von den augen fallen: ich hab dir den falschen index vorgeschlagen ^^ häng mal nich b an ts an sondern a xD und jop, ich hatte mit dem ' nen dreher drin, haste richtig erkannt und behoben 

so, jetz nochmal stück für stück...
jut, dass die ganzen warnungen wech sind ist gut. frag mich halt, wieso das überhaupt kam, weil die ganzen dinger waren definitiv defined. hatten ja alle defaultwerte bekommen, dazu stehen sie ja in der config.php. das mit dem salt hatte ich dir ja auch schon gesagt (überlesen? ^^) und dass du deinen test nich mehr einloggen kannst ist auch klar - dank salt ändert sich ja der hash. btw thx benro, ich hatte schon vermutet, dass das in der art und weise recht sinnbefreit ist und meine idee ging auch in die richtung, die du erwähnt hattest.

wegen deiner zweifel bezüglich punkt a): die logik dieses überschriften textes ist wie folgt: initialisiert wird er mit "login". einfach aus dem grund, weil das normalerweise der einstiegspunkt ist. drückt man jetz irgendeinen button, dann wird geschaut, ob dieser button zu einer anderen seite führt (wie zum bsp btnRegForm, der zur form zum reggen führt) und hier wird ggf der titel angepasst. das funzt soweit auch. jetzt haben wir uns aber eingeloggt und sind bei projzeiterfassung (BITTE mach den drecks namen kürzer xD ich nenn das teil ab jetzt nur noch zeit.php) und drücken hier nen kalenderbutton. wieder startet index und initialisiert den titel mit login, aber der kalenderbutton ist eben keiner, der einfluss auf den seitentitel nimmt, somit wird der auch nicht geändert und es steht schlicht und ergreifen login drüber.

so, einfachste lösung: hau diese überschrift einfach aus html_header.php raus (letzte zeile glaube) und bau sie hardcoded in deine einzeldateien ein (login, reggen, zeit, auswerten 1+2). wenn du gut bist, haste aber schon den nächsten punkt erkannt: genausowenig, wie der kalenderwechselbutton den titel beeinflusst, genausowenig beeinflusst er auch die "wegfindung" in deiner index.php. drückst du in auswerten.php den kalenderbutton, dann ist dein login-status true und du kommst ins else wo es zur entscheidung kommt (showdown! ^^) welches file gezeigt wird. und es ist wie gesagt der kalenderbutton gedrückt und nicht der "wechsel zu auswerten" button. daher wird auch hier der else teil gewählt und du landest bei zeit.php (u know ^^).

deswegen müssen wir uns irgendwie merken, wo wir waren. dazu gibts mMn 2 möglichkeiten: entweder aufm POST-weg *schenkelklopf* mittels eines hiddenfields (wie dein add-wert) oder per get-parameter (ich hatte ihn section genannt. also index.php?section=login bspw. vorteil vom post-weg ist, dass der link nicht "verschandelt" wird (falls du das unästhetisch findest) und per hiddenfield wert sollte das prima funktionieren. vorteil des get-weges allerdings wäre, dass du mit nem normalen link (wieso auch immer) direkt eine seite ansprechen könntest, ohne einen button drücken zu müssen. hmm, bsp wäre der btnRegForm button. den könnte man dann auch als link realisieren, da er eh keine formular-felder senden soll (wenn wir nicht benro's vorschlag aufgreifen, dass ein beim einloggen schon eingegebener username hier gleich übernommen werden soll). einfach ein a href="index.php?section=register" und fertsch isses. per css kann man das ding auch aussehen lassen wie nen button (bzw es halt an den button-stil anpassen) und es fällt garnich auf.

würde halt wieder ein paar umbaumaßnahmen nötig machen - aber in beiden fällen. wobei ich fast zu get tendieren würde. aber ich überlass die entscheidung dir. gut, das wäre dann ja quasi auch schon c) gewesen ^^ e) hattest wie gesagt recht. habsch die wechstaben verbuchselt 

dann ben: wie gesagt, das mit dem salt war für mich interessant, das mein tipp ins blaue richtig war ^^ und das mit dem optionalen ?> war mir bisher unbekannt - wieder was gelernt  wegen thema sicherheit: es ist einfach ein sekundäres problem. primär muss das ding erstmal laufen. lass es mich so formulieren: derzeit wöllte es einfach keiner hacken  also müssen wir es erstmal hacker-attraktiv machen und dann mit ner hunderschaft absichern ! xD aber auch wenn es nur sekundär ist, ist nie verkehrt sich damit mal auseinanderzusetzen *denk* is auch ein thema, das für mich noch sehr interessant ist, da ich damit bisher kaum in berührung gekommen bin und nur md5 kenn.

letzter post: dürfte hoffentlich auch geklärt sein (mit den ersten sätzen).


edit: ja stimmt ben, einfach tag = ts ist richtig *wald bäume...* xD


----------



## BenRo (22. Juli 2014)

DarkMo schrieb:


> zuerst, weil mir grad die schuppen von den augen fallen: ich hab dir den falschen index vorgeschlagen ^^ häng mal nich b an ts an sondern a


Absolut korrekt. Ist mir nicht aufgefallen. In Zukunft aussagekräftige Variablennamen nehmen. $a und $b ist Mist. Und ein guter PHP-Editor/IDE macht Autovervollständigen, sodass man längere Variablennamen auch nicht ausschreiben muss.


----------



## DarkMo (22. Juli 2014)

ich war gestern mit der $now variable für das autologout per timeout auch versucht, den länger zu machen 
$now__really_now__yeah_this_now oder sowas wars


----------



## boss3D (22. Juli 2014)

Bitte eines nach dem anderen ... bleiben wir erstmal beim Datum.

Also der Code schaut jetzt so aus:
	
	



```
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
    
            $eintragen1 = mysqli_query($mysqli, "INSERT INTO projekte (taetigkeit,  produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt')");  
            $taetprodid = mysqli_insert_id($mysqli);
        
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($a * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];                              
                    $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                }
            }
        }
    }
```
Aber in der DB landet immer noch kein Datum, nur "0". 
(datum ist bei mir in der DB übrigens INT(20), falls das was zur Sache tut)

BTW: Ich schreibe die Codes im Notepad++. Eclipse ginge für php auch, aber da bin ich erst gestern draufgekommen.


----------



## DarkMo (22. Juli 2014)

ok, wollt grad was anderes schreiben, aber ich glaub ich habs. bei der ts-berechnung MUSS das b bleiben. b steht ja für die wochentage und für die bauen wir den timestamp. also änder mal bei der berechnung das a wieder in b und schau obs funktioklappt.


----------



## boss3D (22. Juli 2014)

Ja, jetzt kriege ich auch diese lange Zahl in die DB geschrieben. 

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

Zur Verdeutlichung:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



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



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

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

Als nächstes wäre jetzt noch das Durchschalten der KWs in der Ausgabe zu richten. Aber das nehme ich mir erst morgen in der Arbeit vor. Ist ja eh schon wieder in wenigen Stunden. Wahnsinn, wie die Zeit vergeht ...


----------



## DarkMo (22. Juli 2014)

gute frage, weis ich echt nich, wieso weshalb warum :/ kannst du nochmal deinen jetzigen stand zippen? dann kann ich ggf schonmal schauen, ob ich das mit dem "seite sichern" unkompliziert reinbekomm. hab zwar keine echte hoffnung, dass das irgendwas an diesem "caching" ändert, aber nuja. vllt find ichs nebenher ^^


----------



## boss3D (23. Juli 2014)

Hier nochmal die Version von gestern Abend, die nun wirklich sehr gut funktioniert (bis eben auf das Durchschalten der KWs in auswertung.php/auswertung2.php), auch hier in der Firma: *


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



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

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

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

_PS: Wie im Vorposting gesagt, den dort genannten Fehler kannst du vergessen, ist nicht reproduzierbar.
_
[EDIT]
Was mich noch interessieren würde: Meinst du, unser Session-System hält dem Fall stand, dass sich mehrere MAs gleichzeitig und unabhängig voneinander auf der Website einloggen und ihre Daten eintragen wollen? Das wäre nämlich ein zu erwartendes Anwendungs-Szenario.

[EDIT2 zum PS]
Gerade wieder den Fehler erlebt. Aber ich krieg's nicht raus, ob ich den durch irgendwas bestimmtes auslöse. Bis jetzt kommt mir das sehr zufällig vor, eben nicht reproduzierbar.


----------



## TessaKavanagh (23. Juli 2014)

Der m.E. beste PHP-Code Editor heißt *TROMMELWIRBEL* "PHP-Coder"


----------



## DarkMo (23. Juli 2014)

wegen dem edit: ich gehe stark davon aus, dafür wurde der krams ja gebaut ^^ mehr als ne session starten geht ja von unserer seite nich. wie der die session id's vergibt usw...


jut, wegen der "section" geschichte, hier mal meine umbauten bisher:
config.php:

```
<?php
    //...    
    function logout() {
        [B][COLOR=blue]session_unset();[/B]
        session_destroy();
    }
    
    $protokoll = '';
    [B][COLOR=blue]$section = 'login';[/B]
    $site_title = 'Login';
    
    // ...

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

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

als nächstes müssen wir die auch anwenden -> html_header.php:

```
// ...
echo '      <form action="index.php[COLOR=blue][B]?section='.$section.'[/B]" method="post">';
// ...
```

uuuund auswerten ^^ -> formular.php:

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

    // ...

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

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

eventuell hast du es bemerkt: am ende hab ich noch 2 neue buttons mit aufgenommen: btnRegCancel existierte schon in der reggen-form, der name war bisher aber unnötig. jetzt muss man den aber auch mit beachten, damit man wieder ordentlich zum login kommt. genauso hab ich die "zurück" buttons in auswerten und auswerten2 mit nem namen belegt:

```
// ...
echo '<br><input type="submit" value="Einträge editieren" [COLOR=blue][B]name="btnOutputCancel"[/B]>Zurück zur Eingabe ...</div><br>';
// ...
```
ist identisch in beiden.


und dann schlussendlich müssen wir unseren wichensteller noch aktualisieren -> index.php:

```
<?php
    session_start();
    [B][COLOR=blue]session_regenerate_id();[/B]

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

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

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


aso, fast vergessen: in auswerten2.php haste ja den usernamen, den du übergibst. allerdings prüfst du dann (ganz oben im code) nur, ob das feld gesetzt ist, nicht aber, ob es inhalt hat. und ob die db dir irgendein ergebnisliefert, prüfste auch nicht *glaub*


----------



## boss3D (23. Juli 2014)

^^ Scheint zu funktionieren. BTW habe ich ein bisschen an der Optik gedreht (*


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

*).

Eines ist mir noch eingefallen: Wir haben ja in der Ausgabe den "Editieren" Button. Wenn man drauf klickt, landet man wieder beim Eingabeformular. Dort sollten jetzt aber die ursprünglich eingegebenen Werte angezeigt werden. Tessa's Tipp waren da vorbelegte Felder. 
Meine Idee zur Umsetzung wäre jetzt, a) die Felder anhand der Werte aus der DB für die jeweilige Zeile vorzubelegen (irgendwie so: if (isset($_POST('btnOutputCancel') { ))) und dann b) in einer Bedingung UPDATE statt INSERT zu sagen wenn wieder "Bestätigen" gedrückt wird. Wie genau, muss ich mir jetzt überlegen ...


----------



## TessaKavanagh (23. Juli 2014)

Ich entschuldige mich übrigens das ich mich derzeit nicht beteilige, aber momentan habe ich ne Azubine hier und somit deutlich mehr Arbeit als normal x-D. Da finde ich einfach keine Zeit.


----------



## boss3D (23. Juli 2014)

Puh, ist das ne zähe Angelegenheit ...
--------

Um mir im Gesamtcode nichts zu ruinieren, versuche ich, das erstmal in einem unabhängigen File "vorbeleg.php" zu erstellen:

```
<?php    
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASS', 'root');
    define('DATABASE', 'projektzeiterfassung');
    
    $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, DATABASE);
    if ($mysqli->connect_errno) {
        echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }

    echo '<table>';

    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_t))
        while ($row_t = mysqli_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
        }
    } 
    echo '</table><br>';
```
Die Werte aus der DB holen, ist ja kein Problem (auch wenn ich mir noch überlegen muss, wie ich die Klarnamen anstatt der IDs kriege). 

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

Das nächste wäre dann: Wo soll ich meine ermittelten IDs einsetzen? Hier z. B. ...
	
	



```
echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
```
... hätte ich es in beiden [ ] versucht, erfolglos.  

Lediglich das hier funktioniert bis jetzt super:
	
	



```
echo '<td><input name="beschreibung'.$a.'" value="'.$row_beschid[0].'" type="text" size="50" maxlength="250"></td>';
```
Und wie ich das mit den Stunden machen soll, v. a. wenn da mehrere zu einem Eintrag gehören, muss ich mir auch erst noch überlegen. Irgendwo in der unteren Schleife dann?!


----------



## DarkMo (23. Juli 2014)

wegen deiner trennung in eingabe und ausgabe ist das nich so ohne (falls überhaupt möglich). folgendes bsp, wie das von tessa gemeint war:

```
<?php
  echo '<form action="self.php" method="post">';  // also ruft halt sich selbst auf ^^
  echo '<input type="text" name="myInput"';
  if(isset($_POST['myInput'])) echo ' value="'.$_POST['myInput'].'"';  // hierrauf kommts an. ist nen post-wert für das feld gesetzt, gib ihn als defaultvalue an
  echo '>';
  echo '<input type="submit" value="send">';
  echo '</form>'
?>
```
was bei dir also durchaus ohne probleme geht: im fehlerfalle die daten wieder anzeigen lassen. was gespeichert is, ist gespeichert. das brauch man nich wieder anzeigen. wird bei dir halt etwas haariger, da du ja mehrere zeilen hast. mein vorgehen wäre allgemein so:
- eine weitere globale hinzufügen (also in config.php), die zum bsp $form_ok heißt und true ist.
- bei registrieren und login ist das noch simpel. im fehlerfalle wird form_ok auf false gesetzt und der eben eingebene username wieder automatisch eingetragen (pw soll er selber neu eintragen).
- bei deinem pze... da wirds wie gesagt happiger. hier würde ich ein array erstellen (beim confirm button abarbeiten), dass für jede eingabezeile wieder ein array enthält mit den dortigen daten. ach mensch, ich hab da so schöne ideen, das ist aber gleich wieder kompliziert ^^ also mal die simple variante: immer, wenn eine eingabezeile nen fehler enthält, wird eine array-"zeile" angelegt

das array würde ich so aufbauen:

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

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

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


das hier ist jetzt rein optional:
meine fortführende idee wäre gewesen, noch zu vermerken, WELCHES feld dabei nen fehler geschmissen hatte. dabei müsste man die einzelnen werte nochmal unterteilen in nen weiteres array. also statt error[...][t] = value müsste man dann bspw error[...][t][val] = valueund error[...][t][err] = true speichern. hierbei müsste man aber eben auch zwingend das ganze vor dem check auf richtigkeit mit false belegen. das wären geringe unterschiede zum code eben:

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

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

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

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

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





edit:
fast vergessen: wegen dem hier
// hierrauf kommts an. ist nen post-wert für das feld gesetzt, gib ihn als defaultvalue an
ist es ein problem, dass "später" nochmal anzuzeigen. wüsst auch garnich wozu. also du speicherst krams, wechselst zur ausgabe, wieder zurück zur eingabe - und joa, da isses natürlich dan geschehen um deine post-werte. die sind längst weg ^^


----------



## TessaKavanagh (23. Juli 2014)

POST Werte kann man m.E. mit PHP-Only als POST nur durchschleifen wenn man Sie auf jeder "Seite" über ein Formular zwischenpuffert.

Ich würde daher Vorschlagen ein Objekt z.B. (Post_Werte) anzulegen, welches die Nutzereingaben nach dem Absenden aufnimmt. Dieses kannst du dann mit serialize in einer einzelnen $_SESSION['post_werte'] ablegen und hast somit auf jeder neuen Seite zugriff auf die Daten.


----------



## boss3D (23. Juli 2014)

@ DarkMo
Sorry, aber bei deinem Ansatz komme ich gar nicht mit. Ehrlich gesagt k. A. wovon du redest. Fehlerfall? Was denn für Fehler bitte?

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

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

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

[EDIT]
Hier mein aktuellster Versuch:
	
	



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

    echo '<table>';

    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_t))
        while ($row_t = mysqli_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

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

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

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

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            if (isset($stunden[$ts])) {
                echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$stunden.'" maxlength="6" size="4"></td>';
            } else {
                echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
            }
        }
    } 
    echo '</table><br>';
```
^^ Die Zeit lese ich scheinbar noch falsch aus und bei Tätigkeiten und Produkte weiß ich nicht, wo ich jetzt mit dem ausgelesenen Index hin soll ...


----------



## DarkMo (23. Juli 2014)

ach du redest einfach nur vom editieren? mach das doch beim ausgeben mit rein und fertig is der lack. hinter jede ausgegebene zeile nen edit button und wenn man druff drückt, erhält man (nach neuladen der seite - wenn man auf js verzichten mag) halt genau diese zeile wieder mit den inputfelderchen, vorselectiert/mit werten bestückt, die halt aus der db kommen. is genau das selbe wie die simple ausgabe, nur dass du eben statt dem wert direkt auszugeben, ihn als value in nem input ausgeben lässt. ich hätte eh wie gesagt eingabe, ausgabe UND editieren alles in einem verbaut. find das irgendwie blödsinn, das alles aufzuspalten. hast am ende 10mal die selbe tabelle gebaut für nix und wieder nix ^^


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


----------



## boss3D (23. Juli 2014)

^^ Ja, einfach nur Zeile editieren und UPDATE DB ... um mehr geht's jetzt erstmal gar nicht. 

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

Wie auch immer, so wie ich das sehe, brauche ich so oder so mal einen Code, der unsere Eingabezeile mit Werten vorbelegt. Und daran arbeite ich ja schon die ganze Zeit, kriege es aber aufgrund der im Vorposting genannten Probleme (noch) nicht hin ...


----------



## DarkMo (23. Juli 2014)

wie gesagt, MEIN ansatz drehte sich um was völlig anderes ^^ DEIN problem is mMn simple as hell 

gut, ich poste einfach nochmal deine komplette auswerten.php mit meinen änderungen:

```
[COLOR=gray]<?php
    $sql = "SELECT
                t.taetigkeit AS Taetigkeit,
                p.produkt AS Produkt,
                t.id AS tID,
                p.id AS pID,
                [COLOR=black][B]pr.id AS prID,[/B]                pr.beschreibung AS Beschreibung,
                u.name AS User,
                z.zeit AS Zeit,
                z.datum AS Datum
            FROM
                zeiten AS z,
                projekte AS pr,
                user AS u,
                taetigkeiten AS t,
                produkte AS p
            WHERE
                z.datum >= '".$wochenanfang."' AND
                z.datum <= '".$wochenende."' AND
                u.name = '".$user."' AND
                u.id = z.userid AND
                pr.id = z.taetprodid AND
                pr.taetigkeit = t.id AND
                pr.produkt = p.id
            ORDER BY
                z.datum ASC;";
[COLOR=darkorange]            // ich musste das mal auftrennen, alles in einer zeile, da blickt ja kein schwein durch :P    $db_erg = mysqli_query($mysqli, $sql);
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }

    [COLOR=darkorange]// aus pze kopiert    [COLOR=black][B]$taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_t))
        while ($row_t = mysqli_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

    $products = array();
    $res_p = mysqli_query($mysqli, "SELECT * FROM produkte") or die ("Get Produkte failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_p))
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }[/B]
    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="10" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <tr>
                <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>
            </tr>';
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                [COLOR=black][B]$row_collector[$row['tID']]['data'][$row['pID']]['prID'] = $row['prID'];[/B][COLOR=darkorange]    // unsere projekt-id mit sichern                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[0] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+3] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+3] = ' ';
                    }
                }
                echo '  <tr>';
                [COLOR=darkorange]// schauen, ob der edit-button gedrückt wurde                [COLOR=black][B]i[/B][B]f(isset($_POST['edit'.$row_collector[$taet_id]['data'][$prod_id]['prID']])) {
                    [/B][COLOR=darkorange]// baue die inputzeile nach[B]
                    echo '<td><select name="taetigkeit">';
                    foreach ($taetigkeiten as $taetigkeit) {
                        echo '<option value="'.$taetigkeit['id'].'"';
                        [COLOR=blue]if($taetigkeit['id'] == [/B][COLOR=gray][COLOR=black][B][COLOR=blue][B]$taet_id[/B]) echo ' selected="selected"';  [/B][COLOR=blue][COLOR=darkorange]// autoselect wenn option-value = db-wert[B]
                        echo '>'.$taetigkeit['taetigkeit'].'</option>';
                    }
                    echo '</select></td>';

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

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

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

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

    echo '<br><input type="submit" value="Einträge editieren" name="btnOutputCancel">Zurück zur Eingabe ...</div><br>';
    echo '<div class="controls"><input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File"></button></div>';
```
würde dann nur noch das updaten in formular.php fehlen. da muss ich mal grübeln, wie man das effizient macht.


----------



## boss3D (23. Juli 2014)

Optisch stimmt's und der "edit" bzw. "save" Button "öffnet" bzw.  "schließt" die Zeile auch für Eingaben. Was noch NICHT passiert, ist,  dass sich auch in der DB was ändert. Da muss ich jetzt in _formular.php_  noch irgendsowas ...
	
	



```
if (isset($_POST['edit'])) {
    $update = mysqli_query($mysqli, "UPDATE ...");
}
```
... reinbasteln, oder?


----------



## DarkMo (23. Juli 2014)

jops, nur eben mit dem save statt edit. das größte prob ist mMn eben, rauszufinden, zu welcher prj-ID der eintrag gehört. denke mal es ist besser, wenn man das post-array durchläuft statt alle projekte der db ^^ also sowas in der art:

```
foreach($_POST as $key => $val) {
  if(startsWith($key, 'save')) {
    $prID = (int)substr($key, 4);
    update projekt where id = $prID;
    updated alle zeiten where prID = $prID;
  }
}
```
wegen der startswith funke:
string - startsWith() and endsWith() functions in PHP - Stack Overflow
einfach mit reinkopieren. kannst meinetwegen auch ne functions.php bauen und die bei index.php mit includieren oder so, wenn du das getrennt haben magst.


----------



## boss3D (23. Juli 2014)

Ja, das mit der dynamischen id war auch in meiner Logik der Knackpunkt. Ich hätte eben nach dem INSERT "$queryid = mysqli_insert_id();" gesagt, und dann diese $queryid irgendwie weiterzuverwenden versucht. Aber natürlich blöd, dass das INSERT in einer Schleife steht und sich da ein Wert nicht lange speichern lassen wird ...

Ich schaue mir mal _formular.php_ an.

[EDIT]
So hätte ich es jetzt hingebastelt, aber so geht's nicht:
	
	



```
if (isset($_POST['save'])) {
    foreach($_POST as $key => $val) {
        if (startsWith($key, 'save')) {
            $prID = (int)substr($key, 4);
            //update projekt where id = $prID;
            $update_projekte = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            //updated alle zeiten where prID = $prID;
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts]) and $_POST[$ts] != "") {
                    $dauer = $_POST[$ts];                              
                    $update_zeiten = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."', datum='".$ts."' WHERE taetprodid='".$prID."'");
                }
            }
        }
    }
}
```


----------



## DarkMo (23. Juli 2014)

entwickel solche schleifen am besten stück für stück mit "echo debugging". also
foreach... echo key...
foreach... if startswith... echo jop ^^
foreach... if startswith... prID = substr... echo prID...

dann kannst du schritt für schritt nachvollziehen, welche werte du da so behandelst, ob das überhaupt hinhaut usw. aber grundsätzlich sieht das sehr gut aus. aso, bei post[ts] <- das a weglassen ^^


edit: seh ich jetzt erst: das if isset post save... das weglassen. diesen button gibts nich, daher wird der code auch nie ausgeführt werden ^^ mit unserem durchlaufen des post arrays versuchen wir ja unseren save-button zu finden.

edit2: man könnte zur absoluten sicherheit diese if verschieben, ca so hier:

```
[COLOR=red][B]if (isset($_POST['save'])) {[/B]foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        [B][COLOR=seagreen]if (isset($_POST['save'.$prID])) {[/B]
            //update projekt where id = $prID;
            $update_projekte = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            //updated alle zeiten where prID = $prID;
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts]) and $_POST[$ts] != "") {
                    $dauer = $_POST[$ts];                              
                    $update_zeiten = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."', datum='".$ts."' WHERE taetprodid='".$prID."'");
                }
            }
        [B][COLOR=seagreen]}[/B]
    }
}
[B][COLOR=red]}[/B]
```
also von rot nach grün. bei grün dann eben die ermittelte prjID anhängen.


----------



## boss3D (23. Juli 2014)

Die .$a hatte ich bereits gelöscht, aber du hast wohl meine allererste, noch nicht editierte Version gesehen. Auch "zerlegt" hätte ich die Schleife schon gehabt, den Fehler aber trotzdem nicht gefunden.

Dein jetziger Code (ohne das rote) liefert:





> *Fatal error*:  Call to undefined function startsWith() in *C:\xampp\htdocs\db\formular.php* on line *154*


Komisch, wo die Zeile doch zuvor ganz gleich ausgeschaut, aber keinen Fehler geliefert hat ...


----------



## DarkMo (23. Juli 2014)

ja wie gesagt, die funktion musst du selber bauen. dazu war der link gedacht -> anschauen + copy'n'paste ^^


----------



## boss3D (23. Juli 2014)

Ist klar ...
-----------

Jedoch macht dieser Code jetzt nichts anderes, als mir editierte Einträge zu LÖSCHEN und am SO "0" einzutragen.  Also das war nicht das Ziel ...

```
function startsWith($haystack, $needle) {
        return $needle === "" || strpos($haystack, $needle) === 0;
    }
    
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            $update_projekte = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts]) and $_POST[$ts] != "") {
                    $dauer = $_POST[$ts];                              
                    $update_zeiten = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."', datum='".$ts."' WHERE taetprodid='".$prID."'");
                }
            }
        }
    }
}
```


----------



## DarkMo (23. Juli 2014)

hmm, ich befürchte, ich weis wieso. du überschreibst einfach alles, egal was so drin steht. man müsste also irgendwie prüfen, obs ne eingabe gab. eine möglichkeit wäre, direkt im sql string... da fällt mir noch was uff:
"UPDATE zeiten SET zeit='".$dauer."', datum='".$ts."' WHERE taetprodid='".$prID."';"
du schaust nur nach der projekt-id, du willst aber nur ein bestimmtes datum ändern. also müsste das wohl eher so aussehen:
"UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."';"
also du willst ja NUR die zeit ändern. eventuell wars das schon. test mal.



edit:
kleine randnotiz:
auf diese weise kannst du "0 einträge" erstellen. also du speicherst nen neuen eintrag mit paar zeiten. dann editierst du das wieder, und setzt die zeiten auf 0. ein eintrag mit zeit=0 ist aber an und für sich sinnfrei und könnte gelöscht werden.

jetzt ist die frage, wie du das handhaben wölltest. da es ja nur 7 einträge pro woche und projekt sind, könnte es sein, dass die zumüllung nich sooo schlimm ist. zudem ist fraglich, wie oft solch eine "pseudolöschung" vorkommt. ausserdem kanns wieder editiert werden und plötzlich erhält das datum zu dem projekt wieder nen wert. und in dem falle würde es die alte id weiternutzen und keine neue anlegen. für ordnung sorgen wöllt ich aber dennoch. kannst ja dem admin nen "db säubern" button zur hand geben, der dann solche 0-einträge rauskachelt.


btw, was mir gerade auffällt: deine sql strings sind user-übergreifend. du solltest also noch ein where user = userid anfügen. bei mir haben auch die projekte so eine id. kA ob du das auch so hast und für nötig erachtest.


----------



## boss3D (23. Juli 2014)

Also bis auf die Zeit lässt sich alles ändern und auch richtig in die DB eintragen. Aber bei der Zeit hilft auch deine zweite Version nichts ...


----------



## DarkMo (23. Juli 2014)

ich teste grade selber nochmal. edits haste gelesen gehabt?

anmerkung: hab grad in formular.php enddeckt, dass du 2mal den logout button behandelst ^^ daher könnte auch der olle fehler mit der session id kommen 



edit: gerade kam mir noch ein geistesblitz: wie eben beschrieben eigentlich (bzw hats damit zu tun). wir tun ja nur updaten. wenn es diesen zeit-eintrag aber noch garnich gibt, müssen wir ein insert machen. also müssen wir (zumindest bei den zeiten) erstmal checken, obs diesen eintrag überhaupt gibt. gibts ihn schon (where datum und prjid und userid stimmt) -> update, else insert.

weiterhin kann man testen (im insertfall), ob die zeit "" ist (oder 0) - dann kann man sich das insert sparen.


----------



## DarkMo (23. Juli 2014)

wegen dem excel zeugs... was hattest du denn für ne lösung gefunden? ich find nur irgendwelche packages - kann php da nix von haus aus? oder is das zuviel des guten? ^^ hab jetz jedenfalls das hier öfters gelesen: Spreadsheet_Excel_Writer

ganz unten steht da noch was wegen abhängigkeiten. php 4.1 is kein ding, dann wohl eine grundinstall von diesem pear zeugs (das teil ausm link ist wohl nur ne art addon) und irgendein ole oO deswegen mag ich den rotz immer nich :/ 1000 sachen die man sich aufs system müllt -.- vllt versteh ichs auch nur falsch. jedenfalls war hier mal nen erster einblick:
Manual :: Wie Excel-Dateien erzeugt werden.

das sieht ganz brauchbar aus und ließe sich locker mit unserem bisherigen code umsetzen *denk*


----------



## boss3D (23. Juli 2014)

Dass wir überhaupt erst auf bestehende Einträge prüfen müssen, hatte ich kurz vor Arbeitsschluss gerade noch gesehen. Es war ja auch meine ursprüngliche Idee, irgendwie ein _if bla INSERT else UPDATE_ zu basteln. Kommen wir also eh wieder dahin zurück ... 

Ich werd's aber wahrscheinlich zeitlich erst morgen in der Arbeit schaffen.

Zum Excel:
"Meine" Lösung habe ich im Web gefunden und sie hat derzeit noch 2 "Probleme". Das eine ist, dass es eigentlich ein "Trick" ist. Es wird nämlich in Wahrheit ein CSV exportiert und sofort in Excel geöffnet. Das stört allerdings nicht weiter, deswegen "Probleme" in Anführungszeichen. 
Das andere ist, dass aus mir noch unerfindlichen Gründen der gesamte Inhalt der Website (also alles inkl. Buttons ) exportiert wird, und nicht bloß Dinge, die in der DB stehen. Ich zeige morgen einen Screenshot.

Hier der Code (soweit ich es geschafft habe, den nach mysqli abzuändern):
	
	



```
<?php       
    $header = '';
    $result ='';
    $exportData = mysqli_query($mysqli, "SELECT * FROM projekte, zeiten") or die ("Sql error : ".mysqli_error());
     
    $fields = mysql_num_fields($exportData);
     
    for ($i = 0; $i < $fields; $i++) {
        $header .= mysql_field_name($exportData, $i)."\t";
    }
     
    while ($row = mysql_fetch_row($exportData)) {
        $line = '';
        foreach ($row as $value) {
            if ((!isset($value)) || ($value == "")) {
                $value = "\t";
            } else {
                $value = str_replace('"', '""', $value);
                $value = '"'.$value.'"'."\t";
            }
            $line .= $value;
        }
        $result .= trim($line)."\n";
    }
    $result = str_replace("\r", "", $result);
     
    if ($result == "") {
        $result = "\nNo Record(s) Found!\n";
    }
     
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".$user.".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    print "$header\n$result";
```
Vermutlich liegt's an den headern unten, alles andere schaut m. E. "sauber" aus.


----------



## BenRo (23. Juli 2014)

CSV schreiben ist immer ein einfacher Weg und kann von Excel gelesen werden.

Edit: Haste ja schon selber rausgefunden.

Zu deinem Problem mit der ganzen Seite: Wird wirklich nur der Code, den du gerade zitiert hast ausgeführt? Nichts vorher includet oder so?


----------



## boss3D (23. Juli 2014)

BenRo schrieb:


> Zu deinem Problem mit der ganzen Seite: Wird wirklich nur der Code, den du gerade zitiert hast ausgeführt? Nichts vorher includet oder so?


Bei meinen früheren "Chaos-Codes" hatte ich dieses Problem nicht, da wurde wirklich nur DB-Inhalt nach Excel exportiert. 
Ich führe zwar auch jetzt noch nur diesen _export.php_-Code bewusst aus, es kann aber sein, dass DarkMo's _index.php_ mir da jetzt "dazwischenfunkt". Ich kann leider erst morgen in der Arbeit wieder weitermachen. Heute habe ich nur noch Stress mit anderen Dingen ...

Hier noch der ganze Code, soweit ich heute noch mitgekommen bin (das aus DarkMo's letzten ein oder zwei Postings fehlt mir noch): 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



BTW: Ich habe heute mit dem Admin der Firma geredet und der hat gemeint, dass die Integration meines Codes auf dem Server überhaupt kein Problem und höchstens eine Arbeit von 2 Stunden werden wird. Angeblich läuft auch auf diesem Server xampp, oder zumindest ist das Setup sehr ähnlich, soweit ich das mitgekriegt habe.


----------



## BenRo (23. Juli 2014)

Hmmm ... also die ganze Seitenstruktur ist eher suboptimal. Ich finde zum Beispiel dieses riesige allumspannende Formular nicht so doll, wird bei späteren Erweiterungen zu Problemen führen. Aber so kurz vor Schluss noch strukturell was zu ändern wär auch quatsch. 

Eine Möglichkeit wäre in index.php, die Dateien html_header.php und html_footer.php nur dann zu includen, wenn $_POST['export'] gesetzt ist. Das ist wahrscheinlich das einfachste und schnellste.

Eine alternative Möglichkeit wäre, anstatt des Export-Buttons einen Link zu setzen. Dann müsstest du noch den Code für die Datenbankverbindung aus config in die export-Datei kopieren oder includen.


----------



## boss3D (24. Juli 2014)

Habe gerade was interessantes festgestellt: Wenn ich einen DB-Eintrag OHNE Beschreibung erstelle (ist ja legitim und kann auch vorkommen), den Eintrag dann aber editiere und eine Beschreibung hinzufüge, wird die über den UPDATE Befehl ganz normal eingetragen. 

1) Wieso funktioniert also die exakt selbe Vorgehensweise über UPDATE bei Zeiten nicht? Da müsste ja dann auch einfach ein leeres Feld mit einer Zahl geupdatet werden?!
2) So gesehen ist dann eigentlich UPDATE "mächtiger" als INSERT, weil UPDATE Werte eintragen UND überschreiben kann, oder?


DarkMo schrieb:


> anmerkung: hab grad in formular.php enddeckt, dass  du 2mal den logout button behandelst ^^ daher könnte auch der olle  fehler mit der session id kommen


Falls du das mit session_destroy() und der angeblich uninitialized session gemeint hast, nein, das kommt auch jetzt noch, wo ich den Logout nur noch einmal behandle. Das liegt an was anderem.

[EDIT]
Gerade noch was gesehen: Wenn ich statt ...
	
	



```
if (isset($_POST[$ts]) and $_POST[$ts] != "") {
```
... nur ...
	
	



```
if (isset($_POST[$ts])) {
```
... sage, dann kann ich zumindest schon mal bestehende Zeit-Einträge ändern. Muss ich mir nur noch was wegen leerer Felder überlegen.

[EDIT2]
Noch was gesehen, das mir gerade komisch vorkommt: Versuchen wir hier nicht, zwei mal den Timestamp einzutragen? $ts und $dauer ist ja eigentlich das selbe?!
	
	



```
$ts = $wochenanfang + ($b * 60 * 60 * 24);
if (isset($_POST[$ts]) and $_POST[$ts] != "") {
     $dauer = $_POST[$ts];                              
     $update_zeiten = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."'");
}
```


----------



## TessaKavanagh (24. Juli 2014)

Dauer und Datum dürften eigentlich nicht gleich sein. Das würdest du auch sofort in der DB sehen steht da die gleiche Zahl? Ansonsten ist es nur eine unglückliche Benennung der Variablen.

Denn das eine ist 3h am Produkt gearbeitet und das andere ist am 19.07.2014 am Produkt gearbeitet.


----------



## boss3D (24. Juli 2014)

In der DB landet schon was unterschiedliches, ist dann wirklich nur eine etwas irritierende Variablenbezeichnung ...

Ich hab's jetzt so probiert, aber klappt immer noch nicht. $dauer ist ja sowieso gesetzt, wenn $_POST[$ts] gesetzt ist, oder? Somit ist meine Überprüfung sinnlos?! Irgendwie blicke ich gerade nicht durch, wie ich überprüfen soll, ob ein Stundenfeld belegt ist oder nicht ...

```
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            $update_projekte = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts]) and $_POST[$ts] != "") {
                    $dauer = $_POST[$ts];
                    if (isset($dauer)) {
                        $update_zeiten = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."'");
                    } else {
                        $update_zeiten = mysqli_query($mysqli, "INSERT INTO zeiten (zeit, datum) VALUES ('$dauer', '$ts') WHERE taetprodid='".$prID."'");
                    }
                }
            }
        }
    }
}
```


----------



## DarkMo (24. Juli 2014)

wegen update: du begehst gerade einen denkfehler ^^ ein projekt ist EIN datensatz. sprich alle spalten sind schon in der db - nur eben ggf "leer". änderst du die beschreibung, wird im bestehenden projekt-eintrag nur die beschreibungsspalte geändert. die html-tabellen-repräsentation stimmt also mit der db tabelle bis beschreibung überein, wenn man so will. die zeiten sind aber alle wiederrum einzel-datensätze, die über die prID diesem projekt zugeordnet werden. sprich jede spalte der html-tabelle entspricht einem kompletten datensatz (einer zeile) der db-tabelle zeiten.

in kurz: beschreibung existiert schon in der projekt-zeile und kann somit geupdated werden. die einzelzeiten hingegen müssen nicht zwingend schon existieren, da nur daten mit nem validen zeit-wert gespeichert werden. html-tabellenfelder die leer sind (bei der ursprünglichen speicherung) sind nicht in zeiten angelegt worden (hier eben der unterschied zu den projekt-daten. obwohl das beschreibungsfeld leer ist, ist es dennoch schon durchs projekt in der db angelegt worden.

hoffe, ich konnte es einigermaßen verständlich erklären ^^ nochmal nen bildlicher versuch:

```
+-----------+---------+--------------+----+----+----+----+----+----+----+
| [B]tätigkeit[/B] | [B]produkt[/B] | [B]beschreibung[/B] | [B]mo[/B] | [B]di[/B] | [B]mi[/B] | [B]do[/B] | [B]fr[/B] | [B]sa[/B] | [B]so[/B] |
+-----------+---------+--------------+----+----+----+----+----+----+----+
|  [COLOR="red"]kochen   |  [COLOR="red"]kaffe  |              |  [COLOR="seagreen"]3 |    |  [COLOR="blue"]1 |    |    |    |  [COLOR="purple"]5 |
+-----------+---------+--------------+----+----+----+----+----+----+----+
 \__________________________________/   |    |    |    |    |    |    |
                  |                     |    |    |    |    |    |    |
              prID: [COLOR="red"]28           zID's: [COLOR="seagreen"]1         [COLOR="blue"]2                   [COLOR="purple"]3
```


dabei fällt mir noch die ein oder andere grundsatz sache ein. erstmal: beim editieren sollte man das projekt selber nicht ändern können *mein* also die tätigkeit/produkt-kombination. läuft im endeffekt darauf hinaus, dass die ersten beiden spalten NICHT editierbar werden (und somit die selects und nen stückl arbeit rausfliegen). kommt irgendwie doof, wenn man an projekt a gearbeitet hat und dann plötzlich alle zeiten nem ganz anderen projekt quasi zuschiebt ^^ also die db-id's bleiben ja die selben, aber eben die bedeutung/semantik bla ändert sich. hoffe, du weißt, was ich mein.
das nächste wäre die projekt-user-id. macht die sinn? ich dachte ursprünglich irgendwie schon, so dass man gezielt die projekte der mitarbeiter unterscheiden kann. aber im endeffekt kann man das ja über ihre zeiten tun. und ich denke nicht, dass die leute nicht auch zusammen ein projekt bearbeiten können oder? daher denke ich, wäre es recht sinnvoll, wenn man die user-id aus der projekte tabelle verbannt. aber das musst dann du entscheiden ^^ du weißt eher, wie es abläuft 

in dem zusammenhang hab ich scho wieder ideen... xD aber erstmal weiter im text:
das mit destroy is natürlich schade - hatte mich schon gefreut 
wegen den leeren feldern - stimmt natürlich. bei den zeiten dürfen auch leere felder angegeben werden. ich gehe jetzt mal von der "ordentlichen" variante aus, das "leer-updates" (also eine zeit, die genullt wird) aus der db gelöscht werden. dann sollte das in etwa so aussehen *denk*

```
- wir haben unseren button mit der prID gefunden...
- einfach stumpf immer projekte updaten (- aber NUR die beschreibung -> wenn meine anmerkung oben auf anklang stößt ^^).
- für jeden wochen-tag:
  - ts berechnen
  - if isset ts kann man mMn sogar ganz weglassen - das is sicher gesetzt, beim save button. zur sicherheit kann die abfrage aber auch bleiben wenn du magst. nur eben das !="" weglassen
  - genau, dauer speichern
  - aha, hier kommts zum fehler ^^:
  - wenn dauer == "" -> delete from zeiten where user = userid and datum = ts (das wäre diese "sauber"-aktion)
  - sonst...
    - prüfen, ob es in zeiten einen eintrag mit diesem datum gibt, von unserem user zu dem projekt (select * from zeiten where user = userid and datum = ts and prID = prID)
    - wenn ja, update die zeit
    - sonst insert den datensatz
```
ohne die delete-prüfung würden vorhandene einträge einfach als genullt in der db bleiben und sie ggf irgendwann "zumüllen". dann sollte man aber wenigstens vorm insert prüfen, ob es kein "0 eintrag" ist. ich würde dann (ohne delete zeile) aber wie gesagt dem admin dann nen button zum händischen löschen dieser 0 einträge geben. also nich zum händisch löschen, sondern eben zum händischen anstoßen des löschens ^^

gut, wegen ts und datum, da hatte tessa ja schon gesagt, um was es sich handelt. es ist in der tat ne blöde variablen-namen vergabe ^^ datum sollte hier eher zeit heißen. weil das ist der wert, also die stunden, die der MA eingetragen hat ins feld. ts ist der timestamp zum tag, zu welchem diese stundenangabe gehört.


----------



## BenRo (24. Juli 2014)

Hier stand quatsch. Sorry. Es ist früh.


----------



## DarkMo (24. Juli 2014)

jain - beim editieren haben wir nur eine zeile, da ist dann kein anhängsel mehr ^^ eingabezeilen -> mehrfach. edit -> immer nur eine.


----------



## boss3D (24. Juli 2014)

@ DarkMo
Ein bisschen bin ich, glaube ich, mitgekommen, was du meinst ...

Jedenfalls will ich schon die ganze Zeile editierbar lassen, also auch Tätigkeit und Produkt. 

Was ich nicht verstanden habe: 
1) Was genau sollte nach deiner Idee deletet werden? Erwartest du, dass die MAs in ALLE Felder Zahlen eingeben, aber in nicht-benötigte eben 0er? Und diese 0er willst du dann löschen? Also wenn das die Idee ist, das klappt niemals. Die MAs werden mit Sicherheit auf der Website nicht mehr machen, als bisher in den Excel-Tabellen nötig war.
2) Was genau ist jetzt der Fehler bei mir?

So hätte ich es derzeit:
	
	



```
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            $update_projekte = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                $dauer = $_POST[$ts];
                if (isset($dauer)) {
                    $update_zeiten = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."'");
                } else {
                    $update_zeiten = mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."'");
                }
            }
        }
    }
}
```
^^ Das "if (isset($dauer)) {" ist sicher Blödsinn, aber da ist mir noch keine andere Bedingung eingefallen.


----------



## DarkMo (24. Juli 2014)

ok, beispiel szenario:
der MA gibt eine neue zeile ein. er wählt eine tätigkeit und ein produkt, bastelt ne beschreibung und trägt bei mo und mi werte ein.
-> das projekt wird angelegt (sofern noch nicht vorhanden (kann ja in vorhergehenden wochen schon bearbeitet worden sein) -> also tät-id, prod-id, beschr)
-> in zeiten wird für die daten (datums  ) "mo" und "mi" die zeit gespeichert, alle anderen felder sind leer gelassen worden und werden somit NICHT gespeichert

nun editiert der MA das später nochmal. er hat am sa nochmal dran gewerkelt und trägt das nun ein. dabei ist ihm ein fehler in der beschreibung aufgefallen, den er ausbessert und er hatte am di und nicht am mi gearbeitet - leert also das mi feld und trägt den wert im di feld ein.
-> beim projekt wird die beschreibung aktualisiert
-> bei den zeiten wird für den samstag die neue zeit eingetragen (insert) und ebenso wird für den dienstag verfahren. die beiden waren noch garnich in der db. die anderen tage sind wiederrum nur leere inputs
-> allerdings wird ja beim editieren auch bei leeren feldern erstmal geschaut, ob es dazu schon nen db eintrag gibt. dabei wird festgestellt, dass der mi nen wert hat. da die neueingabe aber eben ein leeres feld ist, wird der mi aus der db gekachelt.


man muss also nirgends explizit ne 0 reinschreiben oder so. mit "0 einträgen" meine ich eben schlicht diese leeren einträge. ein NULL wert bla ^^ caste "" mal nach int oder float oder so -> 0 


dein fehler ist schlicht und ergreifend, dass du nicht die db fragst, um entscheiden zu können, ob du nun updaten oder einfügen musst  die frage isset(datum) ist käse. klar ist datum gesetzt, haste ja die zeile davor erledigt ^^ aber allein mit den "anwendungs" daten wirst du frage nach update oder insert eben nicht gelöst bekommen. dazu musst du wissen, ob ein eintrag schon vorhanden ist oder nicht - und das weiß eben die db -> frag sie.


----------



## BenRo (24. Juli 2014)

isset($dauer) ist IMMER true, da es in der Zeile davor gesetzt wird.
Du meinst vermutlich isset($_POST[$ts])

EDIT: Google mal nach "ON DUPLICATE KEY UPDATE". Könnte dir weiterhelfen. Brauchst dann natürlich noch einen entsprechenden Index, aber das sollte das geringste Problem sein.

Hier wird das ausführlich erklärt - etwas einfacher zu lesen, als das offizielle SQL-Handbuch:
http://www.phpundmysql.de/2012/03/28/upsert-in-mysql-insert-on-duplicate-key-update/


----------



## DarkMo (24. Juli 2014)

ui, sowas hab ich immer gesucht (wenns das is, was ich denke). weil diese "doppelte" db anfrage hat mich scho immer genervt ><


----------



## boss3D (24. Juli 2014)

Ja, weil ich nicht weiß, WIE ich die DB fragen soll. Ich kann ja nicht in ein query ein isset reinbauen um zu schauen, ob ein Feld in einer Zeile einen Wert hat. Bzw. es haben ja immer ALLE Felder in unserer DB einen Wert (bestenfalls Beschreibung kann leer bleiben, sonst aber nichts) ...

BTW: Ob DB-fragen, oder Website-Felder mit isset auf Inhalt abfragen, läuft doch aufs selbe hinaus?! Wenn ein Feld einen Inhalt hatte, dann muss genau dafür auch was in der DB stehen, ergo weiß ich --> UPDATE. Hatte ein Feld keinen Inhalt (isset()=false), kann auch nichts in der DB stehen, ergo --> INSERT. 
Wieso also sollte mein Ansatz, den ich verstehen würde, nicht funktionieren? Warum die DB fragen?


----------



## DarkMo (24. Juli 2014)

na die "naive" lösung ist doch ganz simpel >< frag per select (das hab ich dir in meinem pseudocode ablauf da sogar schon ausformuliert) nach dem datensatz. wenn die db ein ergebnis liefert, gibt es so einen datensatz schon. ist das ergebnis leer, gibts den nicht.


zu dem on update... das scheints nur für key zu geben? für eine beliebige spalte wäre es mMn sinnvoller. weil mit key können wir leider nix anfangen (wenn ich das richtig verstanden hab). einerseits wäre in der projekte-tabelle die prID zwar ein unique key, aber eben auch auto-increment. somit fiele das schonmal raus. erschwerend kommt hinzu, dass wir NICHT in projekte nach der id glotzen, sondern in zeiten. und dort ist die "referenz" prID (man würde normalerweise foreign key sagen, aber an sowas stört sich mysql glaube nich :/ ) eben kein key element. schon garnich unique. man müsste also irgendwie sowas bauen können:
insert into zeiten... MOMENT! ginge es vllt so?

INSERT INTO zeiten (zeit) VALUES ($datum) WHERE prID='$prID' AND datum='$ts' AND user='$userid' AND NOT SELECT * FROM zeiten WHERE prID='$prID' AND datum='$ts' AND user='$userid';
wenn ichs jetzt richtig interpretiere, würde er dann nur insert machen, wenn der datensatz nich schon existiert oder? aber gut, was hätte man gewonnen? das selbe müsste man nochmal für update machen (ohne not diesmal) und ggf für delete (wobei das in nem anderen if-zweig wäre). wir hätten aber dennoch wieder 2 anfragen *grübel*

mist ^^


edit: ich glaube die abfrage, die ich eben meinte, müsste so lauten:
INSERT INTO zeiten (zeit) VALUES ($datum) WHERE prID='$prID' AND datum='$ts' AND user='$userid' AND SELECT count(id) FROM zeiten WHERE prID='$prID' AND datum='$ts' AND user='$userid' = '0';



edit2: oha, das nennt man wohl nested queries (wenns wen interessiert) und man sollte wohl ne klammer drum bauen ^^ also so in etwa:
INSERT INTO zeiten (zeit) VALUES ($datum) WHERE prID='$prID' AND datum='$ts' AND user='$userid' AND (SELECT count(id) FROM zeiten WHERE prID='$prID' AND datum='$ts' AND user='$userid') = '0';

damit sollte wie gesagt nur ein insert erfolgen, wenn es den datensatz noch nicht gibt. bringt uns aber eben nicht automatisch zum update :/




edit3: was kuhl wäre, wäre sowas: ^^

```
UPDATE zeiten SET zeit='$datum' WHERE prID='$prID' AND datum='$ts' AND user='$userid' AND
    (INSERT INTO zeiten (zeit) VALUES ($datum) WHERE prID='$prID' AND datum='$ts' AND user='$userid' AND
        (SELECT count(id) FROM zeiten WHERE prID='$prID' AND datum='$ts' AND user='$userid') = '0'
    ) = failed
;
```
müsste man nur rausfinden, wie man feststellt, ob insert fehlgeschlagen is ><


----------



## boss3D (24. Juli 2014)

^^ Hast du mein BTW gelesen? Ich fände das, wenn ich recht habe, immer noch um ein Vielfaches leichter als irgendwelche für mich kaum noch durchschaubaren querys zu basteln ...

Deinen Pseudocode hätte ich jetzt mal so umgesetzt:
	
	



```
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                $dauer = $_POST[$ts]; 
                if ($dauer == "") { 
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE user = userid AND datum = '$ts'");
                } else {
                    if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE user = userid AND datum = ts AND prID = prID")) {
                        mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."'");
                    } else {
                        mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."'");
                    }
                }
            }
        }
    }
}
```
Funktioniert aber auch nicht.

Können wir eigentlich einfach so "user" und "userid" in den querys sagen? Müsste ich da nicht eher "user.id = $userid" sagen?


----------



## DarkMo (24. Juli 2014)

boss3D schrieb:


> BTW: Ob DB-fragen, oder Website-Felder mit isset auf Inhalt abfragen, läuft doch aufs selbe hinaus?! Wenn ein Feld einen Inhalt hatte, dann muss genau dafür auch was in der DB stehen, ergo weiß ich --> UPDATE. Hatte ein Feld keinen Inhalt (isset()=false), kann auch nichts in der DB stehen, ergo --> INSERT.
> Wieso also sollte mein Ansatz, den ich verstehen würde, nicht funktionieren? Warum die DB fragen?


wieso sollte es aufs selbe hinauslaufen? du editierst ja etwas, also änderst du etwas. und GESETZT sind die inputfelder alle! es kommt auf den inhalt an. nen leeren eintrag brauch man ned neu in die db einfügen, muss ihn aber ggf bei einem bestehenden ändern (eben editieren ^^).

nur wie willst du anhand der formular-inputs bestimmen, was in der db steht? >< das geht doch überhaupt nicht. stel dir vor, du kommst als kunde an einen eisstand und willst nen kiwi-eis (das ist deine editier-anweisung - dein wunsch an die db szs). aber nur weil du den wunsch nach einem kiwi-eis verspürst, heißt das doch noch lange nich, dass der eismann auch sowas hat. schon garnich, wenn du nich die frucht meinst 

du sagts es ja selber: wenn ein feld einen inhalt HATTE! in dem moment wo er das aber editiert, ist doch der ehemalige eintrag verfälscht. du kannst vom verfälschten eintrag NICHT auf den in der db schließen. bzw nich verfälscht, halt geändert. du musst erstmal prüfen, wie die db ausieht. ich hab hier nen leeres inputfeld (es ist dennoch gesetzt - isset == true). was nu? wie sah das vorher aus? das weißt du doch garnich. wurde das geändert? wurde es nicht geändert? du kennst den originalwert nicht. daher: frag die db, wie der originale wert aussah - obs überhaupt einen gibt.


gut, nun zu deiner umsetzung: soweit ganz gut. aber das die sql's eben auch pseudocode waren... >< natürlich musste du user = userid mit deinen splatennamen und der entsprechenden variablen ersetzen xD also ich glaube userid='".$userid."'. soweit sieht das auch gut aus, allerdings musst du mein insert und update eben AUCH nach der user-id fragen (where). beim projekt fehlt die auch, aber da weiß ich jetz nich, ob das gewollt ist (wegen meiner anmerkung vorhin) und du da schon die userid rausgeshmissen hast oder obs auch da nen versehen is ^^


----------



## boss3D (24. Juli 2014)

Irgendeinen " oder ' Syntaxfehler hat's in der INSERT-Zeile, sonst müsste es jetzt das sein, was du haben willst:

```
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                $dauer = $_POST[$ts]; 
                if ($dauer == "") { 
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."'");
                } else {
                    if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
                        mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."');
                    } else {
                        mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                    }
                }
            }
        }
    }
}
```
Wo sollte ich die userid rausgeschmissen haben? Die ist noch in allen DB-Tabellen drinnen.


----------



## DarkMo (24. Juli 2014)

bei deiner update zeile darüber fehlt der string-abschluss  mach noch nen " ans ende.


----------



## boss3D (24. Juli 2014)

Hui, der Code ist "gefährlich"! Die UPDATE Zeile bewirkt, warum auch immer, dass sämtliche Einträge in "zeiten" gelöscht werden! Ich habe nur "edit" geklickt, nen anderen Wert eingegeben, "save" ... alles weg! 

Auch Tätigkeit, Produkt und Beschreibung wird nicht mehr angezeigt, obwohl das zumindest in "projekte" noch in der DB da ist.


----------



## DarkMo (24. Juli 2014)

kannste das nochmal alles zippen? klingt irgendwie so, als ob er in der db nix falsch macht, aber deine ausgeb irgendwie vom saven beeinflusst wird.


----------



## boss3D (24. Juli 2014)

*


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

*


----------



## DarkMo (24. Juli 2014)

meh, jetz hab ich die db gelöscht und diesmal war keine bei dir zum importieren dabei xD

was mir bei deiner delete zeile auffällt: da fehlt die projekt id. so löscht du ALLE zeiten dieses datums von diesem user. also projektübergreifend.


----------



## boss3D (24. Juli 2014)

*


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



*[EDIT]
Jetzt wird zwar nichts mehr versehentlich gelöscht, aber es ändert sich in "zeiten" auch nichts ...

```
mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
```


----------



## DarkMo (24. Juli 2014)

hab grad noch in auswerten.php beim erstellen des "row collectors" was seltsamens von mir enddeckt:

```
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] = ' ';
                    }
```
mE ist der else-teil überflüssig, kA was ich damit bezwecken wollte ^^ kann bei der abfrage $datum == "" zu fehlern führen. entweder a) trim($datum) == "" fragen oder b) (int)$datum == 0 oder c) das else weglassen (würd ich eh empfehlen). am besten noch a oder b kombiniert mit c ^^

nu erstmal wieder die db bauen xD


----------



## boss3D (24. Juli 2014)

^^ Okay. 

Wenn du meinen Code nimmst, musst du in der DB nichts ändern. 

[EDIT]
$datum soll eigentlich $dauer sein, oder? Ich finde in meinem Code kein "$datum ==". Lediglich das "$dauer ==" in _formular.php_.


----------



## DarkMo (24. Juli 2014)

jop, hab auch grad des rätsels lösung entschlüselt: projekte ohne eingetragene zeiten in gewünschten zeitraum werden nicht angezeigt. und scheinbar löscht unser ausgeklügeltes system schlicht alle zeiten xD

edit: bringt mich glatt zu nem anderen problem *tippel*
wir könnten jetzt nur über einträge anlegen (also pze.php) zeiten hinzufügen. allerdings wird er dann vermutlich trotz gleicher taet-prod-kombi schlicht in neues projekt anlegen. wir müssen also auch bei confirm erstmal prüfen, ob ein passender eintrag bei den projekten schon vorhanden ist. also wieder ein select an die db, die diese taet-prod-kombi abfragt. gibts unsere kombi bereits, wird sie nur geupdated, ansonsten ge-inserted.

-> select * from projekte where tätigkeit = tID und produkt = pID (wieder reinster pseudocode  ).


edit2: seh grad, du hast in der projekttabelle noch die userid drin. ich würde wie gesagt empfehlen die zu schmeisen. so können mehrere MA's an einem projekt arbeiten. also das sich das eben auch in der db niederschlägt. im endeffekt braucht man das nich pro user zu speichern, da der user-zusammenhang eh über die zeiten passiert. sprich, über zeiten kann ich locker rausfinden, welcher user an welchem projekt arbeitet, hab aber nich 20 mal das an und für sich gleiche projekt gespeichert.

hmm, ggf kannst du die userid spalte auch umbenennen in edit_user oder so. dann speicherst da die id desjenigen rein, der zuletzt was an dem projekt geändert hatte. DANN allerdings müsste man beim saven prüfen, ob sich auch was geändert hat, vorm update. das war bisher schlicht egal ^^ müssten wir also auch den projekte datensatz per select abfragen, dann das ergebnis der anfrage mit unseren übergebenen formulardingern vergleichen und NUR bei abweichungen wird geupdated. in where wird dabei NICHT nach dem user gesucht, aber er wird bei set mit bedacht (eben als letzter editor gespeichert). ggf kannste da auch edit_date als spalte noch hinzufügen, um rausfinden zu können, WANN es editiert wurde.

wieso der umstand?
wenn irgendwer schlicht seine zeiten editiert und am projekt an sich garnix ändert, dann würde er ohne diese prüfung dennoch als editor drin stehn. jemand der wirklich was am projekt geändert hat, kann somit ganz leicht überschrieben werden - und dann kann man sichs auch ganz schenken ^^


----------



## boss3D (24. Juli 2014)

Hast du jetzt so gemeint?

```
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]; 
                [COLOR=blue][B]if (mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit = taetigkeiten.id AND produkt = produkte.id") { [/B]                   
                    $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                [COLOR=blue][B]}[/B]            }
        }
    }
 }
    
function startsWith($haystack, $needle) {
    return $needle === "" || strpos($haystack, $needle) === 0;
}
    
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                $dauer = $_POST[$ts]; 
                if ($dauer == "") { 
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
                } else {
                    if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
                        mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                    } else {
                        mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                    }
                }
            }
        }
    }
}
```
Eigentlich if UPDATE else INSERT, schon klar, aber ich wollte nicht gleich alles umbauen, falls das ^^ schon nicht stimmt. Und komme ich so (taetigkeit = taetigkeiten.id) zu der id, die ich brauche? Vraiablen $pID und $tID habe ich (zumindest hier) nicht.


----------



## DarkMo (24. Juli 2014)

konnts jetz grad nich bei dir prüfen, wollte schnell meins fertig bekommen, muss jetz nämlich los. schau mal ob deines wie meins is. und: schau mal pls drüber, ob meine sql anfragen mit diesem mysqli zeugs so richtig is ^^ du hast damit mehr erfahrung wie ich xD jedenfalls prinzipiell so in etwa (beim einfügen neuer daten mittels confirm button:

```
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."");
    
            $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit='".$_POST['taetigkeit'.$a]."' AND produkt='".$_POST['product'.$a].";");
            if($check) {
                $row = mysqli_fetch_assoc($check);
                $taetprodid = row['id'];
                if($row['taetigkeit'] != $_POST['taetigkeit'.$a] or $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] != $_POST['beschreibung'.$a])
                    $eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', userid='$userid', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");  
            } else {
                $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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if($check) {
                        $row = mysqli_fetch_assoc($check);
                        if($row['zeit'] != $dauer)
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer." WHERE id='".$row['zeit']."';"); 
                    } else
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                }
            }
        }
    }
```
wie gesagt, muss jetz erstmal los, warscheinlich bis heut abend...


----------



## BenRo (24. Juli 2014)

DarkMo schrieb:


> zu dem on update... das scheints nur für key zu geben? für eine beliebige spalte wäre es mMn sinnvoller. weil mit key können wir leider nix anfangen (wenn ich das richtig verstanden hab). einerseits wäre in der projekte-tabelle die prID zwar ein unique key, aber eben auch auto-increment. somit fiele das schonmal raus.


 
Einfach einen Unique Index aus userid, datum und taetprodid bauen.

EDIT: Gerade getestet, funktioniert wunderbar.


----------



## DarkMo (24. Juli 2014)

also quasi eine spalte "aushilfskey" xD als varchar mit dem wert $userid.$datum.$teatprodid? hmm, sollte unique sein joa. an solch einen workaround hatte ich jetz natürlich nich gedacht ^^ aber ich denke, das merken wir uns mal für optimierungen später vor. der aufgedröselte code ist denke am anfang leichter verständlich *denk*


----------



## BenRo (24. Juli 2014)

Um Himmels Willen nein.

Ein ganz normaler UNIQUE-Index kann mehr als eine Spalte umfassen. D. h. ein UNIQUE über a, b, c bedeutet, dass nur die Kombination aus a, b und c unique sein muss, nicht jede einzelne Spalte in sich.

http://dev.mysql.com/doc/refman/5.1/de/multiple-column-indexes.html

Edit: Kann dir nur empfehlen, dich mal näher mit den verschiedenen MySQL-Indizes zu befassen. Für dieses Projekt hier nicht so wichtig, aber später bei größeren Projekten, wo auch Geschwindigkeitsoptimierungen usw. wichtig sind, ist das ein spannendes Thema.


----------



## DarkMo (24. Juli 2014)

ähä, nen simplen foreign key kennt die hütte nich, aber sowas? da muss man erstmla druff kommen -.- *les*


----------



## Rho (24. Juli 2014)

Falls du mit "hütte" MySQL meinst, doch! Wie kommst du auf die Idee, dass dem nicht so sei?

MySQL :: MySQL 5.6 Reference Manual :: 13.1.17.2 Using FOREIGN KEY Constraints


----------



## DarkMo (24. Juli 2014)

hatte da extra nach gegooglet, um das hinzubekommen. sinngemäß stand da, dass es foreign keys zwar kennt und akzeptiert, diese aber 0 auswirkungen haben. also so on update gerödel bla.

ah, hier isser noch:
MySQL :: MySQL 5.1 Referenzhandbuch :: 3.6.6 Wie Fremdschlüssel verwendet werden


----------



## bingo88 (24. Juli 2014)

Da ist ja auch gar nicht von Foreign Keys die Rede, sondern von diesem Reference-Gedöns. Foreign Keys funktionieren 1A, weiß ich aus eigener Erfahrung ^^


----------



## BenRo (24. Juli 2014)

Naja, "1A" wäre, wenn sie so funktionieren würden, wie der SQL-Standard sie spezifiziert. Aber wozu gibts PostgreSQL und Co?


----------



## DarkMo (24. Juli 2014)

dann hab ich das wohl falsch interpretiert. war eines der ersten google ergebnisse *böse rüber schiel* wenn ich den bastard frag, was ich gestern zum mittag hatte (ich merk mir sowas nie), weiß der das bestimmt - aber bei lebenswichtigen sachen...


----------



## boss3D (25. Juli 2014)

Den Code-Teil in _formular.php_ habe ich jetzt so:
	
	



```
if (isset($_POST['confirm'])) {
    for ($a = 1; $a <= $add; $a++) {
        $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit='".$_POST['taetigkeit'.$a]."' AND produkt='".$_POST['product'.$a].";");
        if ($check) {
            $row = mysqli_fetch_assoc($check);
            $taetprodid = row['id'];
            if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] != $_POST['beschreibung'.$a]) {
                $eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', userid='".$userid."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");  
        } else {
            $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];                              
                $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                if ($check) {
                    $row = mysqli_fetch_assoc($check);
                    if ($row['zeit'] != $dauer) {
                        $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer." WHERE id='".$row['zeit']."';"); 
                    }
                } else {
                    $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                }
            }
        }
    }
}
    
function startsWith($haystack, $needle) {
    return $needle === "" || strpos($haystack, $needle) === 0;
}
    
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                $dauer = $_POST[$ts]; 
                if ($dauer == "") { 
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
                } else {
                    if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
                        mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                    } else {
                        mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                    }
                }
            }
        }
    }
}
```
Dein mysqli passt, aber die ganzen '$userid' habe ich durch '".$userid."' ersetzt. Ich denke, so stimmt's. Allerdings kriege ich für folgende Zeile (ziemlich weit oben):





> *Parse error*:  syntax error, unexpected '[' in *C:\xampp\htdocs\db\formular.php* on line *141*




```
$taetprodid = row['id'];
```


----------



## BenRo (25. Juli 2014)

Es fehlt ein $ vor row


----------



## boss3D (25. Juli 2014)

^^ Okay, eine { hat auch noch gefehlt. Allerdings funktioniert das ganze immer noch nicht, und obendrein schaut's jetzt auch etwas kurios aus ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Zeile 113 in _auswerten.php_ wäre übrigens das echo hier:
	
	



```
for ($i = 0; $i < count($td); $i++) {
     echo '    <td>'.$td[$i].'</td>';
}
```



Spoiler





```
<?php
    $db_erg = mysqli_query($mysqli, "SELECT t.taetigkeit AS Taetigkeit, p.produkt AS Produkt, t.id AS tID, p.id AS pID, pr.id AS prID, 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);
    }
    
    $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;
        }

    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']]['prID'] = $row['prID'];
                $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];
                    }
                }
                echo '  <tr>';    
                if (isset($_POST['edit'.$row_collector[$taet_id]['data'][$prod_id]['prID']])) {
                    echo '<td><select name="taetigkeit">';
                    foreach ($taetigkeiten as $taetigkeit) {
                        echo '<option value="'.$taetigkeit['id'].'"';
                        if ($taetigkeit['id'] == $taet_id) {
                            echo ' selected="selected"';  
                        }
                        echo '>'.$taetigkeit['taetigkeit'].'</option>';
                    }
                    echo '</select></td>';

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

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

                    for ($i = 0; $i < 7; $i++) {
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo ' <td><input type="text" name="'.$ts.'" maxlength="6" size="4" value="'.$td[($i + 3)].'"></td>';
                    }
                
                    echo '    <td><input type="submit" name="save'.$row_collector[$taet_id]['data'][$prod_id]['prID'].'" value="save"></td>';
                } else {
                    for ($i = 0; $i < count($td); $i++) {
                        echo '    <td>'.$td[$i].'</td>';
                    }
                
                    echo '    <td><input type="submit" name="edit'.$row_collector[$taet_id]['data'][$prod_id]['prID'].'" value="edit"></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><br>';
```




[EDIT]
Ich merke auch gerade, es wird bei "Bestätigen" nichts mehr in "zeiten" eingetragen.


----------



## DarkMo (25. Juli 2014)

notfalls kommentier die updates/deletes/inserts mal aus (die selects lassen) und ersetze sie mit echo's. entweder schreibste selbst was rein, oder lässt dir variaben ausgeben oder den sql string... hauptsache, du kannst irgendwie nachvollziehen dadurch was er macht, welche if-zweige er nimmt. damit lässt sich sowas oft viel besser nachvollziehen. das tatsächliche ausführen mach ich meist erst, wenns durch die echos ganz gut ausgesehen hat ^^


----------



## boss3D (25. Juli 2014)

^^ Okay ...

Hattest du eigentlich gemeint, dass der Code jetzt nur noch das ...
	
	



```
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit='".$_POST['taetigkeit'.$a]."' AND produkt='".$_POST['product'.$a].";");
            if ($check) {
                $row = mysqli_fetch_assoc($check);
                $taetprodid = $row['id'];
                if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] != $_POST['beschreibung'.$a]) {
                    $eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', userid='".$userid."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");  
                }
            } else {
                $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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
        }
    }
```
... sein soll, oder eh alles wie folgt?
	
	



```
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit='".$_POST['taetigkeit'.$a]."' AND produkt='".$_POST['product'.$a].";");
            if ($check) {
                $row = mysqli_fetch_assoc($check);
                $taetprodid = $row['id'];
                if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] != $_POST['beschreibung'.$a]) {
                    $eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', userid='".$userid."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");  
                }
            } else {
                $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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
        }
    }
    
    function startsWith($haystack, $needle) {
        return $needle === "" || strpos($haystack, $needle) === 0;
    }
    
    foreach ($_POST as $key => $val) {
        if (startsWith($key, 'save')) {
            $prID = (int)substr($key, 4);
            if (isset($_POST['save'.$prID])) {
                mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST[$ts]; 
                    if ($dauer == "") { 
                        mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
                    } else {
                        if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
                            mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                        } else {
                            mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                        }
                    }
                }
            }
        }
    }
```
Ich hatte jedenfalls die function und das foreach mal auskommentiert, hat aber am Problem nichts geändert. Scheinbar macht der Code eh nichts mehr?!

[EDIT]
Der Fehler ist auf jeden Fall irgendwo hierin:
	
	



```
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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
```
Die obere for-Schleife im if macht das richtige.

[EDIT2]
Fehler gefunden: Er kommt nur ins UPDATE, nicht aber ins INSERT:


Spoiler





```
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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        echo 'Wir sind im check';
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            echo 'UPDATE';
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        echo 'INSERT';
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
```






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## boss3D (25. Juli 2014)

^^ Ich könnte einfach "if (*!*$check)" sagen, aber dann lande ich wieder hier (und UPDATE funktioniert nicht) ... 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Hierin liegt jedenfalls der Fehler:
	
	



```
if (!$check) {
     $row = mysqli_fetch_assoc($check);
     if ($row['zeit'] != $dauer) {
         $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
     }
```


----------



## DarkMo (25. Juli 2014)

im mom hab ich nich wirklich zeit mich tiefer damit zu beschäftigen  auch wenns in den fingern juckt ^^

aber mal kurz geschaut:
unterer code, erste sql abfrage: am ende fehlt ein '
generell wegen deinem $erstellt: schreib doch einfach NOW(), dann kannste auf die variable pfeiffen ^^

reine logik geschichte: weiß grad nich, wie du es nun handhabst... du hast ja bei projekte die erstellt und die userid spalte. beide beziehen sich auf das erstellt von/am. ich würde die bedeutung der spalten umändern. userid gibt an, wer die letzte änderung veranlasst hat (halt der, der das insert ausgelöst hat, oder eben ein update) und das erstellt bekommt die bedeutung, wann diese änderung war (wird also beim erstellen und bei jeder änderung mit geändert). kannst die spalten ggf auch umbenennen (musste halt dann imcode auch überall ändern). die jetzige bedeutung heist ja eben, dass es von dem und dem erstellt wurde (das datum is erstmal relativ bums).

problem hierbei ist, dass nun jeder user (trotz selber tätigkeit/produkt-kombi) für sich eine "projekt-kopie" anlegt. wenn wir projekt jetzt also so definieren, dass es eben eine tätigkeit/produkt-kombi ist und eben KEINE tätigkeit/produkt/user-kombi (was ich wie gesagt sehr viel sinnvoller fände), dann taucht ein problem auf. der hans bearbeitet ein projekt tätigkeit1/produkt1. der meier macht da auch mit. nun fuhrwerken beide mit ihrer eigenen projekt-kopie in der db rum. beide erstellen jeder für sich einen eintrag in der db, der sich nur durch ihre user-id unterscheidet - das projekt selber ist gleich. wir haben also faktisch ein projekt, aber 2 einträge. wie gesagt, bekommt man ja über die zeiten raus, wer am projekt rumfuhrwerkt, deswegen braucht mans eigentlich beim projekt nich nochmal speichern.

wenn du deinen code oben (also der untere ausschnitt) so laufen lässt, holt dir check diese 2 datensätze aus der db (da du nicht nach der user-id filterst - was ich wie gesagt ok finde, aber dann muss das speichern halt angepasst werden, is ja auch gleich hier, gleich mal schauen ^^), wir bearbeiten aber nur den ersten. jetzt wissen wir aber garnich, ob das der ist, der grad bearbeitet wird -> besagtes problem.

nächstes problem: wir suchen das projekt mit den per formular übergebenen id's für tätigkeit und produkt, statt über die ermittelte prID (damit wäre auch das erste prob aus der welt ^^). hb ich natürlich in der eile gestern nich dran gedacht. weil du möchtest ja, das beide mit editierbar sind. wenn wir aber nach den schon editierten dingern suchen, können wir natürlich kaum erwarten, den ursprünglichen eintrag zu finden. also - ach shit, wir sind ja bei confirm, da gibts noch keine id xD jetz bin ich völlig verwirrt. also nochmal langsam 


wenn confirm, geh alle zeilen durch. hier wäre es ganz gesund, erstmal die pflichtfelder zu checken. also tätigkeit und produkt (und eventuell mindestens eine zeit - aber das kann man sich ggf auch schenken). also quasi if isset(post teat, post prod) and beide trim() != "" -> go.
jenau, frage anhand der tät/prod kombi bei der db an (stimmt also doch), ob es diese schon gibt (user wird ignoriert, da irrelevant). wenn es die schon gibt, dann update ggf  (sofern änderungen vorliegen) das gerumpel. diesemal wird der user vermerkt, auch die zeit. die projektid ist hierbei die id des anfrage ergebnisses. falls es diese kombi noch ned gibt, inserte sie. auch diesemal wird der user vermerkt, auch die zeit. die projektid ist jetzt die id des letzten inserts.

also soweit hauts mMn hin. dann rödelt er alle tage durch, kontrolliert wieder die eingaben. wurde was eingetragen, schaut er wieder nach, obs diesen eintrag schon gibt. wenn, dann wird der geupdated (sofern sich die zeit geändert hat) - den schritt kannst du btw auch weglsaaen, wenn du magst, weil an und für sich haben wir ja ne gesonderte edit-funktion. kannste aber auch drin lassen, wenn dir diese alternative edit-möglichkeit gefällt ^^ joa, und falls es den eintrag noch ned gibt, wir er erstellt.

klingt für mich schlüssig und sollte funtzen *grübel*


sow, und jetzt die editiererei. hier müssten wir das ganze jetzt auch abändern, dass erst gecheckt wird, obs das projekt schon gibt. wenn es das schon gibt, wird wieder auf unterschiede geprüft und sind unterschiede vorhanden, wird geupdated. nur so kann man den "neuen sinn" (den ich halt irgendwie sinnvoller finde) für userid und erstellt (könnte man umbenennen in changed_by und changed_date oder so) beibehalten. wer zuletzt was dran geändert hat, der wird mit zeit vermerkt.
dann gehts wieder zu der "tages-schleife". in der if würde ich halt wieder auf trim($dauer) prüfen, aber so passt das erstmal. wenn nix eingegeben, lösche (gibts nix zu löschen, macht das ding auch nix - also brauchen wir auch keinen check vorher. aber ansonsten sollte das eigentlich passen *grübel*


die db war auch wieder sinnvoll gefüllt mit daten? weil du hattest ja beim einen versuch die ganzen zeiten gekillt ^^ wenn die immernoch fehlen, wird da ggf nich viel passieren.


----------



## boss3D (26. Juli 2014)

^^ Puh, aus deinen Texten ist es nicht leicht, rauszulesen, was denn nun konkret ich eigentlich machen soll ...

1) Soll ich jetzt also in "projekte" eine weitere Spalte "prID" hinzufügen, zusätzlich zu all dem? (Und wodurch würde sich die dann von der auto_increment id unterscheiden?)




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



2) Wozu bitte auf Änderungen überprüfen und nur im Falle dieser das Projekt updaten? Ich würde das in jedem Fall updaten (auch wenn's keine Änderungen gibt) und mir dadurch wieder "komplizierten" Code ersparen, bei dem eh wieder keiner durchblickt, wenn's nen Fehler geben sollte. Ist zwar vielleicht ein bisschen "Mehraufwand" für die DB, aber leichter für uns.

3) Und zu deinem Hans und Meier: Aus den bisher verwendeten Excel-Tabellen geht auch nicht hervor, ob mehrere MAs an einem Projekt gearbeitet haben, insofern denke ich nicht, dass wir das jetzt unbedingt in unserer DB umsetzen müssen. Oder gäb's da einen anderen Sinn, den ich dann nicht aus deinem Posting rausgelesen hätte?

^^ Irgendwie weiß ich halt jetzt gerade nicht so ganz, was ich machen soll. 
Eigentlich hatten wir bis gestern diesen Fehler, dass halt nichts in "zeiten" gespeichert wird. Ich wäre schon glücklich, wenn wir einfach nur diesen finden, anstatt jetzt wieder alles mögliche Zeugs reinzubasteln, bei dem Ende wahrscheinlich noch weniger funktioniert als jetzt ...


----------



## DarkMo (26. Juli 2014)

1) mit der prID ist die id deines projektes gemeint - ergo brauchste die spalte nich extra.

2) hab ich doch erklärt. wenn du es einfach möchtest, lösch zumindest die spalte userid aus projekte. es gibt einfach einen unnötigen mehraufwand, wenn wir die hier "korrekt" mitspeichern. ist in dem bisherigen sinne ("das projekt von MA xyz") bringt das nur unnötige rudundanzen (wer am projekt arbeitet, steht in zeiten). und was schiefgehn kann, hab ich mit hans und meier erklärt. WENN du die redundanz drinne lässt, MUSST du bei der abfrage des projekts auch auf die userid prüfen! das machst du derzeit nicht -> gibt 100% nen fehler irgendwann.

damit du die spalten nich löschen musst, hatte ich eben ersatzweise den plan erdacht, die umzufunktionieren. aus userid im sinne von "dem gehört das projekt" wird userid im sinne von "der user hat zuletzt was an den projekt-daten geändert (nicht die zeitdaten)". zusätzlich könnte man aus erstellt im sinne von "dann und dann wurde der datensatz angelegt" ein "zu diesem zeitpunkt wurde der datensatz geändert" machen. WENN du das allerdings dann so umdeutest (wie ichs vorgeschlagen hätte), darfst du eben nicht "blind" immer den datensatz überschreiben (auch wenn sich nix ändert). denn dann geht der neue sinn unserer spalten schlicht verloren. man sieht nur mit glück eine tatsächliche änderung (ein update von 1 auf 1 ist keine änderung der daten ^^).

du hast also szs 3 möglichkeiten:
- so lassen wie es jetzt ist, dann musst du beim abfragen der projekte den user mit abfragen (bei where) und du hast halt unnötig viele projekt-datensätze, da gleiche projekte für jeden user getrennt angelegt werden.
- daher wäre ich erstmal grundsätzlich für lösung 2: scheiss auf die user-id in projekte ^^ alle user beziehen sich auf das selbe projekt. keine redundanz, keine unnötigen datensätze, bissl weniger aufwand. musst allerdings auch die ganzen sql strings checken ^^
- optional als ergänzung zu lösung 2 wäre lösung 3: behalte die userid spalte und nutze sie in einem anderen sinn (wie oben erklärt). musste halt checken, ob ein update nötig ist oder nicht (sonst ist wie gesagt der sinn der userid usw im eimer und du kannst es gleich bleiben lassen).

3) hans und meier sollten dir das jetz nicht unbedingt verdeutlichen. es ging darum, WIE ein fehler passieren kann. du hast 2 datensätze 1 1 1 und 1 1 2 und fragst nur die ersten beiden ab - bekommst also beide geliefert, verarbeitest aber dann nur den ersten, obwohl du eventuell den 2. gebraucht hättest. nachm speichern haste dann ggf 2 datensätze 1 1 2 und 1 1 2 <- *russisch akzent* grosses haufen mist!

und generell: wäre ein "kostenloses" zusatzfeature schlecht?  nur weils ne olle excel tabelle nich kann, muss man doch ne db-anwendung nich künstlich mit mehraufwand beschneiden, um sie im funktionsumfang wieder aufs selbe level runterzustutzen ^^


----------



## boss3D (27. Juli 2014)

Also, ich habe jetzt mal versucht, einfach nur deine zweite Möglichkeit zu basteln, indem ich die Spalte "userid" aus _projekte_ gelöscht und auch aus allen querys, die _projekte_ betreffen, entfernt habe. Das Resultat ist jetzt allerdings, dass leider gar nichts in die DB geschrieben wird ... 

formular.php



Spoiler





```
<?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'])) {
        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: Der Benutzername war schon vorhanden.';
                        $_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++) {
             $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE  taetigkeit='".$_POST['taetigkeit'.$a]."' AND  produkt='".$_POST['product'.$a]."';");
            if ($check) {
                $row = mysqli_fetch_assoc($check);
                $taetprodid = $row['id'];
                 if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or  $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] !=  $_POST['beschreibung'.$a]) {
                    $eintragen1 =  mysqli_query($mysqli, "UPDATE projekte SET  taetigkeit='".$_POST['taetigkeit'.$a]."',  produkt='".$_POST['product'.$a]."',  beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt')  WHERE id='$taetprodid';");  
                }
            } else {
                 $eintragen1 = mysqli_query($mysqli, "INSERT INTO projekte  (taetigkeit, produkt, beschreibung, erstellt) VALUES  ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."',  '".$_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];                              
                     $check = mysqli_query($mysqli, "SELECT * FROM zeiten  WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND  datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                             $eintragen2 = mysqli_query($mysqli, "UPDATE  zeiten SET zeit='".$dauer." WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                         $eintragen2 = mysqli_query($mysqli, "INSERT INTO  zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid',  '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
        }
    }
    
    function startsWith($haystack, $needle) {
        return $needle === "" || strpos($haystack, $needle) === 0;
    }
        
    foreach($_POST as $key => $val) {
        if (startsWith($key, 'save')) {
            $prID = (int)substr($key, 4);
            if (isset($_POST['save'.$prID])) {
                 mysqli_query($mysqli, "UPDATE projekte SET  taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."',  beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST[$ts]; 
                    if ($dauer == "") { 
                         mysqli_query($mysqli, "DELETE FROM zeiten WHERE  userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
                    } else {
                         if (mysqli_query($mysqli, "SELECT * FROM zeiten  WHERE userid='".$userid."' AND datum='".$ts."' AND  taetprodid='".$prID."'")) {
                             mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE  taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                        } else {
                             mysqli_query($mysqli, "INSERT INTO zeiten  (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND  datum='".$ts."' AND userid='".$userid."'");
                        }
                    }
                }
            }
        }
    }  
    
    if (isset($_POST['export'])) {
        include('export.php');
    }
```



Außerdem verstehe ich immer noch nicht, ob ich die foreach-Schleife mit dem key überhaupt (noch) brauche. Macht die nicht irgendwie das selbe, wie das ganze Zeug von "confirm"?


----------



## DarkMo (27. Juli 2014)

confirm ist fürs speichern neuer datensätze da, die for-schleife versucht den save-button zum editieren zu finden. also grundsätzlich 2 verschiedene aktionen, die (wie du richtig erkannt hast) ähnliche funktionen erfüllen.


----------



## Rho (27. Juli 2014)

Wie sieht denn eigentlich das derzeitige Datenbankschema aus?


----------



## boss3D (27. Juli 2014)

@ DarkMo
Damit kann ich zumindest davon ausgehen, dass der Fehler, warum jetzt nichts in der DB landet, irgendwo in dem "cofirm" Konstrukt drinnen sein muss?!

Dann check ich nochml die querys ...

Vielleicht habe ich nur gerade einen Denkfehler, aber irgendwie irritiert mich diese Zeile gerade:
	
	



```
$eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");
```
In _projekte_ gibt's doch gar keine "taetprodid" (die ist ja erst in _zeiten_). Woher soll er also wissen, wo (WHERE) er das in der DB hinschreiben soll?!

Jedenfalls landet er (über "echo-Debugging" festgestellt) sofort im UPDATE, aber das hatten wir glaube ich eh schon Ende letzter Woche.

[EDIT]
Wenn ich beide $check "negiere" (!$check), dann funktioniert alles (auch das UPDATEn bestehender Werte in _projekte_ und _zeiten_), nur nicht das Löschen bestehender Werte und Einfügen neuer in bisher leeren Feldern.

Irgendwo hier liegt der Hund begraben:

```
if ($dauer == "") { 
     mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
} else {
     if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
         mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
     } else {
         mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
     }
}
```

[EDIT2]
Wenn ich in dem Code "if ($dauer != "") { " sage und ein * nach DELETE einfüge, dann wird zumindest eine unerwünschte Zeitangabe schon mal durch 0 ersetzt. Ich will aber, dass der ganze Eintrag in der DB gelöscht wird!


----------



## DarkMo (27. Juli 2014)

teatprodid bekommt er durch den check (bei mir heisst das auch ganz simpel projektid ^^ oder eben kurz prID). entweder er findet einen eintrag, dann nimmt er dessen id als "prID" oder er erstellt eben das projekt neu, und nimmt die id des zuletzt eingetragenen. in beiden fällen hat er dann ne projektid.

und wegen dem if($check) - ich hab doch keinen blassen ob das so funzt. deswegen solltest du das berichtigen ^^ mit den alten (ach so pösen) mysql funktionen hätte ich nach num_rows() gefragt. aber ich hab keinen blasse, wie das mit den neuen funktionen geht. sinn dieser if wäre es, einfach rauszufinden, OB die anfrage ein ergebnis liefert oder ob das ergebnis leer ist. wie gesagt, mit diesem mysqli hab ich keine erfahrung selber, daher darfste das gerne berichtigen, dass die if ihrer bestimmung nachgeht.

beim checken der tage dann natürlich das selbe in grün ^^


----------



## boss3D (27. Juli 2014)

^^ Ob wir nun ...

$row = mysqli_fetch_assoc($check); // oder
$row = mysqli_num_rows($check); // oder
$row = num_rows($check);

... sagen, macht alles gar keinen Unterschied. 

INSERT  funktioniert jedenfalls immer. UPDATE und DELETE gar nicht. Ich  probiere morgen in der Arbeit noch weiter rum. Bis am Abend haben wir  den Fehler hoffentlich gefunden. Dann bliebe noch 1 Tag, um die  Excel-Ausgabe zu richten ...

[EDIT]
Einen Fehler habe ich noch gerade gesehen: Beim Auswerten wird scheinbar nur die Anzahl der Zeitwerte gezählt, aber nicht überprüft, an welchen Tagen sich diese befinden. Habe ich z. B. für MO und DI was eingetragen, wird bis 2 gezählt und mir dann auch die Werte bei MO und DI angezeigt. 
Habe ich aber z. B. bei MI und DO was eingetragen, wird ebenfalls bis 2 gezählt, dann aber nur zwei leere Felder bei MO und DI angezeigt. Erst wenn ich dann auf "edit" klicke, kriege ich die Werte in MI und DO zu sehen. _*seufz*

_Das liegt wohl irgendwo hierin in auswerten(2).php, aber ich krieg's trotz allem Rumprobieren nicht raus:
	
	



```
for ($i = 0; $i < count($td); $i++) {
    echo '    <td>'.$td[$i].'</td>';
}
```
Und da kriege ich ja auch diese Meldung her, wobei die Zahl variiert:





> *Notice*:  Undefined offset: 3 in *C:\xampp\htdocs\db\auswerten.php* on line *107*


----------



## DarkMo (28. Juli 2014)

mein problem is, morgen und 2 tage später is prüfung :/ ich kann erstmal nich mehr  und scheinbar isses danach zu spät :/


----------



## boss3D (28. Juli 2014)

Okay, dann bleibt mir nichts anderes, als das ganze "edit"/"save" Zeugs wieder rauszuschmeißen und den Zustand von davor herzustellen. Ich selber krieg's leider nicht raus, warum's nicht geht. Hab ja jetzt drei Tage selber gesucht und rumprobiert ... 

Morgen Mittag muss es jedenfalls allerspätestens in einem fehlerfreien und benutzbaren Zustand sein. Dann eben leider ohne EDIT.

Ich probiere jetzt nochmal Tessa's Ansatz mit der vorbelegten Zeile. Da hatte ich ja schon ein bisschen was. Vielleicht kriege ich das noch hin ...


----------



## DarkMo (28. Juli 2014)

haste mal das mit num rows probiert? also statt if(check) ein if(num rows(check))? generell, lass mir den jetzigen stand nochmal plz zukommen als zip/rar... wenn ich wieder mehr zeit hab, kann ichs mir nochmal in ruhe anschauen.


----------



## DOcean (28. Juli 2014)

mit GIT wäre das nicht passiert  *duckundwech*

dann könntest du zurückgehen, zu 10 oder wieviele auch immer Ständen vorher


----------



## boss3D (28. Juli 2014)

@ DOcean
Da habe ich wenig Probleme, weil ich eh immer nach jedem größeren Arbeitsschritt die Codes hier als zip upgeloaded habe. Habe mein funtkionierendes schon längst wieder ... 

BTW ist mir gerade noch eingefallen: Der Excel-Export müsste auch noch gerichtet werden, sieht ja grausig aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Ich weiß aber leider nicht, wieso mir der die gesamte Seite mit allen Buttons und sonstigem Zeugs exportiert.  Das muss irgendwie an DarkMo's Ansatz liegen?! Früher, bei meinen "Chaos Codes", hat zumindest Excel noch vernünftig ausgesehen.
-----------

@ DarkMo

1) Funktionierende Version ohne EDIT --> *


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

*

2) Fehlerhafte Version mit EDIT --> *


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

*

Nein, das aus deinem letzten Posting muss ich erst noch probieren ...

[EDIT]
Mit num_rows($check) läuft's auch nicht besser. Dann funktionieren DELETE und INSERT nicht. Scheint sogar egal zu sein, ob ich's negiere oder nicht. Kurios.


----------



## boss3D (28. Juli 2014)

Ich habe jetzt versucht, eine vorbelegte Zeile zu basteln, aber beim Auslesen/Ausgeben der Tätigkeit, des Produkts und einer möglicherweise eingegebenen Zeit scheitert es gewaltig. Das einzige, das funktioniert, ist das Vorbelegen der Beschreibung ...

```
<?php    
    echo '<table>';

    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten;") or die ("Get Taetigkeiten failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_t))
        while ($row_t = mysqli_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

    $products = array();
    $res_p = mysqli_query($mysqli, "SELECT * FROM produkte;") or die ("Get Produkte failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_p))
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }
        
    $zeiten = array();
    $res_z = mysqli_query($mysqli, "SELECT zeit FROM zeiten;") or die ("Get Zeiten failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_z))
        while ($row_z = mysqli_fetch_assoc($res_z)) {
            $zeiten[count($zeiten)] = $row_z;
        }
    
    //$queryid = mysqli_insert_id();
    $taetid = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id=140;");
    $row_taetid = mysqli_fetch_row($taetid); 
    $prodid = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id=140;");
    $row_prodid = mysqli_fetch_row($prodid);
    $beschid = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id=140;");
    $row_beschid = mysqli_fetch_row($beschid);
    
    for ($a = 1; $a <= 1; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {    
            if ($taetigkeiten[$row_taetid] == $_POST['taetigkeit']) {
                echo '<option value="'.$taetigkeit[$row_taetid].'" selected>'.$taetigkeit['taetigkeit'].'</option>';
            } else {
                echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';  
            }         
        }
        echo '</select></td>';

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

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

        /*for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            if ($zeiten[$ts] == $_POST[$ts]) {
                echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$zeiten[$ts].'" maxlength="6" size="4"></td>';
            } else {
                echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
            }
        }*/
    } 
    echo '</table><br>';
```
Der Code liefert bei Tätigkeit und Produkt immer das letzte aus dem Dropdown, aber nicht das vorher ausgewählte und in der DB gespeicherte.

Irgendwas hat's also hier bei irgendeinem Index:
	
	



```
echo '<tr><td><select name="taetigkeit'.$a.'">';
foreach ($taetigkeiten as $taetigkeit) {    
    if ($taetigkeiten[$row_taetid] == $_POST['taetigkeit']) {
        echo '<option value="'.$taetigkeit[$row_taetid].'" selected>'.$taetigkeit['taetigkeit'].'</option>';
    } else {
        echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';  
    }         
}
echo '</select></td>';

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


----------



## DarkMo (28. Juli 2014)

du vergleichst den string mit der id (also "kaffe kochen" mit 1 oder so). nutze nur $row_taetid...


----------



## boss3D (28. Juli 2014)

Was, so?
	
	



```
if ($taetigkeiten[$row_taetid] == $_POST[$row_taetid]) {
```
Das ändert gar nichts ...

Und folgendes würde mir wieder die erste Tätigkeit anzeigen, also auch nicht stimmen:
	
	



```
if ($row_taetid == $_POST['taetigkeit']) {
```
[EDIT]
Es ist ja bei Zeit der selbe Schmarrn, da weiß ich auch nicht, wie ich zu den jeweiligen Feldern kommen soll. Dieses ts_a mag er jedenfalls nicht:
	
	



```
for ($i = 0; $i < 7; $i++) {
     $ts = $wochenanfang + ($i * 60 * 60 * 24);
     if ($zeiten[$ts.'_'.$a] == $_POST[$ts.'_'.$a]) {
         echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$zeiten[$ts].'" maxlength="6" size="4"></td>';
     } else {
         echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
     }
}
```
^^ Da kommt das hier:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT2]
Ich hätte jetzt auch noch deinen Error-Vorschlag-Code probiert, aber der macht auch nichts, außer Notices zu liefern ... 

```
if (isset($_POST['confirm'])) {
        $errors = array();
        for ($a = 1; $a <= $add; $a++) {

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

            // eintragen
            if($form_ok) {
                $eintragen1 = mysqli_query($mysqli, "INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");  
                $taetprodid = mysqli_insert_id($mysqli);
        
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                        $dauer = $_POST[$ts.'_'.$a];                              
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts');");
                    }
                }
                // wenn alles ok, war, brauchen wir die "fehlerzeile" nicht
                unset($errors[$index]);
            } else {
                // sollte die form doch fehler enthalten haben, speicher den rest auch (egal ob leer oder angegeben)
                if(isset($_POST['beschreibung'.$a])) $errors[$index]['b'] = $_POST['beschreibung'.$a];
                $errors[$index]['d'] = array(); // d wie days ^^
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    if(isset($_POST[$ts.'_'.$a])) $errors[$index]['d'][$b] = $_POST[$ts.'_'.$a];
                }
            }
        }
        // am ende noch add so manipulieren, dass wir genug platz haben, um unsere "fehlerzeilen" einzutragen
        $add = count($errors);
    }
```


----------



## BenRo (28. Juli 2014)

Zum Excel-Problem hatte ich schonmal was geschrieben, ist bestimmt untergegangen. In der Datei index.php werden ja u. A. die Dateien html_header.php, html_footer.php und projektzeiterfassung.php includet. Dies passiert auch dann, wenn exportiert werden soll. Zur Lösung also einfach diese Dateien nur dann includen, wenn $_POST['export'] nicht gesetzt ist.


----------



## boss3D (28. Juli 2014)

^^ Nein, das hat das Problem leider nicht gelöst. 
 Zumindest nicht so, wie ich das jetzt umgesetzt habe ...

_index.php_

```
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
    if (!isset($_POST['export'])) {
        include('html_header.php');
    }

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    if (!isset($_POST['export'])) {
        include('html_footer.php');
    }
```
Und in _formular.php_ habe ich das hier reingegeben:
	
	



```
if (isset($_POST['export'])) {
     include('export.php');
}
```
Sieht immer noch so aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Und was ich auch nicht verstehe: Warum wird bei Kommazahlen (also z. B. 3.5 h) ein Datum statt der Kommazahl nach Excel exportiert?



[EDIT]
Ich glaube eher, dass da im Code von _export.php_ selbst was schief läuft?!



Spoiler





```
<?php       
    $header = '';
    $result ='';
    $exportData = mysqli_query($mysqli, "SELECT * FROM projekte, zeiten") or die ("Sql error : ".mysqli_error());
     
    $fields = mysqli_num_fields($exportData);
     
    for ($i = 0; $i < $fields; $i++) {
        $header .= mysql_field_name($exportData, $i)."\t";
    }
     
    while ($row = mysql_fetch_row($exportData)) {
        $line = '';
        foreach ($row as $value) {
            if ((!isset($value)) || ($value == "")) {
                $value = "\t";
            } else {
                $value = str_replace('"', '""', $value);
                $value = '"'.$value.'"'."\t";
            }
            $line .= $value;
        }
        $result .= trim($line)."\n";
    }
    $result = str_replace("\r", "", $result);
     
    if ($result == "") {
        $result = "\nNo Record(s) Found!\n";
    }
     
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".$user.".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    print "$header\n$result";
```


----------



## DarkMo (28. Juli 2014)

hmm, das könnte sone autoersetzung sein. notfalls, probiers mal den . durch nen , zu ersetzen -> PHP: str_replace - Manual
also wenn row['zeit'] bspw diese 5.3 sind, dann gib nicht row direkt aus, sondern str_replace('.', ',', row['zeit']);


----------



## BenRo (28. Juli 2014)

Folgendes noch ändern, damit die Buttons nicht mehr angezeigt werden


```
} elseif(!isset($_POST['export'])) {
     include('projektzeiterfassung.php');
  }
```

Alles weitere kann ich gerade momentan nicht testen.


----------



## boss3D (28. Juli 2014)

@ BenRo
Nein, das geht leider nicht. Da müssen wir durch DarkMo's Aufbau sehr vorsichtig sein, das wirkt sich nämlich auf alles aus ...

Du hast gemeint, das in _formular.php_ anzuhängen?! So:
	
	



```
if (isset($_POST['export'])) {
     include('export.php');
} elseif(!isset($_POST['export'])) {
     include('projektzeiterfassung.php');
}
```
Liefert gleich mal:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



@ DarkMo
Ich durchschau den _export.php_-Code leider absolut gar nicht. Oder anders gesagt: Er macht nicht das, was ich mir anhand der Code-Zeile erwarten würde. Ein row['zeit'] gibt's darin jedenfalls nicht. Ich google noch, ob ich was besseres zum Exportieren finde ...


----------



## BenRo (28. Juli 2014)

Nein, ich meinte die entsprechenden Zeilen in index.php zu ändern:

```
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
    if (!isset($_POST['export'])) {
        include('html_header.php');
    }

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } elseif(!isset($_POST['export'])) { // hier
            include('projektzeiterfassung.php');
        }
    }
    
    if (!isset($_POST['export'])) {
        include('html_footer.php');
    }
```


----------



## boss3D (28. Juli 2014)

^^ Nutzt auch nichts. Das ist alles Katastrophe ... ich hoffe, ich finde wenigstens für den Export morgen noch schnell eine funktionierende Lösung ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Der Fehler an der jetzigen Version liegt ziemlich sicher in _export.php_ selbst und nicht an was anderem.


----------



## DarkMo (28. Juli 2014)

boss3D schrieb:


> @ DarkMo
> ... Ein row['zeit'] gibt's darin jedenfalls nicht ...


nimm doch nich immer alles so wörtlich >< ich hab doch ausm kopf jetz keinen plan, wie bei dir die spalte für die zeit hieß bzw wie wir die abgefragt hatten ^^ ich hatte einfach nur gehofft, mit row (wohl irgendein db wert) und zeit (wohl der db wert, der sich um die zeit dreht) könnte ich da unkompliziert und dennoch verständlich aus der affäre kommen


----------



## boss3D (29. Juli 2014)

row['zeit'] müsste sogar wortwörtlich stimmen, aber was mir das jetzt im Code nutzen soll ... Der holt sich alle (*) Daten aus der DB und wurschtelt das dann durch die Schleifen, bis er einen Ausgabe-Stream hat, so wie ich das verstehe. Wo konkret ich da das Ausgabeformat der Zeit ändern könnte, falls überhaupt, weiß ich nicht. 

Ich suche jetzt lieber mal nach alternativen Lösungen für den Export ...

[EDIT]
Habe jetzt mehrere Codes durchprobiert. Die anderen hatten zwar auch zig Fehler und haben keine Daten geliefert, aber zumindest optisch im Excel korrekt ausgesehen. Jetzt habe ich eine verkürzte Version des "alten" Codes:

```
<?php 
    while ($row = mysql_fetch_row($export)) { 
        $line = ''; 
        foreach ($row as $value) {                                             
            if ((!isset($value)) OR ($value == "")) { 
                $value = "\t"; 
            } else { 
                $value = str_replace('"', '""', $value); 
                $value = '"' . $value . '"' . "\t"; 
            } 
            $line .= $value; 
        } 
        $data .= trim($line)."\n"; 
    } 
    $data = str_replace("\r","",$data);  

    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=extraction.xls"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    print "$header\n$data";
```
^^ Aber dieser exportiert wieder alles, also auch Buttons und so Zeugs. Wobei's mich irritiert, dass sich das File irgendwie "selbst zu exportieren" scheint, oder warum wird es in mysql_fetch_rows aufgerufen? Bzw. was soll das sonst für eine Variable $export sein? Wo kommt die her?

[EDIT2]
Au, Mann, ist das zum Kotzen ...

Dieser Code ...
	
	



```
<?php     
    $result = mysqli_query($mysqli, "SELECT * FROM projekte, zeiten;");
     
    $out = '';
     
    $fields = mysqli_num_rows($result);
     
    $columns = mysqli_num_fields($fields);
     
    for ($i = 0; $i < $columns; $i++) {
        $l = mysqli_field_name($fields, $i);
        $out .= '"'.$l.'",';
    }
    $out .= "\n";
     

    while ($l = mysqli_fetch_array($result)) {
        for ($i = 0; $i < $columns; $i++) {
            $out .= '"'.$l["$i"].'",';
        }
        $out .= "\n";
    }
     
    $f = fopen('export.csv','w');
     
    fputs($f, $out);
    fclose($f);
     
    header('Content-type: application/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    readfile('export.csv');
```
... gibt auch alles aus, aber in html-Codeform.




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT3]
Der Code ...
	
	



```
<?php
    $DB_Server = "localhost"; //MySQL Server 
    $DB_Username = "root"; //MySQL Username 
    $DB_Password = "root";             //MySQL Password 
    $DB_DBName = "projektzeiterfassung";         //MySQL Database Name 
    $DB_TBLName = "projekte"; //MySQL Table Name
    $filename = "export";         //File Name

    $sql = "Select * from $DB_TBLName";
    $Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password) or die ("Couldn't connect to MySQL:<br>" . mysql_error() . "<br>" . mysql_errno());

    $Db = @mysql_select_db($DB_DBName, $Connect) or die ("Couldn't select database:<br>" . mysql_error(). "<br>" . mysql_errno());

    $result = @mysql_query($sql,$Connect) or die ("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno());

    $file_ending = "xls";

    header("Content-Type: application/xls");
    header("Content-Disposition: attachment; filename=$filename.xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    $sep = "\t";

    for ($i = 0; $i < mysql_num_fields($result); $i++) {
        echo mysql_field_name($result,$i) . "\t";
    }

    print("\n");

    while ($row = mysql_fetch_row($result)) {
        $schema_insert = "";
        for($j=0; $j<mysql_num_fields($result);$j++) {
            if (!isset($row[$j]))
                $schema_insert .= "NULL".$sep;
            elseif ($row[$j] != "")
                $schema_insert .= "$row[$j]".$sep;
            else
                $schema_insert .= "".$sep;
        }
        $schema_insert = str_replace($sep."$", "", $schema_insert);
        $schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert);
        $schema_insert .= "\t";
        print(trim($schema_insert));
        print "\n";
    }
```
... liefter wieder sowas hier:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



*^^ Was hat's da bloß?* 

Scheint jedenfalls nicht an den Codes selbst zu liegen, sondern doch an was anderem, dass ständig die gesamte Seite exportiert wird, anstatt nur dem DB-Inhalt ...


----------



## TessaKavanagh (29. Juli 2014)

Ich war zu Faul zum nachdenken und probiere es mal mit der Guttenbergmethode (Str+C und Strg+V) 


```
<?php

$select = "SELECT * FROM TABLE_NAME";                  
$export = mysql_query($select);  
$fields = mysql_num_fields($export); 

for ($i = 0; $i < $fields; $i++) {  
    $header .= mysql_field_name($export, $i) . "\t";  
}  
while($row = mysql_fetch_row($export)) {  
    $line = '';  
    foreach($row as $value) {                                              
        if ((!isset($value)) OR ($value == "")) {  
            $value = "\t";  
        } else {  
            $value = str_replace('"', '""', $value);  
            $value = '"' . $value . '"' . "\t";  
        }  
        $line .= $value;  
    }  
    $data .= trim($line)."\n";  
}  
$data = str_replace("\r","",$data); 

if ($data == "") {  
    $data = "\n(0) Records Found!\n";                          
}
header("Content-type: application/octet-stream");  
header("Content-Disposition: attachment; filename=extraction.xls");  
header("Pragma: no-cache");  
header("Expires: 0");  
print "$header\n$data"; 

?>
```


----------



## boss3D (29. Juli 2014)

^^ Liefert:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ich habe echt keine Ideen mehr, wodurch er sich den ganzen Mist mitreinholen könnte ... 
Ich weiß nur, dass es ganz offenbar nicht am Export-Code liegt, da habe ich ja mittlerweile zig Versionen durch, aber immer mit dem Ergebnis. Irgendwo wird was mit-includiert, aber BenRo's _index.php_ hat das Problem ja auch nicht gelöst ...

BTW: Vielleicht wäre die Lsg des Problems, _export.php_ in _index.php_ zu includieren, und nicht in _formular.php_, wie ich das derzeit habe? Aber das habe ich noch nicht funktionierend hingekriegt.


----------



## TessaKavanagh (29. Juli 2014)

auf welcher seite verwendest du den Export code? kannst du Ihn Testweise mal als vollkommen getrenntes PHP Dokument verwenden.


----------



## boss3D (29. Juli 2014)

Es ist gerade nur mehr kurios! Selbst dieses bisschen hier würde die exakt selbe Ausgabe liefern:

```
<?php
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
```
Woher nimmt der denn dann bitte die Daten???


[EDIT]
@ Tessa
Dann kommt das:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Ich sag ja, irgendwas anderes aus dem Gesamtprojekt includiert das ganze Seiten-Gerümpel mitrein.

Im Moment habe ich jedenfalls das hier ...
	
	



```
if (isset($_POST['export'])) {
        include('export.php');
    }
```
... in _formular.php_ stehen. Der Button zum Export ist in _auswerten(2).php_. Die _index.php_ sieht immer noch so aus, wie von BenRo vorgeschlagen, nur zeigt das eh keine Wirkung:
	
	



```
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
    if (!isset($_POST['export'])) {
        include('html_header.php');
    }

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    if (!isset($_POST['export'])) {
        include('html_footer.php');
    }
```
[EDIT2]
Kann das eigentlich sein, dass sich der die Daten bei mir gar nicht aus der DB holt, sondern direkt das exportiert, was auf der Website steht? So kommt mir das langsam vor. Und es scheint ja überhaupt keinen Unterschied zu machen, ob eine DB-Verbindung angegeben wird, oder eben nicht.


----------



## TessaKavanagh (29. Juli 2014)

$header sind die Daten. Deswegen gibt er auch die ganzen Buttons aus. Denn die Infos stehen im Header anscheinend schon drin 

das Problem ist die Select Abfrage die nicht funktioniert. Deswegen bekommst du auch die Fehlermeldung result(0) im Code oben


----------



## boss3D (29. Juli 2014)

^^ Siehe EDIT2: Hatte gerade selbst den "Geistesblitz" ... 

Nur, wie ändere ich das jetzt, dass sich der Daten AUS DER DB holt und nicht die Website exportiert???


----------



## BenRo (29. Juli 2014)

Kannst du noch mal den aktuellen Stand zippen?


----------



## boss3D (29. Juli 2014)

*


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

*


----------



## TessaKavanagh (29. Juli 2014)

Ich würde Testweise mit einem Cleanen neuen PHP Dokument anfangen.
1. Dann eine DB Verbindung aufbauen 
2. Herausfinden mit welcher SELECT du überhaupt ein Ergebnis bekommst
(Ich würde hier entweder mit einem Objekt oder Mehrdimensionalen Array Arbeiten um die Abfrage von 2 Tabellen mit Select zu vermeiden) Ich denke das hier nämlich das Problem auftritt.
3. Das Ergebnis kannst du dann entsprechend als CSV Exportieren.


----------



## boss3D (29. Juli 2014)

Deine Vermutung geht in die richtige Richtung: Das erste Problem war in der Tat, dass er die DB-Verbindung aus _config.php_ in _export.php_ nicht gefunden hat (warum auch immer, nachdem letztere doch eigentlich erst später aufgerufen wird). So funktioniert schon mal das query:
	
	



```
<?php    
    $mysqli = new mysqli('localhost', 'root', 'root', 'projektzeiterfassung');
    if ($mysqli->connect_errno) {
        echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (".$mysqli->connect_errno.") ".$mysqli->connect_error;
    }
          
    $export = mysqli_query($mysqli, "SELECT * FROM projekte, zeiten;");  
    $fields = mysql_num_fields($export); 

    for ($i = 0; $i < $fields; $i++) {  
        $header .= mysql_field_name($export, $i)."\t";  
    }  
    while ($row = mysql_fetch_row($export)) {  
        $line = '';  
        foreach ($row as $value) {                                              
            if ((!isset($value)) or ($value == "")) {  
                $value = "\t";  
            } else {  
                $value = str_replace('"', '""', $value);  
                $value = '"'.$value.'"'."\t";  
            }  
            $line .= $value;  
        }  
        $data .= trim($line)."\n";  
    }  
    $data = str_replace("\r", "", $data); 

    if ($data == "") {  
        $data = "\n(0) Records Found!\n";                          
    }
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    print "$header\n$data";
```
Jetzt stellt sich halt die Frage, welcher verdammte header exportiert das ganze Website-Gerümpel? 
Soll ich einfach alle header rausschmeißen?




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## TessaKavanagh (29. Juli 2014)

Der Hardkill wäre vermutlich direkt vor dem Aufruf des Exports ein "header_remove();" einzufügen. Das sollte eigentlich alle bisher gesetzten header löschen.

Alternativ wäre es evtl auch möglich die Export als eigenes Dokument ohne zugriff auf irgendeine andere Seite zu erstellen und als Target = blank in einem neuen Fenster zu öffnen.


----------



## boss3D (29. Juli 2014)

^^ header_remove() hatte ich jetzt testweise vor dem include() in _formular.php_ gesetzt, ohne Wirkung, und dann noch direkt in _export.php_ über den headern, ebenfalls ohne Wirkung.

Wie meinst du das zweite? _export.php_ greift eh auf keine andere Seite zu?!


----------



## BenRo (29. Juli 2014)

Fehler Nummer 1: Also mysql_num_fields und mysql_field_name und mysql_fetch_row sind alles mysql_-Funktionen, du benötigst aber die jeweiligen mysqli_-Funktionen (wie die jeweils heißen und funktionieren steht im PHP-Handbuch). 

Problem Nummer 2: Damit die Notices verschwinden $header und $data auf '' initialisieren.

Fehler Nummer 3: Die auswerten.php wird includet, weil $section auf 'output' gesetzt ist. Workaround, siehe unten.

Problem Nummer 4: Du solltest besser Kommas anstatt Tabs verwenden

So hab ich das mal geändert:
*export.php*

```
<?php
	$select = "SELECT * FROM projekte, zeiten";                  
	$export = mysqli_query($mysqli, $select);  
	$fields = $mysqli->field_count;

    $header = $data = '';
    
	for ($i = 0; $i < $fields; $i++) { 
		$headerObj = mysqli_fetch_field_direct($export, $i);
        $header .= $headerObj->name.",";
	}  
    
	while ($row = mysqli_fetch_row($export)) {  
		$line = '';  
		foreach($row as $value) {                                              
			if ((!isset($value)) OR ($value == "")) {  
				$value = "\t";  
			} else {  
				$value = str_replace('"', '""', $value);  
				$value = '"' . $value . '"' . ",";  
			}  
			$line .= $value;  
		}  
		$data .= trim($line)."\n";  
	}  
	$data = str_replace("\r","",$data); 
	
	header("Content-type: application/octet-stream");  
	header("Content-Disposition: attachment; filename=extraction.xls");  
	header("Pragma: no-cache");  
	header("Expires: 0");  
	
	print "$header\n$data";
```

*index.php*

```
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
	if (!isset($_POST['export'])) {
		include('html_header.php');
	}

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or ($section == "output" && !isset($_POST['export']))) {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } elseif(!isset($_POST['export'])) {
            include('projektzeiterfassung.php');
        }
    }
	
	if (!isset($_POST['export'])) {
		include('html_footer.php');
	}
```

Es funktioniert. Schön ist die index.php zwar nicht, aber ich wollte mich nicht näher mit der Bedeutung von $section auseinandersetzen. 

Edit: Mit "Es funktioniert" meine ich: Keine Fehlermeldungen, keine Notices, kein obskurer HTML-Code/Buttons in der Ausgabe, jede Menge Daten in der Ausgabe. Ob die Daten korrekt und wie erwartet sind? Vermutlich nicht, musst du dir nochmal ansehen.


----------



## DarkMo (29. Juli 2014)

bei einem schnellen überblick: mir kommts so vor, als würde der server wie gehabt die php in ne html umbauen und diese html dann in ne excel datei exportieren. also musst du die html generierung so anpassen, dass nur noch das drin steht, was du exportiert haben möchtest. sprich: buttons raus usw.

btw: nur noch wenige stunden bis zur ersten prüfung - ich will nich


----------



## boss3D (29. Juli 2014)

Ja, funktionieren tut's, aber er gibt wieder alles exakt wie in den angegebenen Tabellen aus, also nur IDs. 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ich hoffe, ich kann das über's query richten. Was ich aber nicht verstehe, ist, wie aus drei bzw. fünf DB-Zeilen 15 Zeilen im Excel entstehen.


----------



## DarkMo (29. Juli 2014)

die vielen zeilen aus wenigen entstehen durch die verknüpfung der tabellen projekte und zeiten. im endeffekt brauchste nur den selben sql string wieder wie bei der ausgabe (der elendlange), den bissl anpassen (die zeitgrenzen, die user-beschränkung). die ausgabe wie bisher, nur dass du eben allen html krams WEGLÄSST. also aus <td>MO</td> als tabellenkopf wird einfach ein MO und fertig. dann sollte das flutschen.


----------



## BenRo (29. Juli 2014)

Naja, ganz einfach 3*5 = 15.

Du kannst das über den SQL-Query lösen.


----------



## TessaKavanagh (29. Juli 2014)

Statt ID's sollen da also Kreuzverweise stehen? Dann musst du das ganze etwas/deutlich komplizierter aufbauen . Denn dann musst du ja jedes mal erst den entsprechenden der ID zugeordneten Eintrag aus der anderen DB aufrufen und die ID für den Export durch den Wert ersetzen. Dafür würde ich normalerweise vorschlage das ganze in einer Klasse zu kapseln, dann wird das aber heute nix mehr.


----------



## boss3D (29. Juli 2014)

@ DarkMo
Zerlegen, zumindest so wie ich es gemacht hätte, bringt nichts:

auswerten_anfang.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>';
```
auswerten.php
	
	



```
<?php
    $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>';
    }
```
auswerten_ende.php
	
	



```
<?php
    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">';
```
index.php
	
	



```
<?php
    session_start();
    session_regenerate_id();

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

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten_anfang.php');
            include('auswerten.php');
            include('auswerten_ende.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2_anfang.php');
            include('auswerten2.php');
            include('auswerten_ende.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    include('html_footer.php');
```
^^ Da exportiert er immer noch die Buttons und alles mit.


----------



## BenRo (29. Juli 2014)

@TessaKavanagh: Prinzipiell sind Klassen toll, aber nachträglich eine für so etwas simples einzubauen, halte ich für unnötig. Insbesondere da ja ein ähnlicher Query wie der benötigte bereits vorhanden ist, wie DarkMo richtig feststellt. Außerdem: MySQL kann sehr viel, wenn man das Potential ausschöpft hat man eine übersichtlichere und schnellere Anwendung als alles auf PHP-Seite zu machen.

@boss3D: Zumindest bei mir steht in $section beim Export "output". Daran wirds liegen.


----------



## boss3D (29. Juli 2014)

@ Tessa
Das wird so oder so nichts mehr.  Um 12:00 sollte es fertig sein ... und ich kenne mich wieder gar nicht mehr aus, was ihr alle meint. Bezieht ihr euch aufeinander, oder redet jeder von seinem eigenen???

Jetzt habe ich mal gemäß DarkMo's Vorschlag das query aus _auswerten.php_ genommen, aber kriege natürlich wieder alle Buttons und jeden Mist exportiert. Sollte ich dieses query in BenRo's Vorschlag einbauen?


----------



## BenRo (29. Juli 2014)

boss3D schrieb:


> Jetzt habe ich mal gemäß DarkMo's Vorschlag das query aus _auswerten.php_ genommen, aber kriege natürlich wieder alle Buttons und jeden Mist exportiert. Sollte ich dieses query in BenRo's Vorschlag einbauen?


 
Ich sag einfach mal: Ja.


----------



## boss3D (29. Juli 2014)

Habe ich gemacht, aber jetzt müsste ich halt das query anpassen. Verkürzen ist ja nicht schwer, damit erstmal nur noch die gewünschten Felder ausgegeben werden:
	
	



```
$select = "SELECT 
                t.taetigkeit AS Taetigkeit, 
                p.produkt AS Produkt,  
                pr.beschreibung AS Beschreibung,  
                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;";
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Das komische Ding am Anfang dürfte die auto_increment id aus der DB sein (?), aber das ignoriere ich erstmal. Jetzt halt überlegen, wie ich das query weiter umbauen muss, um an meine DB-Inhalte zu kommen ...

Ist halt auch doof, dass er das einfach in einer Wurscht exportiert und nicht jedes Ding in eine Spalte schreibt.


----------



## TessaKavanagh (29. Juli 2014)

Jop du bekommst zumindest einen Export ohne Buttons.

Weitergedacht müsste halt normalerweise während der Abfrage das ganze noch ergänzt werden, damit es statt der ganzen ID's die entsprechenden Bezeichnungen ausgibt, das Ganze nicht in eine Zelle Pro Zeile schreibt sondern das Trennzeichen (",") auch "Erkannt" wird.
Dann würde da im Ergebnis das Rauskommen was du haben möchtest.

Der Code ist halt noch nicht "vollständig" sondern nur die einfachste Möglichkeit.


----------



## boss3D (29. Juli 2014)

Worauf bezieht sich das jetzt? ...





BenRo schrieb:


> @boss3D: Zumindest bei mir steht in $section beim Export "output". Daran wirds liegen.


----------



## BenRo (29. Juli 2014)

Kannst du ignorieren. Wäre relevant gewesen, hättest du es anders gelöst.


----------



## DarkMo (29. Juli 2014)

mMn brauchst du nur den code aus auswerten.php mit ohne den tr's und td's *. naja, und natürlich musst du den sql string schon noch mit in das file rein nehmen ^^ weil wenn du _anfang und _ende bei export nicht ausgeben lässt, dann fehlt auch das sql-ergebnis und es wird nix angezeigt.

*

```
// aus
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';

// wird (naiv)
                for ($i = 0; $i < count($td); $i++) {
                    echo $td[$i];
                }

// wird (mit anpassung an ben's code)
                for ($i = 0; $i < count($td); $i++) {
                    $value = $td[$i]
                    if ($value == "") {  
                        $value = "\t";  
                    } else {  
                        $value = str_replace('"', '""', $value);  
                        $value = '"' . $value . '"' . ",";  
                    }  
                    $line .= $value;  
                }  
                $data .= trim($line)."\n";
            }
```
jetzt müsste man mal schauen, was data und line so machen ^^ asö, das is das dingen, k. dann könnt es uU so schon klappen:

```
<?php
    $header = $data = '';
    
    $select = "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;";
    $export = mysqli_query($mysqli, $select);  
    if (!$export) {
        $data = 'Ungültige Abfrage: '.$mysqli->error;
    } else {
        $fields = $mysqli->field_count;

        for ($i = 0; $i < $fields; $i++) { 
            $headerObj = mysqli_fetch_field_direct($export, $i);
            $header .= $headerObj->name.",";
        }  

        $row_collector = array();
        while ($row = mysqli_fetch_assoc($export)) {
            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] = "";
                    }
                }
                $line = '';  
                for ($i = 0; $i < count($td); $i++) {
                    $value = $td[$i]
                    if ($value == "") {  
                        $value = "\t";  
                    } else {  
                        $value = str_replace('"', '""', $value);  
                        $value = '"' . $value . '"' . ",";  
                    }  
                    $line .= $value;  
                }  
                $data .= trim($line)."\n";
            }
        }
    } else {
        $data = 'Keine Einträge gefunden.';
    }

    $data = str_replace("\r","",$data); 
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
```
so in etwa. ist jetzt natprlich ungetestet ^^ aber so könnts schon funktionieren. ist quasi dein auswerten code in ben's code integriert und dazu leicht modifiziert.


----------



## BenRo (29. Juli 2014)

In Zeile 48 fehlt ein Semikolon. Der Code hat zwei else-Blöcke. Sonst scheint es auf den ersten Blick gut auszusehen.

Edit: Und die Kopfzeilen "tID" und "pID" braucht man ja nicht. Anstatt 

```
for ($i = 0; $i < $fields; $i++) { 
            $headerObj = mysqli_fetch_field_direct($export, $i);
            $header .= $headerObj->name.",";
        }
```
könnte man einfach

```
$header = 'Taetigkeit,Produkt,Beschreibung,User,Zeit,Datum';
```
schreiben.

Noch ein EDIT. Jetzt passts.


----------



## boss3D (29. Juli 2014)

Oh, mein Gott! Jetzt kommt nur mehr Mist raus ... 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



auswerten_anfang.php
	
	



```
<?php
    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>';
```
auswerten.php
	
	



```
<?php
    $header = $data = '';
    
    $select = "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;";
    $export = mysqli_query($mysqli, $select);  
    if (!$export) {
        $data = 'Ungültige Abfrage: '.$mysqli->error;
    } else {
        $fields = $mysqli->field_count;

        for ($i = 0; $i < $fields; $i++) { 
            $headerObj = mysqli_fetch_field_direct($export, $i);
            $header .= $headerObj->name.",";
        }  

        $row_collector = array();
        while ($row = mysqli_fetch_assoc($export)) {
            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] = "";
                    }
                }
                $line = '';  
                for ($i = 0; $i < count($td); $i++) {
                    $value = $td[$i];
                    if ($value == "") {  
                        $value = "\t";  
                    } else {  
                        $value = str_replace('"', '""', $value);  
                        $value = '"' . $value . '"' . ",";  
                    }  
                    $line .= $value;  
                }  
                $data .= trim($line)."\n";
            }
        }
    }

    $data = str_replace("\r","",$data); 
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
```
auswerten_ende.php
	
	



```
<?php
    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">';
```
index.php
	
	



```
<?php
    session_start();
    session_regenerate_id();

    include('config.php');
    include('formular.php');
    if (!isset($_POST['export'])) {
        include('html_header.php');
    }

    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.html');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or ($section == "output" && !isset($_POST['export']))) {
            include('auswerten_anfang.php');
            include('auswerten.php');
            include('auswerten_ende.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } elseif(!isset($_POST['export'])) {
            include('projektzeiterfassung.php');
        }
    }
    
    if (!isset($_POST['export'])) {
        include('html_footer.php');
    }
```
export.php
	
	



```
<?php
    //$select = "SELECT * FROM projekte, zeiten"; 
    $select = "SELECT 
                t.taetigkeit AS Taetigkeit, 
                p.produkt AS Produkt,  
                pr.beschreibung AS Beschreibung,  
                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;";                      
    $export = mysqli_query($mysqli, $select);  
    $fields = $mysqli->field_count;

    $header = $data = '';
    
    for ($i = 0; $i < $fields; $i++) { 
        $headerObj = mysqli_fetch_field_direct($export, $i);
        $header .= $headerObj->name.",";
    }  
    
    while ($row = mysqli_fetch_row($export)) {  
        $line = '';  
        foreach($row as $value) {                                              
            if ((!isset($value)) OR ($value == "")) {  
                $value = "\t";  
            } else {  
                $value = str_replace('"', '""', $value);  
                $value = '"' . $value . '"' . ",";  
            }  
            $line .= $value;  
        }  
        $data .= trim($line)."\n";  
    }  
    $data = str_replace("\r","",$data); 
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
```
Leute, vergesst den Export, das wird bis 12:00 nichts mehr. Ich habe auch schon zuviel Angst, mir jetzt am Ende noch den Code zu zerschießen. Ich bastle jetzt lieber alles auf den letzten funktionierenden Zustand ohne Export zurück ...


----------



## DarkMo (29. Juli 2014)

wozu rufst du auswerten noch auf? NUR export ><


----------



## boss3D (29. Juli 2014)

Was? Wo? Wie? ... redest du von _index.php_?

_auswerten.php_ brauche ich auf jeden Fall noch, wie sollen sich denn die User sonst ihre Einträge anzeigen lassen? Das kann ich jetzt nicht einfach zugunsten des Exports wegsparen!


----------



## DarkMo (29. Juli 2014)

kerl, es geht doch jetz ums exportieren ^^ wenn der export button gedrückt wurde, braucht dein php script nur die config.php, vllt noch die formular.php und danach NUR noch die export.php. fertig. und da wir ja gerade vom exporten reden, ist jegliche betrachtung der auswerten.php völlig latte ^^


----------



## BenRo (29. Juli 2014)

Wenn du eine Deadline um 12.00 Uhr hast, würde ich dir dazu raten, einfach erstmal den Button für den Export rauszunehmen/zu verstecken. Damit machst du nichts kaputt und präsentierst keine unfertige/nicht funktionierende Funktion.

Nutze die verbleibenden 10 Minuten dafür, das System nochmal kurz durchzutesten, damit du, wenn du es vorstellen musst, nicht in eine peinliche Situation kommst.

Wie du dann weiter vorgehst hängt ein bisschen davon ab, wieviel Zeit du für die Fertigstellung bekommst. Du kannst entweder nach und nach auf eine sinnvollere, leichter zu wartende Struktur umstellen (OOP, PDOs & prepared statements, ...), oder aber, wenn nur wenig Zeit ist, nochmal in Ruhe den Export ansehen.


----------



## boss3D (29. Juli 2014)

Ich komme trotzdem nicht mehr mit. Das ist alles schon so zerstückelt ...

Eigentlich hat das ja jetzt überhaupt keinen Sinn gehabt, _auswerten.php_ in 3 Teile zu zerlegen?! Und in _index.php_ haben wir gar keinen Aufruf von _export.php_. Dieser ist in _formular.php_, das wiederum von _index.php_ aufgerufen wird ... und in mir dreht sich schon alles.

Im Moment ist es jedenfalls so, dass auf _projektzeiterfassung.php_ der "Einträge anzeigen" Button sofort exportiert und gar nicht mehr nach _auswerten.php_ führt.

^^ Also ich blicke nicht mehr durch ...
---------------

@ BenRo
Ist alles halb so wild, mir wurde eh immer wieder über die Schulter geschaut. Die wissen eh, wie's ungefähr läuft, wo's Probleme gab und was sie erwarten können. "Offiziell" ist morgen 16:00 alles zuende. Aber heute nach der Mittagspause wird das Teil erstmal auf den Server gespielt. Wenn wir heute Nachmittag oder morgen noch den Export hinkriegen, könnte man das sicher noch als "Update" auf den Server raufspielen.


----------



## BenRo (29. Juli 2014)

Keine Panik. Gehe einfach zum letzten Stand zurück, wo noch alles (bis auf der Export) funktioniert hat.


----------



## boss3D (29. Juli 2014)

^^ Den letzten funktionierenden Stand hatte ich eh selbst am USB-Stick gesichert, ist nichts verloren. 

(BTW: Siehe letzter Absatz im Vorposting)


----------



## BenRo (29. Juli 2014)

Wenn du mal etwas Zeit hast: Schau dir mal git oder Mercurial oder ein anderes Source Control/Revision Control-System an. Vorteile sind u. A.:
- Eine Übersicht wann du an welcher Datei welche Änderungen gemacht hast (inkl. Kommentare weswegen du diese gemacht hast)
- Möglichkeit zu jedem beliebigen Stand zurückzuspringen
- Leichtere Datensynchronisation, wenn du an mehreren Rechnern arbeitest

EDIT: Ah, bis morgen Nachmittag bekommst du den Export bestimmt hin. Ich muss mich leider für heute ausklinken, schaue morgen wieder rein.


----------



## boss3D (29. Juli 2014)

Habe beim Testen gerade festgestellt, dass nach der Registration plötzlich kein Button zum Login mehr angezeigt wird ... 
K. A. wo der hinverschwunden ist. Immerhin über "Abbrechen" kommt man auch wieder zu Login, aber schön ist anders. DAS sollte ich allermindestens heute noch richten. Jetzt erstmal Mittagspause ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## DarkMo (29. Juli 2014)

wieso ist das in formular.php? ^^ du brauchst in der index ne if-verzweigung, die je nach dem export-button entscheidet. ist der gedrückt, wird config, formular und export includiert, ansonsten das bisherige *so als simpler erster ansatz*


----------



## DarkMo (29. Juli 2014)

wegen dem login gerödel: schau mal in formular.php bei btnReg bla nach. da hab ich bei allen fehlermeldungen die section und site_variablen variablen angepast - nich dass ich da im eiffer des gefechts auch bei der "alles ok" ausgabe den krams reingebaut hatte ^^ dann einfach dort alles bis auf die ausgabe löschen


----------



## boss3D (29. Juli 2014)

Irgendwo hier hat's auf jeden Fall was, wobei ich aber nicht glaube, dass was "zuviel" da ist. Eher zu wenig?!

```
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.';
                        // hier fehlt was?
                    } else {
                        $protokoll .= '- Fehler: Der Benutzername war schon vorhanden.';
                        $_POST['btnRegForm'] = true;
                        unset($_POST['btnReg']);
                        $site_title = "Registrieren";
                    }
                }
            }
        }
```
[EDIT]
So ging's wieder:

```
if ($eintragen) {
     //$protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
     echo '<div class="submit"><form  action="login.html">Benutzer <b>'.$username.'</b> wurde  erstellt.<br><br><input type="submit"  value="Login"></form></div>';
}
```
[EDIT2]
Aber dann verwurschtelt er den Login optisch wieder, vermutlich wegen der <div> ... *seufz*
Am Ende hat sich dein Schema ehrlich gesagt mehr als Plage denn als Segen rausgestellt.

Auch gerade gemerkt: Dann funktionieren die Buttons bei Login nicht mehr.


----------



## DarkMo (29. Juli 2014)

wieso zum henker baust du da wieder dieses sinlose div rein mit der form die direkt login.php aufruft? WIESO *dramatisch auf knie fall und wein*

ne ernsthaft, ich dacht ich hätt dich von dieser "multi-form-seuche" befreit >< es ist doch klar wie klosbrühe, dass du dir mit dieser form da alles zerstörst. wenn das nu eigentlich richtig is, dann bau da eben die section usw auch mit rein (wie bei den fehlern), nur dass du eben die werte so drehst, dass login aufgerufen wird. das sollte alles sein.


```
if ($eintragen) {
                        $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                        // hier fehlt was?
                        $_POST['btnRegForm'] = false;
                        unset($_POST['btnReg']);
                        $site_title = "Login";
                    } else {
```
</span></span>


----------



## boss3D (29. Juli 2014)

Ich bin mir nicht sicher, ob du verstanden hast, was ich gerade will?! 

Einfach nur den Titel "Login" anzeigen bringt gar nichts. Sobald sich ein User registriert hat, soll ihm ein *Button* "Login" angezeigt werden, der ihn auch da hin führt. Mit deinen Code-Veränderungen kriege ich aber auch nur das:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Irgendwann hast du wohl unabsichtlich den Button, den wir ja schon hatten, entfernt. Und ich versuche jetzt, den eben wieder reinzubauen, auch wenn das natürlich mit der form sehr suboptimal ist und, ich glaube, eh nicht funktioniert.


----------



## DarkMo (29. Juli 2014)

notfalls kopier doch ganz einfach den abbrechen button und gib ihm den gewünschten value. wieso mein dinges nich klappt is übrigens glaube deswegen: bei meiner aufzählung fehlt noch ein $section = 'login'; das sollte es gewesen sein. erste prüfung btw durch nu, mit nem sehr guten gefühl 

```
if ($eintragen) {
                        $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                        // hier fehlt was?
                        $_POST['btnRegForm'] = false;
                        unset($_POST['btnReg']);
                        $site_title = "Login";
                        $section = 'login';
                    } else {
```


----------



## boss3D (30. Juli 2014)

^^ Dadurch kommt aber auch kein Button. Das mit $section hattest du eh schon gesagt gehabt und ich hatte es schon erfolglos ausprobiert:

```
if ($eintragen) {
     $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
     $_POST['btnRegForm'] = false;
     unset($_POST['btnReg']);
     $site_title = "Login";
     $section = 'login';
}
```
Wenn ich aus _registrieren.html_ wieder _registrieren.ph_p mache und das so umgestalte ...
	
	



```
<table class="login">
    <tr>
    <th colspan="2">Registrierung</th>
    </tr><tr>
        <td>Ihr Username:</td>
        <td><input type="text" size="50" maxlength="50" name="username"></td>
    </tr><tr>
        <td>Ihr Passwort:</td>
        <td><input type="password" size="50" maxlength="50" name="password"></td>
    </tr><tr>
        <td>Passwort bestätigen:</td>
        <td><input type="password" size="50" maxlength="50" name="password2"></td>
    </tr>
</table>
<input type="submit" name="btnReg" value="Registrieren"> 
<?php
    if ($eintragen) {
        echo '<input type="submit" name="btnRegCancel" value="Login">';
    } else {
        echo '<input type="submit" name="btnRegCancel" value="Abbrechen">';
    }
```
... , dann kriege ich zwar "undefinded variable bla", aber es geht. 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ich schaue, dass ich heute hoffentlich noch den Export vernünftig hinkriege ...


----------



## boss3D (30. Juli 2014)

_export.php_ habe ich jetzt wieder so:
	
	



```
<?php
    $header = $data = '';
    
    $select = "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;";
    $export = mysqli_query($mysqli, $select);  
    if (!$export) {
        $data = 'Ungültige Abfrage: '.$mysqli->error;
    } else {
        $fields = $mysqli->field_count;

        $header = 'Taetigkeit, Produkt, Beschreibung, User, Zeit, Datum';  

        $row_collector = array();
        while ($row = mysqli_fetch_assoc($export)) {
            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] = "";
                    }
                }
                $line = '';  
                for ($i = 0; $i < count($td); $i++) {
                    $value = $td[$i];
                    if ($value == "") {  
                        $value = "\t";  
                    } else {  
                        $value = str_replace('"', '""', $value);  
                        $value = '"' . $value . '"' . ",";  
                    }  
                    $line .= $value;  
                }  
                $data .= trim($line)."\n";
            }
        }
    }

    $data = str_replace("\r","",$data); 
    
    header("Content-type: application/octet-stream");  
    header("Content-Disposition: attachment; filename=extraction.xls");  
    header("Pragma: no-cache");  
    header("Expires: 0");  
    
    print "$header\n$data";
```
Liefert:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Was also jetzt machen? Muss ich jetzt _auswerten.php_ wirklich in Anfang, Hauptteil und Ende aufspalten? Ja oder nein?

Die Sache ist ja: Mir würde ja dieser Teil hier ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



... sogar ganz gut gefallen (v. a. weil da ne Formatierung bleibt), wenn nur die Buttons nicht wären. Und dafür wäre auch kein bisschen Code nötig, außer den header Zeilen.


----------



## BenRo (30. Juli 2014)

Wenn das so ist, dann nimm doch einfach die Buttons raus. 

Edit: Sorry, das war nicht sonderlich hilfreich.
Also: Die Buttons müssen nur ausgegeben werden, wenn es sich nicht um die Export-Seite handelt. Kannst du ja einfach mit if überprüfen.


----------



## boss3D (30. Juli 2014)

^^ Ja, genau darum geht's (mir) jetzt. Daher ja die Frage: Muss ich dazu _auswerten.php _wieder in die drei Teile aufspalten? Anders kriege ich die Buttons eh nicht weg, oder?

Allerdings habe ich's auch noch nicht kapiert, wie ich denn dann die drei Teile wirklich in _index.php_ integrieren muss, damit ich dann die gewünschte Funktionsweise kriege ...


----------



## BenRo (30. Juli 2014)

Kannst du aufspalten, muss aber nicht sein:
Du kannst das auch innerhalb der Datei lösen.
Oder du könntest auch den Code kopieren und in export einfügen und dann alles rausnehmen, was nicht benötigt wird.


----------



## boss3D (30. Juli 2014)

^^ Letzte Idee ist gut ... 

export.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="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 '      </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];
                    } 
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
    }
```
Liefert:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Problem: Der obere Teil würde schon passen und ist das aus _export.php_. Der untere Teil ist _auswerten.php_, bei dem ich jetzt gar keinen Plan habe, wodurch das mitexportiert wird. Die header gibt's ja in _export.php_ nicht mehr.


----------



## BenRo (30. Juli 2014)

Das wird mitexportiert, weil es in index.php includet wird. Schau dir an unter welchen Bedingungen das passiert.


----------



## boss3D (30. Juli 2014)

Hab's gerade gemerkt.

index.php
	
	



```
<?php
    session_start();
    session_regenerate_id();

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


    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.php');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    include('html_footer.php');
```
Jetzt wird halt gar nichts mehr exportiert ...

Wie richte ich das bloß?


----------



## BenRo (30. Juli 2014)

Wird export.php noch irgendwo includet? In formular.php vielleicht? Wenn nein wirds daran liegen, dass nichts mehr exportiert wird.


----------



## boss3D (30. Juli 2014)

In _formular.php_ ist es included.

Wenn ich die 4 header-Zeilen wieder am Ende von _export.php_ einfüge, wird wieder exportiert, aber eben Buttons und alles inklusive ...
^^ Ich verstehe das langsam überhaupt nicht mehr: Wozu habe ich mir denn jetzt überhaupt eine eigene _export.php_ mit BUTTONFREIEM Code von _auswerten.php_ gebastelt, wenn der das scheinbar eh gänzlich ignoriert? Wenn ich gleich _auswerten.php_ über den Button exportieren würde, hätte ich das selbe (verpfuschte) Ergebnis. 

Die header muss ich wieder wegbringen, aber exportieren soll er trotzdem. Wie stelle ich das bloß an???


----------



## BenRo (30. Juli 2014)

In index.php wird mehr includet, als du brauchst. Schau dir doch einfach mal die if-Bedingungen an. Gib dir testweise aus, was in $section steht. Wenn da z. B. 'output' drin stünde, ist es logisch, dass auswerten.php includet wird, die ja die Buttons enthält, die du aber für den Export nicht brauchst. Oder wird vielleicht projektzeiterfassung.php includet?

Weißt du überhaupt, was deine index.php tut und warum? Wenn nein, finde es heraus.


----------



## boss3D (30. Juli 2014)

In $section steht immer genau das, was nach dem or steht (machen die or-Teile daher überhaupt Sinn? Bzw., der andere Teil der Bedingung?) ...

Ich kapiere jedenfalls nicht, wie das alles zusammenhängt. In _auswerten.php_ ist zwar der Export-Button, aber die Abhandlung findet in _formular.php_ statt, in der es gar keine Buttons gibt. Und _formular.php_ wird ja in _index.php_ auch lange vor allem anderen aufgerufen.



[EDIT]
Wenn ich's so mache (und das include aus _formular.php_ rausnehme), passiert nichts, wenn ich auf "Export" klicke (egal ob mit oder ohne header in _export.php_):
	
	



```
<?php
    session_start();
    session_regenerate_id();

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


    if (!isset($_SESSION['name'])) {
        if (isset($_POST['btnRegForm']) or $section == "register") {
            include('registrieren.php');
        } else {
            include('login.html');
        }
    } else {
        if (isset($_POST['auswerten']) or $section == "output") {
            include('auswerten.php');
        } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
            include('auswerten2.php');
        } elseif (isset($_POST['export'])) {
            unset($_POST['auswerten']);
            unset($_POST['auswertenadmin']);
            include('export.php');
        } else {
            include('projektzeiterfassung.php');
        }
    }
    
    include('html_footer.php');
```


----------



## TessaKavanagh (30. Juli 2014)

Du arbeitest mit include() richtig?
Jetzt klären wir etwas Grundlegendes
du hast die Dateien index.php mit dem Inhalt: 

```
<?php
include("formular.php");
include("auswerten.php");
include("exportieren.php");
?>
```
Dann die Datei formular.php mit dem Inhalt:

```
CODE_VON_FORMULAR.PHP
```
Die Datei auswerten.php mit Inhalt:

```
CODE_VON_AUSWERTEN.PHP
```
DIe Datei export.php mit dem Inhalt:

```
CODE_VON_EXPORT.PHP
```

Include macht jetzt nichts anderes als "Kopieren" und "Einfügen" also Strg+C und Strg+V

aus deiner Index.php wird dadurch:

```
<?php
CODE_VON_FORMULAR.PHP

CODE_VON_AUSWERTEN.PHP

CODE_VON_EXPORT.PHP

?>
```

es handelt sich bei der Ausgabe sozusagen um EINE Datei und alles wird nacheinander gemacht. Steht also der Code von Formular.php über dem Code von Export.php wird dieser Code also zuerst ausgeführt und danach der Code aus Export.php.

Oder mit anderen Worten du darfst deine Dateien nicht als getrennte Seiten betrachten. Es handelt sich hier im Endeffekt um EINE Seite die nur aus bearbeitungstechnischen Gründen auf mehrere Dateien Verteilt wurde um den Code zu strukturieren.


----------



## DarkMo (30. Juli 2014)

wieso nicht so?

```
<?php
    session_start();
    session_regenerate_id();

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

    [COLOR="blue"][B]if(isset($_POST['export'])) {
        include('export.php');
    } else {[/B]        include('html_header.php');

        if (!isset($_SESSION['name'])) {
            if (isset($_POST['btnRegForm']) or $section == "register") {
                include('registrieren.php');
            } else {
                include('login.html');
            }
        } else {
            if (isset($_POST['auswerten']) or $section == "output") {
                include('auswerten.php');
            } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
                include('auswerten2.php');
            } elseif (isset($_POST['export'])) {
                unset($_POST['auswerten']);
                unset($_POST['auswertenadmin']);
                include('export.php');
            } else {
                include('projektzeiterfassung.php');
            }
        }
    
        include('html_footer.php');
    [B][COLOR="blue"]}[/B]
```
dann wird NUR export.php ausgeführt - das was auch soll. deine formatierte headerdingens übernimmste wie ben schon sagte einfach in export und schon sollt es lüppen. wie gesagt: er baut ganz normal eine seite (eher ein dokument, mal allgemein formuliert) - also der server - und schickt dir das dann. das wird gemacht, indem er die von dir angegebenen ausgaben eben in dieses dokument speichert. bei auswerten.php usw erstellst du damit eben ein html dokument, das dann zu dir gesendet wird. im falle von export, willst du aber kein html, du möchtest ne excel-tabelle, also darf da dann eben auch kein htmlcode geschrieben werden.

edit: mal farblich die änderung markiert. @tessa - gut veranschaulicht. hab ich in textform zwar auch schon 3mal erklärt, aber so isses vllt verständlicher


----------



## boss3D (30. Juli 2014)

@ Tessa
Dass es im Prinzip EIN File ist, habe ich schon kapiert (nach DarkMo's 3 Ausführungen ). Allerdings besteht nach meinem Verständnis dieses "EINE" File NIE aus ALLEN "kleinen" Files, je nachdem, was halt alles an Bedingungen zurtrifft oder eben nicht.
Deswegen hätte ich versucht, eine Version von _index.php_ zu basteln, die im Falle von "Export" angeklickt NUR _config.php_, _formular.php_ und eben _export.php_ beinhaltet, aber definitiv keines der beiden Auswerten-Dinger. Dann wären eben die drei Files der EINE Gesamtcode gewesen, was ja auch passen müsste. DarkMo hat's ja geschafft, nur dass er vergessen hat, das zweite elseif wieder zu entfernen ...

@ DarkMo
Sieht dann so aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Leider exportiert der nur 2 meiner Zeitwerte und nicht alle sechs, oder wie viele es eben insgesamt sind. Aber den Fehler hatte ich zuvor schon. K. A. wodurch das jetzt wieder passiert. Und blöderweise wandelt er Kommazahlen wieder in Daten ("ums") um, anstatt sie wie auf der Website darzustellen.


----------



## BenRo (30. Juli 2014)

Undefined offset bedeutet, dass in einem numerischen Array ein Wert nicht gesetzt ist, auf den du versuchst zuzugreifen.

Folgender Code wird einen "Undefined offset: 3" Fehler produzieren, da ich auf $beispiel[3] zugreife, obwohl nur $beispiel[1] und $beispiel[2] gesetzt sind.

```
$beispiel = array(1 => 'test', 2 =>'nocheintest');
print($beispiel[3]);
```

Undefined variable bedeutet, dass eine Variable nicht gesetzt ist, die du verwendest. Du musst dir Fragen stellen wie: Brauche ich diese Variable überhaupt? Wenn ja, warum ist sie nicht gesetzt? Wo sollte sie gesetzt werden? Habe ich sie richtig geschrieben?

Solche Notices sind da, um dir zu helfen, Fehler zu finden. Dein Ziel sollte NIEMALS einfach sein, sie verschwinden zu lassen, sondern immer den zugrunde liegenden Fehler zu beheben.


----------



## boss3D (30. Juli 2014)

Den Offset-Fehler verursacht diese Schleife in _export.php_:
	
	



```
for ($i = 0; $i < count($td); $i++) {
    echo '    <td>'.$td[$i].'</td>';
}
```
Aber da kann ich mir selbst nicht helfen, weil die von DarkMo stammt und ich keinen blassen Schimmer habe, was die macht. Irgendwie Tage zählen?! Deswegen kriege ich wahrscheinlich auch zuwenige angezeigt?!

Und das andere wäre das hier:
	
	



```
header("Content-Disposition: attachment; filename='".$username."'.xls");
```
Ich hatte eigentlich angenommen, dass der $username beim Login gesetzt wird, aber ich merke gerade, dass wir Login jetzt in _index.php_ immer erst nach Export aufrufen. Da muss ich mir dann auch noch einen workaround überlegen ...


----------



## TessaKavanagh (30. Juli 2014)

Warum bindest du Formular.php denn überhaupt ein wenn du exportieren willst? oder anders gefragt was hat Formular.php mit Export.php zu tun?


----------



## DarkMo (30. Juli 2014)

wochenanfangs-timestamp als bsp. wenn man in auswerten.php sich zu einer anderen kalenderwoche bewegt, wie die aktuelle...
ach, als bsp:
jetzt grad haben wir kw31, ich will mir die kw30 anschauen und als xls exportieren lassen
-> mit formular.php werden die hiddenfields mit den daten zur kw30 ausgewertet und die timestamps korrekt berechnet, mit denen die sql-anfrage gefüttert wird um die zeiten zu filtern (eben nur zeiten aus der gewünschten woche ausgeben).
-> ohne kann man auf auswerten.php sonstwas für ne woche einstellen, er wird IMMER nur den default (aktuelle woche) ausgeben

wegen dem fehlenden user:
- eigentlich passiert das "wieder aufnehmen" der session in der config.php -> hier sollte dann auch der username gesetzt werden (müsste was ala if isset session ip sein). also eigentlich sollte der auch ohne login.php bekannt sein *grübel*

wegen dem td_...
also grundsätzlich soll es so funktionieren:
er ließt erstmal alle spalten-werte einer tabellenzeile (also quasi den zellenwert - spalte/zeile kombiniert ergibt ne tabellen zelle -> ein <td> -> $td als varname ^^) ein und wenn er die hat, gibt er sie aus. weil eben nicht alle tage eine zeit haben und somit manche td[]'s ungesetzt wären, baut er diese "" werte rein - also rein vom prinzip her sollte es keine ungesetzten td's geben *grübel* jedenfalls wird dann am ende einfach das td-array per festem index durchlaufen um es auszugeben. wieso fester index (anstelle von foreach)? wenn ich sage td = array, dann td[2] = 2; und td[1] = 1; dann spielt hier die reihenfolge der erstellung eine rolle (array ist intern glaube eher eine liste). gebe ich das per foreach aus, so wird das array in der reihenfolge der erstellung ausgegeben -> 2 1. da ich aber 1 2 als ausgabe möchte, muss ichs per festem index machen.

das problem hatte ich ursprünglich, weil ich die tätigkeit, dann die beschreibung und DANN erst das produkt ins td gespeichert hatte. somit hätten wir bei ner foreach ausgabe die falsche reihenfolge gehabt (tatigkeit, beschreibung, produkt). im jetzigen stand sollte es auch so gehen. aber is eh nur ne seiten notiz.

poste mir bitte nochmal den row-collector codeteil. btw: wieso is beim exportieren immernoch das td zeugs drin? dachte das macht nur probleme?_


----------



## TessaKavanagh (30. Juli 2014)

Trotzdem braucht man Formular.php nicht für den Export.

1. Du befindest dich "auf" Formular.php und navigierst zur passenden Woche.
2. Du klickst auf den Button EXPORT STARTEN (Du befindest dich ja schon am richtigen Ort und kannst die benötigten Daten daher an Export.php übergeben)
3. Im Hintergrund wird nur die Datei Export.PHP aufgerufen, die die Daten von der vorherigen Seite übergeben bekommt. Als Ergebnis bekommst du dann einen Download der DB der aktuellen Kalenderwoche/des Users als .xls
4. Export.php leitet dich im Anschluss (automatisch) zurück auf Formular.php in der Woche in der du dich befunden hast.

Oder habe ich irgendwas übersehen?


----------



## BenRo (30. Juli 2014)

boss3D schrieb:


> Den Offset-Fehler verursacht diese Schleife in _export.php_:
> 
> 
> 
> ...



Da bist du auf der richtigen Spur.
So funktioniert for: Zuerst wird der erste Befehl in Klammern ($i = 0) ausgeführt, $i enthält also zunächst 0. Dann läuft es nach dem Prinzip: "Mache alles was zwischen den geschweiften Klammern {} steht solange, wie die Bedingungen (in diesem Fall $i < count($td)) erfüllt ist, also so lange wie der Wert in $i kleiner ist als count($td).
Nach jedem Durchlauf wird das $i++; ausgeführt, was nichts anderes bedeutet als $i = $i + 1;, das heißt nach jedem Durchlauf wird $i eins mehr.
count() kannst du im Handbuch nachschlagen, es zählt etwas (allermeistens, wie auch in diesem Fall, die Anzahl der Elemente in einem Array).
Also auf deutsch:
1. Setze $i auf 0.
2. So lange $i kleiner ist, als die Anzahl der Elemente im Array $td, gib folgendes aus: '<td>'.$td[$i].'</td>'.
3. Erhöhe nach der Ausgabe $i um eins.

Jetzt stellt sich die Frage, warum $td[3] nicht gesetzt ist.
Hier sollte das gesetzt werden:

```
if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
   $td[$i+3] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
}
```
Es wird aber nur dann gesetzt, wenn $row_collector[$taet_id]['data'][$prod_id]['time'][$ts] auch gesetzt ist (if(isset(...), isset() findest du im Handbuch). Ein Vorschlag wäre folgende Änderung:

```
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] = '';
```


EDIT: Was den Usernamen betrifft, kann es sein, dass die Variable $user und nicht $username heißen müsste? So sieht das zumindest in dem Code, den ich hier vorliegen habe aus.


----------



## DarkMo (30. Juli 2014)

ich weis leider nich genau, wie das dann tatsächlich abläuft. wenn dem so wäre jops. weil das wäre mein weitergehender gedanke gewesen: völlige entkopplung der export.php als eigenständige "seite" die man über target="_blank" aufruft, alles an daten per get oder so mitgibt (username und timestamps - wobei das auch nen sicherheitsrisiko is *grübel*) und dort rödeln lässt. aber wenn das eh die "aufrufende" seite garnich ändert/neu lädt, is ja gut. dann haste recht. ich habs halt selber noch nich getestet und mir vorgestellt, dass der browser die seite neulädt, man dieses excelfile sieht und speichern kann und dann aber nirgends mehr zurück kommt >< hab mir das schon reichlich unschön vorgestellt.


----------



## DarkMo (30. Juli 2014)

ich weis leider nich genau, wie das dann tatsächlich abläuft. wenn dem so wäre jops. weil das wäre mein weitergehender gedanke gewesen: völlige entkopplung der export.php als eigenständige "seite" die man über target="_blank" aufruft, alles an daten per get oder so mitgibt (username und timestamps - wobei das auch nen sicherheitsrisiko is *grübel*) und dort rödeln lässt. aber wenn das eh die "aufrufende" seite garnich ändert/neu lädt, is ja gut. dann haste recht. ich habs halt selber noch nich getestet und mir vorgestellt, dass der browser die seite neulädt, man dieses excelfile sieht und speichern kann und dann aber nirgends mehr zurück kommt >< hab mir das schon reichlich unschön vorgestellt.


edit: ah thx ben ^^ hast recht!
dieser lange kryptische wert fragt ab, ob der gewünschte tag einen wert hat, dann bekommt td diesen wert. allerdings bekommt er im fehlerfale eben keinen, is richtrig. deine lösung stimmt also. und genau hier kann man auch wegen dem datums-fehler ansetzen:

```
if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
   $td[$i+3] = [COLOR="red"]str_replace('.', ',', $row_collector[$taet_id]['data'][$prod_id]['time'][$ts][COLOR="red"]); // ersetze . durch ,
} else $td[$i+3] = '';
```

edit: ach damn, sollte nen edit werden ><


----------



## boss3D (30. Juli 2014)

Wie ne Schleife funktioniert, weiß ich schon ... 
Aber das essentielle, wie das mit dem td[] läuft, habt ihr ja auch erklärt. Danke.
Das hier hätte mir schon gereicht: 





DarkMo schrieb:


> dieser lange kryptische wert fragt ab, ob der gewünschte tag einen wert hat



Damit bleibt nur noch der &username-"Fehler". Vielleicht lässt sich's wirklich über die SESSION richten, muss ich gleich ausprobieren.

Und dann hätte wir noch "03. Mai" statt bspw. 3.5 h ... tja, K. A. Vermutlich macht Excel selbst das?! Eigentlich hätte ich aber gedacht, dass bei unserer "Schummelei" nach wie vor die Website selbst exportiert wird, und da stimmt's ja auch?!

[EDIT]
Ach, das letzte hattest du auch schon. Stimmt jetzt. 
--------------

Was mache ich jetzt bis 16:00? Irgendwelche Vorschläge? $salt per Zufallszahlengenerator erstellen wäre vielleicht noch interessant. Das schaue ich mir an ...
Ah ja, $username nicht vergessen.


----------



## DarkMo (30. Juli 2014)

boss3D schrieb:


> Damit bleibt nur noch der &username-"Fehler". Vielleicht lässt sich's wirklich über die SESSION richten, muss ich gleich ausprobieren.


wie gesagt, eigentlich sollte bei der config.php wo er nach der session fragt bei einer erfolgreichen aufnahme der existierenden session doch auch den usernamen wieder aus der session holen.
also bei btnLog in formular.php wird bei erfolgreichem login doch $_SESSION['name'] = $username; gespeichert (also sinngemäß, weis jetz ned, ob er den post-wert nimmt oder so) und darauf folgend wird in der config.php eben auf diese session geprüft und dann gesagt $username = $_SESSION['name']; is natürlich blöde, wenn man nen timeout hat ^^ als müsste man ggf die index.php nochmal anpassen (für genau diesen fall):

```
<?php
    session_start();
    session_regenerate_id();

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

    [COLOR="blue"][B]if(isset($_POST['export'])[COLOR="red"] and isset($_SESSION['name'])) {
        include('export.php');
    } else {[/B]        include('html_header.php');

        if (!isset($_SESSION['name'])) {
            if (isset($_POST['btnRegForm']) or $section == "register") {
                include('registrieren.php');
            } else {
                include('login.html');
            }
        } else {
            if (isset($_POST['auswerten']) or $section == "output") {
                include('auswerten.php');
            } elseif (isset($_POST['auswertenadmin']) or $section == "output_admin") {
                include('auswerten2.php');
            } elseif (isset($_POST['export'])) {
                unset($_POST['auswerten']);
                unset($_POST['auswertenadmin']);
                include('export.php');
            } else {
                include('projektzeiterfassung.php');
            }
        }
    
        include('html_footer.php');
    [B][COLOR="blue"]}[/B]
```
hier das rote noch anfügen. dann sollte er die export nur in eingeloggtem zustand "betreten".




boss3D schrieb:


> Und dann hätte wir noch "03. Mai" statt bspw. 3.5 h ... tja, K. A. Vermutlich macht Excel selbst das?!


genau meine vermutung (der erkennt 3.5 eben als den dritten fünften -> autoumwandlung zu nem datum. daher auch mein verunglückter edit zur beachtung  das rot markierte (also äh im post über deinem, 2 vor dem hier ^^). probier das mal bitte. dann steht da nämlich nich mehr 3.5 sondern 3,5.


----------



## boss3D (30. Juli 2014)

^^ Deine Änderung + das hier funktioniert: 
	
	



```
header("Content-Disposition: attachment; filename='".$_SESSION['name']."'.xls");
```
Zum anderen, siehe mein EDIT im Vorposting.


----------



## DarkMo (30. Juli 2014)

du kanst ja versuchen, die änderungen hier (vergessenes td[i+3] = '' in die auswerten .php zu übertragen, damit könnte eventuell auch da nen fehler weniger sein. oder das mit dem salt ^^ für jeden user in der db-tabelle noch die salt spalte erstellt in die du den individuellen salt speichern kannst und ab dafür. wie das mit dem zufallsgenerieren geht... am besten mal googlen ^^


----------



## BenRo (30. Juli 2014)

Wenn du dich fragst, was du bis 16 Uhr machen kannst: Testen, testen, testen!

Zum Beispiel:
- Was passiert, wenn man sich vertippt? (Zum Beispiel einen Buchstaben zwischen die Zeiten haut)
- Läuft es auch, wenn mehrere Leute gleichzeitig dran arbeiten (zugegeben nicht ganz einfach zu testen)?
- Sind alle Exporte und Ausgaben absolut korrekt? Keine verrutschten Zeilen oder so?
- Funktionieren ALLE Buttons, das heißt auch ggf. vorhandene Zurück-Buttons?
- Wie sieht es mit Rechtschreibfehlern in Texten (Fehlermeldungen, Buttonbeschriftungen, Tabellenüberschriften) aus? Dem Programm sind die zwar wurscht, aber sie werfen ggf. ein schlechtes Licht auf dich
- Läuft es auch in unterschiedlichen Browsern gut? Ist vielleicht momentan nicht relevant, weil alle in der Firma den gleichen nehmen, aber was wenn in ein paar Monaten beschlossen wird "Wir wechseln alle Systeme aus obskurem Grund zu Browser X"?
- Ebenfalls eine Überlegung: Frage einen Kollegen von dir mit schwacher Sehkraft, ob Schriftgrößen usw. für ihn in Ordnung sind


----------



## boss3D (30. Juli 2014)

^^ Jup. Habe bereits einige falsche $titel gefunden. Oder vielleicht hatte DarkMo es so auch einfach "schöner" gefunden, aber ich hab's jetzt so angepasst, wie ich es "logisch" finde.

Ich schaue noch weiter ...

BTW: Nur mal so aus Interesse, weil ich mich schon seit Wochen frage ...
Ist es irgendwie "gefährlich", "variablensparend" zu sagen:
	
	



```
$row = mysqli_fetch_object(mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'"));
```
Bzw. funktioniert sowas überhaupt?
Was ich auch ein paar mal gemacht habe:
	
	



```
if (mysqli_query())
```
^^ "Böse"?


----------



## DarkMo (30. Juli 2014)

rein theoretisch sollte nichts dagegen sprechen. is nur doof, wenn du die ergebnisse der einzelschritte mehrfach benötigst ^^ zudem erhöhen (ordentliche) variablen(namen) durchaus die lesbarkeit/verständlichkeit des codes.


----------



## TessaKavanagh (30. Juli 2014)

```
$row = mysqli_fetch_object(mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'"));
```

Vom Prinzip funktioniert das schon, es ist aber m.E. einfach unübersichtlich. Die meisten Leute fangen irgendwann an Ihren Code nach einem bestimmten Schema aufzubauen. Ich verwende z.B. bei den Datenbankabfragen grundsätzlich PDO mit prepared Statements.

Das hat dann zur Folge das du ein und dieselbe "Abfrage" immer wieder verwerten kannst. Denn du sagst nur noch "Setze bitte Variable xy anstelle des Platzhalters ein". Du hast also ein "Grundgerüst" das du nur noch mit neuen Daten füttern musst.

Irgendwann schreibst du also keinen "neuen" Code mehr sondern kopierst nur jede menge bereits vorhandene Codestücke und sagst Ihm "nutze bitte variable xy"


----------



## BenRo (30. Juli 2014)

Prepared Statements sind toll. Wiederverwendbar, schneller und vor allem sicherer, da automatisch escaped wird. Kannst dich beim nächsten Projekt ja da mal einlesen.

EDIT: Und das hier 

```
$row = mysqli_fetch_object(mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'"));
```

ist keine gute Idee. Denn mysqli_query gibt im Fehlerfall false zurück. Das führt dann zu einer Fehlermeldung bei mysqli_fetch_object


----------



## DarkMo (30. Juli 2014)

wie darf man sich das eigentlich vorstellen? mal ganz naiv gesagt sowas hier:

```
function sql($select, $from, $where) {
  return mysqli_query($mysqli, "SELECT ".$select." FROM ".$from." WHERE ".$where."';");
}
sql("*", "user", "name='".$var."'");
sql("id", "zeiten", "datum='".$time."'");
```

wie gesagt, als naive sehr grobe lösung ^^ weil an sowas hatte ich auch schon öfter mal gearbietet (in klassenform dann), allerdings bekam ich keine gescheite abstraktion/verallgemeinerung hin, da sich sql befehle halt doch sehr individuell bauen lassen ^^


----------



## BenRo (30. Juli 2014)

Ich würde mir sowas nicht selbst bauen. Sondern PDO und Prepared Statements verwenden.

EDIT: Kann beispielsweise so aussehen:


```
<?php
// Läd einen Benutzer mit einer bestimmten E-Mail-Adresse aus der Datenbank und zeigt seinen Namen an.

class User {
   /**
    * User-ID
    * @var integer
    */
   private $id;

   /**
    * E-Mail
    * @var string
    */
   private $email;

   /**
    * Benutzername
    * @var string
    */
   private $name;

   /**
    * Liefert ein User-Objekt anhand der E-Mail-Adresse zurück
    * @param PDO $database Datenbankverbindung
    * @param string $email E-Mail-Adresse
    * @return User
    */
   public static function getByEmail(PDO $database, $email) {
      $statement = $db->prepare('SELECT `user` WHERE `email`=:email');
      $statement->bindValue(':email',$email,PDO::PARAM_STR);
      if($statement->execute()) {
         return $statement->fetchObject();
      }
      throw new Exception('Benutzer konnte nicht aus der Datenbank gelesen werden.');
   }

   /**
    * @param string $key
    */
   public function __get($key) {
      switch($key) {
         case 'email':
         case 'id':
         case 'name':
            return $this->$key;
      }
   }
}

function logError(Exception $exception) {
   $error = 'Ein Fehler ist aufgetreten: '.$exception->getMessage().' in Zeile '.$exception->getLine().' in Datei '.$exception->getFile();
   print($error);
}

try {
   $database = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'testuser', 'testpasswort');
} catch(PDOException $exception) {
   logError($exception);
}

try {
   $myUser = User::getByEmail($database, 'franz@example.example');
} catch(Exception $exception) {
   logError($exception);
}

require_once('html_header.php');
print('<p>Der Name des Benutzers mit der gewählten E-Mail-Adresse lautet: ');
print(htmlspecialchars($myUser->name, ENT_HTML5));
print('</p>');
require_once('html_footer.php');
```

Um den Query selbst, also in meinem Beispiel das 'SELECT `user` WHERE `email`=:email' zu bauen, würde ich keine Abstraktion vornehmen, außer man schreibt Code der auf verschiedenen DBMS laufen muss.


----------



## DarkMo (30. Juli 2014)

im produktiven einsatz eventuell, joa. aber ich hab immer ein ganz großes problem: ich will alles mal selber gemacht haben  siehe mein ogl engine projekt ^^ jeder sagt immer "nimm doch ne fertig engine", aber das is doch öde hoch 3. klar, damit bekommt man schneller bessere ergebnisse, aber das bringt mir ja nix >< ich will wissen, wie das geht und es selber mal machen 

aber gut, wir werden ot.


----------



## TessaKavanagh (30. Juli 2014)

Als kleines Abstraktes Code Beispiel:


```
$value = "name";
$sql = "user";
$key = "id";
$key_2 = "password"; 

$query = $db->prepare('SELECT ´$value´ FROM ´$sql´ WHERE ´$key´ = ? AND ´$key_2´ = ?');
$array = array($id, $password);
$query->execute($array);
```

Das wäre ein Beispiel für Key Binding.


----------



## DarkMo (30. Juli 2014)

asö, der baut also aus dem where gedöhnse ein array und setzt da dann die werte ein... aber das is ja nich sehr weit entfernt von meiner naiven lösung ^^ und wenn ich mir das hier: PHP: MySQL (PDO) - Manual so ansehe... schön is was anderes. total unleserlich :/


----------



## BenRo (30. Juli 2014)

Ich hab mal in meinem Beitrag drei drüber ein Beispiel geschrieben. Ich finde es ist ganz hübsch geworden. 

Wenn du es auf Teufel komm raus selber machen willst, lies bitte im Handbuch unter mysqli_real_escape_string() nach, damit du dir keine Sicherheitslücke schaffst.


----------



## DarkMo (30. Juli 2014)

aha, also wenn ichs richtig verstehe, dann ist PHP: addslashes - Manual recht rudimentär und geht nicht explizit (wenn dann eher zufällig ^^) auf die "bedürfnisse" der db ein? daher sollte man lieber eine db-speziefische escape-funktion nutzen. im größten notfall kann man aber sicher auch händisch mit str_replace "was eigenes bauen" *duck* also ich mein jetzt, wenn es irgendwas ganz krudes ist, wo es nix vorgefertigtes gibt ^^

aha, und PHP: mysqli::real_escape_string - Manual berücksichtigt wohl auch noch den charset der verbindung - oha oha. gut zu wissen


----------



## TessaKavanagh (30. Juli 2014)

Jaja Wir alle Lieben XSS. 
Ein einfaches Beisppiel wäre in einem Beschreibungsfeld deines Scripts einfach den folgenden Code einzutippen. Dieser wird dann in der Datenbank gespeichert und bei der Ausgabe in die Website eingebaut. Als Resultat wird dann bei Auswerten.php Das JavaScript ausgeführt.


```
";echo"<script type='text/javascript'>alert('Hallo Welt!');</script>";echo"
```

Viel bösartiger wäre da aber noch das Anlegen eines neuen Users mit root Zugriff für die Datenbank per mysqli


----------



## DarkMo (30. Juli 2014)

joa, und dagegen hatte ich immer addspecialchars und äh irgendwas mit html genutzt ^^ (das machte glaube aus den tags dieses > und < zeugs, weiß grad nich mehr genau).


----------



## BenRo (30. Juli 2014)

htmlspecialchars


----------



## DarkMo (30. Juli 2014)

achja genau, addslashes und htmlspecialchars - sorum wars  und oben schrieb ichs ja quasi noch xD


----------



## TessaKavanagh (30. Juli 2014)

<script type="text/javascript">


Das wäre das gleiche JavaScipt in ASCII geschrieben und das wird dann von htmlspecialchars nicht erfasst.

Im Ergebnis wird das Javascript dann auch wieder ausgeführt und du hast genau das gleiche Problem wie ohne htmlspecialchars.


----------



## BenRo (30. Juli 2014)

Das wird durchaus erfasst. Kannst es ja mal ausprobieren.

Die & werden von htmlspecialchars zu & umgewandelt, wodurch keine Gefahr mehr besteht.


----------



## TessaKavanagh (30. Juli 2014)

htmlspecialchars alleine macht m.E. eine Website jedenfalls nicht sicher. Ich muss nochmal schauen wo es stand, aber ich meine in Erinnerung zu haben, das es auf jeden fall auch dann noch genug Angriffsvektoren gibt.


----------



## BenRo (30. Juli 2014)

Natürlich gibt es weitere Angriffsvektoren. Aber diese eine spezifische Sicherheitslücke kann man so schließen.

Mein Lieblingsangriff (funktioniert bei erstaunlich vielen Forensoftwares) ist, ein "Bild" einzubetten, das in Wirklichkeit ein Link ist.

EDIT: Netter Link zum Thema
http://piratesecurity.de/vektoren/


----------



## boss3D (1. August 2014)

Ihr könnt den Thread gerne weiterhin für themenverwandte Diskussionen nutzen, ich lese immer noch interessiert mit. 

Auch wenn ich nach wie vor glaube, mit dem Thema in meiner beruflichen Zukunft nicht mehr in Berührung zu kommen, so hat es dennoch mein Interesse geweckt und ich möchte mir daher doch noch ein Buch kaufen um mich a) vertiefen und b) noch ein bisschen am Projekt (jetzt ohne Zeitdruck) weiterbasteln zu können. Habt ihr irgendwelche Vorschläge? Ich wäre jetzt erstmal auf das hier gekommen, aber ich bin mir nicht ganz sicher, ob das nicht "zu tief" ansetzt?! Ich bin zwar alles andere als erfahren mit php und mysql, aber Programmiergrundlagen von 0 weg brauche ich dann auch nicht. Schwer einzuschätzen. Andere Bücher wirken wieder eher wie für Fortgeschrittene ...

BTW: Jetzt dann am WE möchte ich auch den Code kommentieren. Ich werd's dann posten, damit mir bitte dann nochmal wer kurz drüberschaut.


----------



## BenRo (1. August 2014)

Och, ich glaube wir haben den Thread lange genug für andere Themen missbraucht, man könnte ja auch einfach neue Threads erstellen... 

Das Buch kenne ich nicht. Ohne das konkrete Buch zu kennen, habe ich festgestellt, dass der SQL-Teil von solchen PHP-und-MySQL-Büchern von den Autoren oft seeeehr stiefmütterlich behandelt wird (vermutlich nicht mal, weil die Autoren keine Ahnung von SQL hätten, sondern eher, weil der Platz in so einem Buch halt irgendwann ausgeht). Ich würde dir also empfehlen dir ein zusätzliches Buch zu SQL zu kaufen. Es ist oft sinnvoll möglichst viel in der Datenbank zu machen (join, Subqueries, trigger, usw. usf.), da schneller (sofern mit sinnvollen Indizes gearbeitet wird).

Was ich in zwei Amazon-Rezensionen gelesen habe: Scheinbar enthält das Buch keine Informationen über die Neuerungen in PHP 5.5, 5.4 und 5.3. Das ist zwar jetzt nicht "schlimm" (einerseits wirst du diese als Anfänger nicht sofort brauchen, andererseits ist es nicht soo viel Neues und man kann das online ganz gut nachschlagen), aber ich würde ein Buch, das "PHP 5.5 ..." heißt und nur auf dem Stand von PHP 5.2 ist aus Prinzip boykottieren. 

Code kommentieren ist immer ne gute Idee. Als Format haben sich die "DocBlocks" von PHPDOC bewährt: phpDocumentor
Wenn du in dem Format kommentierst, kannst du als Mensch deine Kommentare lesen, aber auch viele gute IDEs und PHP-Editoren können dir dann automatisch Zusatzinformationen zu deinem Code anzeigen und wenn du möchtest kannst du auch die PHPDOC-Software selbst verwenden.


----------



## TessaKavanagh (1. August 2014)

So es juckt mich ja nach Abschluss des Projektes schon in den Fingern das ganze mal nachzubauen. Ich muss mich jetzt nur noch dazu motivieren das auch wirklich mal Anzufangen.

Vielleicht kann ich ja das ein oder andere Modul tatsächlich mal gebrauchen x-D. Man kann eigentlich nie genug Code auf Lager haben


----------



## boss3D (4. August 2014)

Beim Kommentieren hat's erfreulicherweise ziemlich wenig gegeben, das ich nicht verstanden habe. Das wäre folgendes:

1) Hier sehe ich natürlich auf der Website, was dieser Code macht, aber so wirklich erklären könnte ich die if-Zeile (nur diese, die echos sind klar) nicht. "<>" habe ich noch nie in irgendeiner Programmiersprache gesehen und wundere mich, dass das überhaupt funktioniert. Aber scheinbar heißt das semantisch "dazwischen"?! Irgendwie fehlt mir dann für meine Logik eine Variable, sodass ich sagen könnte, "Wenn Variable_x zwischen Jahr:Timestamp und Jahr:Timestamp liegt, dann...".
	
	



```
/**
* ???
*/
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);
}
```
2) Dieses ganze Zeug hier durchblicke ich gar nicht. Zuerst wird $row_collector als array angelegt, aber dann kriegt es als Element $row, das wiederum ein array zu sein scheint, was das erste in meiner Logik schon zu einer zweidimensionalen Matrix machen würde. Dann kriegt $row_collector auch noch einen zweiten Index angehängt ... und am Ende sagt man dem Teil wieder, dass es "nur" ein array sein soll?! 

```
$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'];
        }
```
3) ^^ Und woher kommen die ganzen Indexe wie "tID", "data", "prod", "desc", ... ? In der DB haben wir nichts gleichnamiges. 

4) Und dann wäre noch dieses Teil hier in _formular.php_. Wieso ist es bei manchen Elementen nötig (?), über "row->" zuzugreifen (z. B. bei id und rechte), bei anderen (z. B. username) aber nicht, obwohl die in der DB in der selben Tabelle liegen? Was genau ist überhaupt der Sinn von diesem "$row->"?

```
if ($row->passwort == $password) {
     $_SESSION['name'] = $username;
     $_SESSION['id'] = $row->id;
     $_SESSION['rechte'] = $row->rechte;
     $_SESSION['ip'] = $ipadresse;
     $_SESSION['last_on'] = $now[0];
```


----------



## DarkMo (4. August 2014)

hui, dann mal stück für stück ^^

1) das <> ist im endeffekt nur ne andere schreibweise für !=. auf deutsch: wenn beide verschieden sind  wenn du dir die dokumentation zu date anschaust, dann stellste ja fest, dass date('Y'); die jahreszahl zurückgibt. was ich hier geprüft habe ist schlicht und ergreifend, ob die jahreszahl des wochenanfangs dem des wochenendes entspricht. weil? jahreswechsel  eine woche schert sich nicht um nen glatten jahresabschluss ^^ zum bsp ist 2013 zu 2014 der wochenanfang (wie immer ein montag) der 30.12. gewesen. das wochenende hingegen war der 05.01. - nun gibts 2 einfache möglichkeiten: ich lasse die jahreszahl immer weg, dann stände hier "30.12. - 05.01.", oder ich zeige sie immer an. dann wäre das ein "30.12.2013 - 05.01.2014" .> finde ich schonmal deutlich besser. jedoch hat man eben bei der 2. anzeige das ganze jahr über dann 2mal 2014 stehn. die nächste woche gleich sähe in dem format so aus: "06.01.2014 - 12.01.2014". sicherlich richtig, aber ich finds halt störend. daher hab ich das über diese if-else gelöst gehabt. sind die jahreszahlen verschieden, zeige beide an, ansonsten nur die hintere. so steht mit diesem konstruckt beim jahreswechsel also immernoch "30.12.2013 - 05.01.2014", bei der darauffolgenden woche aber nur noch eine gekürzte fassung: "06.01. - 12.01.2014"

also als fazit: reine optik ^^

2 überspringe ich mal fix, das mach ich am ende...

3) tID und pID sind unsere aliasnamen ausm sql-string  da steht nachm select irgendwo was ala "t.ID AS tID" und "p.ID AS pID". deswegen nutze ich sie ja hauptsächlich, da man in php leider sonst probleme bekommt. beide spalten heißen ID - wie greift man nun auf die gewünschte zu - hatte ich ja schonmal lang und breit erwähnt. data, desc, time... sind schlicht selbstgewählte schlüssel für die arrays.

4) wegen dem sinn von ->... du fragst hier sicherlich per fetch_object ab. das sagts dir doch schon. OBJECT! ^^ was ist ein objekt? eine instanz(-variable) einer klasse. mit -> greifst du nun eben auf die klassen-variablen zu  würdest du fetch_assoc nehmen (was ein assoziatives array erstellt), dann hast du eben ein array und kein objekt, daher ist die zugriffsmethode auch anders. jut, wieso manchmal aus der db und manchmal aus der variable? das is eigentlich völlig bumms. hier isses nu so gelöst, dass NUR das aus der db bezogen wird, was so im code noch nich bekannt ist. die ip adresse wird nie gespeichert und im code ermittelt. der username wird per formular übergeben und in $username gespeichert. genau nach diesem wird in der db gesucht. die db wird dir also nie was anderes als usernamen zurückliefern, wie das was eh in der $username variable steht. wie gesagt -> es is völlig egal welchen wert du nimmst, sind eh die gleichen.


2) sow, jetzt dazu...
grundproblem für uns war doch deine wochenansicht. also prinzipiell ne schöne sache, umsetzungstechnisch aber eben verzwickt. wir speichern die daten ja nicht wochenweise, sondern die zeiten (die einzelnen tage) für sich. und zu allem überfluss noch in 2 verschiedenen tabellen (projektdaten und zeiten getrennt). nun haben wir zu EINEM projekt (eine zeile aus projekte) bis zu 7 daten (7 zeilen aus zeiten) die in EINE tabellenzeile zusammengefasst werden müssen. ich hab hier also einen "zeilen-zusammen-sammler" gebaut. eben einen "row-collector" ^^

unser großer sql-string bewirkt ja nun folgendes: zu jeder zeit, kopiert er vorne dran quasi noch die projektdaten (mal arg bildlich gesprochen, ob vorn oder hinten is bugi). unsere ergebniszeilen sehen also grob runtergerissen so aus:
((projekt-daten #1) (zeit-daten #1))
((projekt-daten #1) (zeit-daten #2))
((projekt-daten #1) (zeit-daten #3))
((projekt-daten #2) (zeit-daten #4))
...

hier haben wir also 3 verschiedene zeitdaten die immer die selben projektdaten "vorn dran" haben. in jedem durchgang von while ($row = mysqli_fetch_assoc($db_erg)) {} haben wir also immer ALLE daten. eigentlich sieht es ja noch nen stück verzwickter aus ^^ weil ein projekt ist ja eine tätigkeit/produkt kombination. also in projekt 1 UND projekt 2 kann die tätigkeit dennoch die selbe sein, nur das produkt ist verschieden. aber dieses verschiedene produkt macht es eben auch zu verschiedenen projekten.

in der letzten zeile siehst du bt den "maximal-ausbau" des mehrdimensionalen arrays. ich kann dir die struktur ja mal versuchen aufzuschlüsseln:

```
row_collector
 |
 |_ (tätigkeiten) // -> per id der tätigkeit (also für jede tätigkeit wird hier ein arrayfeld angelegt. bei 3 tätigkeiten, hat row_collector also 3 elemente.
      |
      |_ 'taet' // -> hier wird der klartext für die tätigkeit gespeichert. also die tätigkeit mit der id 1 heißt im klartext "hochschlafen" :ugly:
      |_ 'data' // -> das wird ein weiteres subarray und hierrein sollen dann die produkte
            |
            |_ (produkte) // -> wieder wie bei tätigkeiten, nur diesmal für alle produkte, die mit dieser tätigkeit in zusammenhang stehen (also nicht stehen können, sondern tatsächlich stehen)
                  |
                  |_ 'prod' // -> wieder der name des produkts als klartext
                  |_ 'desc' // -> die projektbeschreibung (genau hier ist es nämlich das projekt, weil eben produkt UND tätigkeit bekannt sind - beide kombiniert -> projekt. also auch die beschr speichern)
                  |_ 'user' // -> den kerl halt auch speichern, ist glaube der klartext, weil das wäre zum ausgeben gedacht (sofern mans braucht - admin, wenn er die daten mehrerer user abfragt)
                  |_ 'time' // -> und hier nun schlussendlich das letzte subarray für unsere (bis zu 7) zeiten die zu diesem projekt in dieser woche gehören.
                        |
                        |_ (timestamp) = zeit // -> schlussendlich wird die eigentliche zeit mit dem timestamp des tages noch im array abgelegt
```
so erkennt mans wohl am ehesten, was ich da für eine datenstruktur aufgebaut hab ^^

kleine randbemerkung: sollte man mehrere wochen anzeigen wollen, müsste man bei 'time' ansetzen und die struktur hier weiter verfeinern. statt time dann ein week und gespeichert werden dann nicht die einzelnen zeiten, sondern weitere subarrays, die per kw als key gespeichert werden (die kw bekommt man ja easy aus dem timestamp des tages). innerhalb des kw-key-array-elements würde dann wieder das row datum = row zeit kommen. auf 'time' als zwischenkey kann man hier dann getrost verzichten. aber wie gesagt, das ist nur eine randbemerkung für zukünftige ausbau maßnahmen ^^


so, was wird innerhalb der while-schleife nun gemacht? es wird IMMER die zeit gespeichert. und zwar nach $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit']; was für probleme treten da höchstwarscheinlich auf? nuja, index-fehler noch und nöcher  wir müssen also VORHER dafür sorgen, dass die ganzen indexe auch existieren. dazu sind die if's da. wenn der erste schritt garnich existiert, also die tätigkeit noch garnich angelegt ist, dann tu eben dies -> leg die tätigkeit an. wir erinnern uns an mein (projekt) (zeiten) konstrukt da. wobei projekt ja wie gesagt aus tätigkeit und id besteht. es kann also durchaus sein, dass bei einem weiteren durchlauf die selbe tätigkeit kommt, dann wäre dieser erste schritt schon gesetzt und diese erste if würde geskipped werden. ändert sich die tätigkeit aber, wird sie ggf wieder neu angelegt (also ein row_collector[2] angehängt meinetwegen). zeitgleich werden noch die grunddaten gespeichert - hier eben der klartext-name.
in der 2. if wird dann eben auf das produkt geprüft. mehrere zeiten können zum selben produkt der selben tätigkeit gehören. gibts dieses produkt für diese tätigkeit noch nicht, wird es hiermit angelegt und gleichzeitig wieder mit den anderen daten gefüttert. da haben wir dann also ein row_collector[2]['data'][1] (also tätigkeit mit id 2 und produkt mit id 1).

genau JETZT ist sichergestellt, dass die benötigte struktur für den letzten befehl auch wirklich vorhanden ist. row-tID ist vorhanden, data wurde da gleich mit angelegt. row-pID gibts auch und auch hier wurde time gleich mit angelegt. und genau an dieses ...time-(sub)array hängen wir nun unser timestamp = zeit an.


weitere randnotiz: für den ausbau auf mehrere wochen müsste eine 3. if angefügt werden. nach der 2. if erstellt man aus dem aktuellen datum (row[datum]) per date('W', datum); die KW und fragt in besagter 3. if dann einfach ab, ob es ...[week][KW] schon gibt. wenn nicht, wird es angelegt und als weiteres subarray gebastelt. man bedenke: week ersetzt in diesem falle time ^^ die letzte zeile müsste dann nur noch wie folgt abgeändert werden. aus ...[time][timestamp] = zeit; wird dann eben ein ...[week][KW][timestamp] = zeit;

zum abschließenden verständnis: du hast insofern recht, dass es nicht eindimensional ist. tatsächlich hast du am ende ein *zähl* 5-dimensionales array (mit der optionalen week erweiterung sogar 6 ^^).


----------



## boss3D (5. August 2014)

^^ Man lernt nie aus, vielen Dank!

3) Ich wusste nicht, dass das,  was du im SQL String angibst, für den gesamten Code gilt. Ich dachte,  das wäre exklusiv für dieses query. 

2) Ist es also ne Matrix, hm. Alles andere hätte mich auch gewundert.


----------



## boss3D (27. September 2014)

Ich bastle gerade aus Interesse an unserer Website weiter und zwar versuche ich gerade, vorhandene DB-Einträge auswähl- und editierterbar zu machen (wie wir's ja vor ein paar Wochen noch vorgehabt hatten) ...

Jedenfalls hier mein Ansatz (blau = neu von mir hinzugefügter Code):

auswerten.php



Spoiler





```
?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></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>';
    $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"]$pID = mysql_insert_id();
                echo '  <td><input type="checkbox" name="edit" value="$pID"></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>';
	
	echo '<br><input type="submit" value="Zurück zur Eingabe" name="btnOutputCancel">';
	[COLOR="#4169e1"]echo '<input type="submit" name="editieren" value="Editieren"><br><br>';    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```



forumlar.php



Spoiler





```
<?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 == "M.Eggertsberger" || $username == "M. Eggertsberger") {
					$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['editieren'])) { // wenn Editieren-Button gedrückt wurde
    	if (isset($_POST['edit'])) { // wenn checkbox ausgewählt wurde
    		
    	}
    }	
    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')");
				}
			}
        }
	}
```



Meine Idee wäre, in formular.php zu überprüfen, welche Zeilen durch ihre jeweiligen checkboxen ausgewählt wurden, und dann auswerten.php mit eben diesen Zeilen neu aufzubauen, wobei der jeweilige bisherige Datensatz zum Vorbelegen der Zeilenfelder benutzt werden soll. Sofern das alles irgendwie möglich ist.

Das derzeitige Problem auf dem Weg dahin ist, dass ich für die checkboxen eine Unterscheidung bzw. Identifikation brauche, weil ja nicht zwangsläufig alle ausgewählt werden müssen. Dafür will ich jeder checkbox als value die (auto-increment) Projekt-ID aus der DB geben. Nur, ich kriege die ums Verrecken nicht ausgelesen. 

Wie soll ich zu dieser ID (und die ist nach meinem Verständnis auch das absolut einzige in unserem System, das einen Datensatz eindeutig identifiziert) kommen? 
Zuerst dachte ich, die müsste doch im Feld $row_collector drinnenstecken und habe sie da rauszulesen versucht, erfolglos. Meine nächste Idee wäre dann mysqli_insert_id() gewesen, wie's noch im Code zu sehen ist, liefert aber nur 0er ...


----------



## BenRo (27. September 2014)

Das hier geht schonmal nicht:


> echo '  <td><input type="checkbox" name="edit" value="$pID"></td>';



Grund: in Einfachen Anführungszeichen (') kannst du nicht einfach Variablen verwenden, das geht nur in Doppelten. Alternativ mit Concat-Operator (.) arbeiten: 

```
echo '  <td><input type="checkbox" name="edit" value="'.$pID.'"></td>';
```



> Sofern das alles irgendwie möglich ist.


Ist alles möglich.

mysql_insert_id() tut NICHT, was du denkst, dass es täte. Lies nochmal die Dokumentation dazu.

Steckt die Produkt-ID nicht einfach in $prod_id?


----------



## boss3D (27. September 2014)

a) Darf als Schlammpigkeitsfehler eingestuft werden. Hätte ich gewusst, aber eben übersehen.

b) Es geht um die Projekt-ID, nicht die Produkt-ID. Wobei ich mir ja immer noch einbilde, dass die in $row_collector drinnensteckt?! Was hätte denn dort sonst den Feldindex "pID" (im Gegensatz zu "prod_id")? Nur, wie komme ich dazu?


----------



## BenRo (27. September 2014)

b) Hoppla, sorry. Da war ich wirr. Der row_collector ist Teufelswerk. Ein vierdimensionaler Array ist (wenn man nicht Raum-Zeit-Koordinaten erfasst  ) eine verwirrende und nicht-empfehlenswerte Sache. Sinnvoll wäre gewesen, dass mit PDOs und objektorientiert zu machen. Hilft dir momentan natürlich nicht weiter. Für mich ist es heute zu spät, noch sinnvolle Aussagen dazu zu treffen, ich schaus mir morgen mal an.


----------



## boss3D (27. September 2014)

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.


----------



## DarkMo (28. September 2014)

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.


----------



## boss3D (28. September 2014)

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?


----------



## DarkMo (28. September 2014)

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.


----------



## boss3D (28. September 2014)

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?!


----------



## DarkMo (28. September 2014)

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*


----------



## boss3D (28. September 2014)

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.

Wenn ich's richtig verstanden habe, meinst du so:

```
$row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
$row_collector[$row['tID']]['data'][$row['prID']]['proj'] = $row['Projekt'];
```
Aber dann verstehe ich nicht, wieso im "Pfad" die Tätigkeiten-ID VOR der Projekt-ID kommen soll ...


----------



## boss3D (28. September 2014)

Ich weiß nicht, ich glaube nicht, dass das so ^^ klappen soll?! Ich hätte mir das rein logisch eher irgendwie so vorgestellt:
	
	



```
if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            [COLOR="#4169e1"]if (!isset($row_collector[$row['prID']])) {
                $row_collector[$row['prID']] = array();
            }            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="red"]$row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['Projekt']; // weg???            	$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'];
        }
```
Aber dann muss vermutlich wirklich alles umgebastelt werden, damit prID das erste Feldelement im ganzen Konstrukt wird?! _*seufz*_


----------



## DarkMo (28. September 2014)

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.


----------



## boss3D (28. September 2014)

Also, ich habe jetzt erstmal einen Gesamtcode in projektzeiterfassung.php gebastelt, womit wir auswerten.php los wären ...


Spoiler





```
<?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:


Spoiler





```
<?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:

```
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.


----------



## Rho (28. September 2014)

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.


----------



## boss3D (28. September 2014)

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*_


Spoiler





```
<?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>';
    }
```


----------



## Rho (28. September 2014)

boss3D schrieb:


> Ich habe bereits ein 600 Seiten PHP-Buch durch


Und mit "durch" meinst du, du hast es durchgelesen, verstanden und kannst das neue Wissen auch anwenden?



boss3D schrieb:


> und das Problem sind auch nicht mehr irgendwelche Grundlagen


Auch nicht im Bezug auf Datenbanken?



boss3D schrieb:


> Das Problem ist, dass der gesamte Code [..] so extrem verschachtelt ist


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.



boss3D schrieb:


> 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.


----------



## DarkMo (28. September 2014)

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 ^^


----------



## boss3D (28. September 2014)

@ 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:


Spoiler





```
<?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>';
```


----------



## DarkMo (28. September 2014)

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 ^^


----------



## boss3D (28. September 2014)

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.

Beispiel:
Proj-ID | User-ID | Taet-ID | Prod-ID | Timestamp
1 ............ 12 .......... 2 .......... 4 ......... bla
2 ............ 8 ............ 2 .......... 4 ......... blub

^^ 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.


----------



## DarkMo (28. September 2014)

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?


----------



## boss3D (28. September 2014)

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 ...


Spoiler





```
<?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">';
```


----------



## Rho (28. September 2014)

boss3D schrieb:


> Mit der Datenbank habe ich bei diesem Projekt eigentlich nichts mehr direkt zu tun


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.



boss3D schrieb:


> 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.



boss3D schrieb:


> ich glaube, ich hätte mir so leichter getan.


Warum hast du es dann nicht so gemacht?


----------



## boss3D (28. September 2014)

Indirekt über den Website-Code werde ich natürlich noch ein paar Datenbank-Zugriffe programmieren müssen, nur direkt mit phpmyadmin sollte ich bei diesem Projekt nichts mehr zu tun haben. Aber das hast du eh verstanden, nur ist es für jemanden wie dich lustiger, in einer Tour sarkastische Kommentare zu posten, die den Thread nicht im geringsten weiterbringen oder sich tatsächlich mit deren Inhalt befassen. Kein Privatleben, nichts zu tun ... anders kann ich mir sowas nicht erklären ...

Im Übrigen habe ich nirgends behauptet, dass Redundanz gut wäre, sondern lediglich angedeutet, dass ich mir mit teilweise redundanten Tabellen leichter getan hätte, den Code zu schreiben. 

Ich steige wieder darauf um, deine Kommentare zu überlesen, alles andere bringt eh nichts. Zum Streiten ist mir meine Zeit zu schade und Hilfe kannst du eh keine anbieten.


----------



## Rho (28. September 2014)

Ich habe dir bereits einen guten Rat gegeben, du hast ihn nur ignoriert und ziehst es vor so weiterzumachen wie gehabt.


----------



## boss3D (28. September 2014)

@ DarkMo
Das ganze läuft scheinbar total buggy, aber ich kann den Fehler gar nicht mehr wirklich beschreiben, weil immer irgendwie was anderes falsch läuft. Nach einem Rechnerneustart beispielsweise kriege ich jetzt wieder mehr als 5 Datensätze angezeigt und diese haben auch alle die richtigen (Zeit)Daten, allerdings werden immer noch vereinzelt Zeilen weggelassen. Ich sehe aber noch nicht, was die weggelassenen Zeilen gemeinsam haben, sodass man ein Fehlerkriterium nennen könnte. 

Bei einem anderen Test mit 6 gleichen Tätigkeiten und Produkten aber unterschiedlichen Beschreibungen und Zeiten ist wieder alles in eine Zeile gespeichert worden.

Und wenn ich zu KWs schalte, die keine Daten beinhalten, lande ich einfach wieder auf projektzeiterfassung.php, anstatt dass in auswerten.php "Keine Daten vorhanden" angezeigt wird.

^^ Aber das eigentliche Problem ist, wie auch schon vor ein paar Wochen, dass sich die Fehler nie reproduzieren lassen. Manchmal reicht ein Eclipse (damit arbeite ich jetzt) Neustart, dass mal alles geht, dann kommen plötzlich wieder Fehler. Nach einem Rechnerneustart geht's wieder, ne Stunde später wieder nicht mehr ... 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT]
Ein bisschen konnte ich den Fehler noch eingrenzen: Wenn in zwei oder mehr Zeilen Produkt und/oder Tätigkeit das/die selbe ist/sind, wird zwar korrekt für jede Zeile ein Eintrag in der DB erstellt, aber nur eine Zeile ausgegeben.

Alles andere läuft derzeit korrekt. Ich betone "derzeit".


----------



## negert (29. September 2014)

Bravo...du produzierst gerade Vista.

Wirf das Ding weg. Neu anzufangen ist meist viel einfacher, als Code zu verwenden, den man in den Anfängen seiner PHMYQHTMPACHE Karriere geschrieben hat. Denk doch noch ein wenig weiter: Nicht nur das du nicht mehr den Durchblick hat. Kein Anderer hat ihn mehr. Auch nicht wenn eines Tages jemand anderes am Code arbeiten soll und das ist weitaus kostenintensiver. Stell dir vor in vier, fünf Jahren muss jemand nicht nur das ganze System neu schreiben, sondern auch noch deine vermurkste Datenbank irgendwie wieder aufhüpschen. Das geht definitiv richtig ins Geld.

Fang nochmals an oder lass es gleich ganz sein. Jemand der das im Griff hat zaubert dir so ein Ding ruckzuckzackzack aus dem Hut und das kostet weniger als du denkst (bzw. als dich das gebastel kostet (kosten wird)).


----------



## BenRo (29. September 2014)

Ich stimme Rho zu, auch wenn ichs vermutlich in einem anderen Ton formuliert hätte.

Dein jetziger Programmcode ist verwirrend. Verwirrender Programmcode ist schlecht wartbar. Du brauchst für jede Änderung deutlich länger, als du brauchen solltest und Fehler schleichen sich ein. Dein bisheriger Code ist natürlich nicht per se "schlecht", sondern  entspricht eben den Anforderungen: "Mit einer sehr knappen Deadline als  Einsteiger das Projekt umsetzen". Du musst nicht zwangsläufig alles wegwerfen und neu anfangen. Es ist  weniger frustrierend, wenn du deinen Code nach und nach umbaust  (allerdings wird es vermutlich auch länger dauern, als es neu zu schreiben) 

Zum Thema Datenbank:


Leider wird die Datenbank von vielen Lehrbüchern vernachlässigt. Ich empfehle ein eigenes Buch/Webseite zu SQL durchzuarbeiten.
Redundanz in Datenbanken ist zu 90% aller Fälle eine schlechte Sache, da ein Abgleich der redundanten Daten erforderlich wird und man mehr Arbeit mit Triggern, Constraints usw. hat, als man eigentlich haben müsste
Normalisierung von Datenbanken und die verschiedenen Normalformen sind ein wichtiges Thema, um Datenbanken konzeptuell sinnvoll aufzubauen und zu verstehen: Normalisierung von Datenbanken | Normalisierung mit Beispiel
Die Datenbank ist sehr mächtig (kann viel) und sehr effizient (kann schnell). Es ist sinnvoll, möglichst viel in der Datenbank machen zu lassen. "SELECT A, PHP-Code der aus dem selektierten B macht, SELECT B, PHP-Code der B anzeigt" kann in den meisten Fällen in "SELECT A und mache A zu B, PHP-Code der B anzeigt" umgeschrieben werden.
Selbst als Einsteiger gibt es ein paar Sachen, die man einfach draufhaben muss, um SQL sinnvoll nutzen zu können. Als Beispiele nenne ich mal: Verschiedene Datentypen verstehen, Indizes, Subqueries, Verbundoperationen (JOIN), Sortierung und Limitierung, ein paar SQL-Funktionen siehe z. B. hier: SQL Funktionen - Welche SQL Funktionen gibt es?
Ein paar allgemeine Anmerkungen



Copy&Paste ist ein schlechter Lehrmeister
Etwas mit "pID" zu identifizieren ist nicht sinnvoll, da man nicht auf den ersten Blick sieht, was p bedeutet. Projekt? Produkt? Man kann es aus dem Kontext rauslesen, aber damit verschwendet man wertvolle Entwicklungszeit. Das p auszuschreiben dauert nicht viel länger, wenn man einen Editor mit Autovervollständigung verwendet, ist es eh kein Problem; Kurzum: Aussagekräftige Variablennamen verwenden
Ich würde vorschlagen, intern nur eine Sprache zu verwenden, also Englisch. Deine Spaltennamen haben deutsche Namen, deine Variablennamen englische. Das ist insofern verwirrend, als beim Durchlesen des Codes mental zwischen zwei Sprachen umgeschaltet werden muss. Das mag nur Millisekunden dauern, aber man kann sich das ja sparen.
Die Vorteile von PDOs (Sicherheit und Wiederverwertbarkeit durch prepared Statements, konsistente Schnittstelle egal welche Datenbank im Hintergrund arbeitet, objektorientierter Zugriff, ...) habe ich glaube ich schonmal hier in diesem Thread erklärt. Ich lege dir also nochmal nahe, diese zu verwenden
Du sprichst an, dass der Code einen Fehler hat, aber manchmal nach einem Neustart wieder funktioniert - so etwas könnte am Session Management liegen (d. h. es gibt irgendeinen Fehler, der nur auftritt, wenn eine Session wiederverwendet wird, nicht jedoch wenn sie neu generiert wird) oder sonstwie mit dem Thema Cookies zusammen hängen.
Fehler nach jeder kleinen Codeänderung? Evtl. könnten Unit Tests helfen, siehe PHPUnit (auch wenn das ggf. Overkill für dein Projekt ist, lohnt es sich, sich da mal einzulesen)
Objektorientierter Code ist in der Regel leichter wartbar als nicht-objektorientierter. Hier ein Vergleich zwischen nicht-objektorientierem und objektorientiertem Code (die Beispiele sind qualitativ jetzt nicht so prall, aber ich wollte damit jetzt nicht Stunden verbringen; Probleme an den Beispielen selbst habe ich teilweise in den Kommentaren angesprochen) - Wenn du denkst "Der OOP-Code ist ja viel länger", das liegt in dem Fall an meinen Kommentaren, der Code selbst ist ja relativ kurz:


```
<?php
/**
 * Displays meta data (title, ISBN, author) of a book
 * non-OOP-version
 *
 * I won't bore you with the database connection code, outputting the surrounding html-Tags, ...
 */

if(!($result = mysqli_query($database, 'SELECT * FROM `books`')) {
   /* In PHP error handling is done by using Exceptions
    * I'm not going to use them here, because this is the strictly-non-oop-version */

   die('Ein Fehler ist aufgetreten');
}

while($row = mysqli_fetch_array($result)) {
   /* A disadvantage of this code is, that you don't know which rows exist in the database
    * the OOP-Version can solve this problem */

   /* Please note that I didn't escape htmlspecialchars here, you should do that though */
   print($row['title'].' wurde geschrieben von '.$row['author'].' und trägt die ISBN '.$row['isbn'].'<br>');
}
```
OOP-Version:

```
<?php
/**
 * Displays meta data (title, ISBN, author) of a book
 * OOP-version
 *
 * I won't bore you with the database connection code, outputting the surrounding html-Tags, ...
 */

/**
 * Class for a book: As you can see, all fields in the database have a corresponding field in the class
 * making it easier to read the code
 */ 
class Book {
   /**
    * Primary key, auto incrementing
    * @var integer
    */
   public $id;
   
   /**
    * Title of the book
    * @var string
    */
   public $title;

   /**
    * ISBN of the book.
    * (In a good IDE you can hover or click the link below to gather more information)
    * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
    * @var string
    */
    public $isbn;

   /**
    * Author of the book
    * If you read the information about normalized tables, you'll realize, that storing a string with the author's name here
    * is a bad idea. What if you want to list all books of John Doe in the future, but there are in fact several authors with
    * that name? An author id in the database - and an author object here - would probably be wise.
    * @var string
    */
   public $author;

   /* In this example I'm not going to use the getter/setter-pattern (which I usually find useful, google it if you want to) */

   /**
    * Returns author, title and isbn for a book
    * In this example I assume, that there is one common and proper way to display this kind of data
    * hence this function. It's not a very realistic example ;-)
    * @return string
    */
   public function getMetaData() {
      return $this->title.' wurde geschrieben von '.$this->author.' und trägt die ISBN '.$this->isbn;
   }
}

/*
 * This query does not have to be prepared, but doing so might improve extensibility
 * e. g. in case this page should only list books by certain authors
 */
$statement = $database->prepare('SELECT * FROM `books`');

/*
 * Attention: This may throw a PDOException which you might want to handle (catch)
 */
$statement->execute();

while($book = $statement->fetchObject('Book')) {
   print($book->getMetaData().'<br>');
}
```
Stell dir nun vor, beide Codebeispiele seien nur kleine Teile aus einem gigantischen Projekt. Wenn du dir in der objektorientierten Variante überlegst "Wozu war getMetaData() nochmal?", kannst du in einer guten IDE drüber hovern/draufklicken und bekommst eine Erklärung dazu, bzw. kannst zu dem Code springen, wo die Methode definiert wird. Auch die Auto-Vervollständigung ist einfacher, da du, wenn du print($book-> eintippst bereits id, isbn, title und author vorgeschlagen bekommen wirst.


----------



## boss3D (29. September 2014)

Ich hätte mir ja selbst schon ein paar Mal überlegt, das ganze neu anzufangen, aber ich habe zu viel Angst, dass ich dann nicht mal mehr soweit kommen würde, wie wir's jetzt haben ... und für die Firma muss ich aber, wie gesagt, zum jetzigen Stand noch Funktionalität (Filterfunktionen) ergänzen. 
Konkret fürchte ich mich bei einem Neustart am meisten a) vor dem Datenauslesen aus dem jetzigen Datenbankschema, wozu DarkMo ja diesen Wahnsinns-$row_collector zusammengebastelt hat, und b) vor der Ausgabe für KWs. Dieses Zeit-Konstrukt kriege ich alleine vermutlich auch nicht hin. 

Gut, jetzt könnte ich ein anderes DB-Schema aufbauen, aber auch hier wie gesagt: Eines, bei dem ich wüsste, wie ich an die Daten kommen kann, wäre wohl ziemlich redundant?! Ich würde eben wirklich alles in eine Tabellen-Zeile speichern, damit ich dann nicht über so einen $row_collector aus mehreren Tabellen bzw. 5 verschiedenen Richtungen Daten zusammensammeln gehen müsste. Aber Redundanz will ja auch wieder keiner sehen ...

Und bei der Ausgabe wüsste ich auch nicht, wie ich das formschön und sinnvoll umsetzen sollte, wenn ich das KW-System nicht hinkriege. 
Ist halt alles doof, und so lange, wie ich wahrscheinlich brauchen würde, um halbwegs wieder da hin zu kommen, wo wir gerade sind, solange habe ich gar nicht Zeit. Ich sollte ja schon in wenigen Tagen an den Filterfunktionen arbeiten.

Außerdem kommt noch hinzu: Die Firma hat das aktuelle System ja schon im Einsatz. Ich könnte denen nicht einfach in 2 Wochen ein komplett anderes hinknallen. Vor allem in der DB hätten die dann (bei einem anderen Schema) sicher Datenverluste.
Ich muss jetzt irgendwie beim aktuellen System noch die Filterfunktionen hinkriegen. Wenn ich damit vorzeitig fertig werden sollte (was ich aber eher nicht glaube), dann könnte ich mir das alles mal von Grund auf neu überlegen ...


----------



## BenRo (29. September 2014)

Deine Sorgen kann ich natürlich nachvollziehen.

a) Zum (redundanten) Datenbankschema, dem Daten auslesen usw. müsste ich nochmal wiederholen, was ich im letzten Post zu Datenbanken geschrieben habe. Du brauchst einfach mehr Basiswissen zu SQL.

b) Zum Thema Kalenderwochen: PHP hat DateTime, DateInterval, usw. Diese sind leider meiner Meinung nach zwar nicht immer intuitiv, aber dafür gedacht mit Daten (im Sinne plural v. Datum) und Zeiten zu arbeiten. Die Verwendung dieser in Kombination mit einem besseren Datenbankschema und ggf. einem objektorientierten Ansatz ist sicher viel leichter

Datenverlust: Datenverlust kann vermieden werden, wenn du die Daten erstmal sicherst (Backup) und dann etwas ausführst was die Daten vom alten Format ins neue überführt. Dieses "etwas" hängt natürlich stark vom neuen Format ab, ist entweder ein SQL-Query oder ein PHP-Skript, dass du auf deinem eigenen Testserver vorher getestet hast. Wenn es auf deinem Testserver klappt, aber in der Firma scheitert, machst du die Änderungen rückgängig und verwendest das Backup.

Dein Probleme ist allerdings nicht (nur) technischer Art, sondern, dass man dir eine Aufgabe übertragen hat, für die du zu dem Zeitpunkt nicht ausgebildet warst und dir dann noch ein knappes Zeitlimit gesetzt hat. Dummerweise hast du den Fehler gemacht, die Aufgabe auch noch funktionierend zu erfüllen. D. h. jetzt wird das immer wieder passieren, weil das beim ersten Mal so gut geklappt hat, wirst du immer schwierigere Aufgaben bekommen und immer knappere Deadlines, der Code wird dadurch immer verwirrender. Immer weniger Leute werden bereit sein, dir zu helfen, weil der Code so verwirrend ist und du wirst immer gestresster.

Je nachdem, wie deine Vorgesetzten so drauf sind, kannst du entweder folgendes Tun:
- Das Problem ansprechen ("Ich wurde auf eine Aufgabe angesetzt, für die ich nicht ausgebildet worden bin. Ich würde diese Aufgabe gerne weiterhin gut erfüllen und benötige dafür eine (durch die Firma bezahlte) professionelle Schulung in dem Thema, sowie angemessenere Zeitplanung.")
- Burn-Out bekommen 

Edit: Es kann sein, dass du meine Kommentare absolut unhilfreich findest - du willst ja nur dein konkretes Problem lösen - aber ich will mich einfach nicht mehr so tief in einen fremden Code einarbeiten, der so verwirrend aussieht; Selbst wenn ich es täte, gäbe es vielleicht in drei Wochen eine neue Anforderung, die du nicht allein bewältigen kannst, dann schreibst du wieder hier mit bis dahin vermutlich noch verwirrenderem Code ...


----------



## boss3D (29. September 2014)

Ne, das geht so nicht. Ein paar freie Tage und dann noch zwei Wochen Zeit, um das Projekt fertigzustellen. Für einen Neubeginn reicht das m. E. nicht. 
Ich schaue einfach, was ich noch hinkriege ...

[EDIT]
^^ Filterfunktionen und Editierfunktion sind definitiv das letzte, mehr kommt nicht mehr.


----------



## boss3D (29. September 2014)

So, es gibt zur Abwechslung mal was positives zu berichten: Ich hab's geschafft, die ID aus dem db_erg query rauszuholen und in einer dem $row_collector entsprechenden Struktur zu speichern. Die ID direkt in diesen einzufügen habe ich leider nicht geschafft, aber zumindest verstehe ich jetzt so langsam, wie das mit dem Teil läuft. Meine Mini-Version davon macht ja im Prinzip das gleiche.

Hier erstmal der Code ...

auswerten.php


Spoiler





```
<?php
    $db_erg = mysqli_query($mysqli, "SELECT 
    									[COLOR="#4169e1"]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>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>
    			[COLOR="#4169e1"]<th>ID</th>            </tr>';
    $row_collector = array();
    [COLOR="#4169e1"]$prID = array();    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
        	[COLOR="#4169e1"]if (!isset($prID[$row['projID']])) {
        		$prID[$row['projID']] = array();
        		$prID[$row['projID']] = $row['prID'];
        	}            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>';
                }
                [COLOR="#4169e1"]echo '	<td>'.$prID[$row["projID"]].'</td>';
                echo '  <td><input type="checkbox" name="check[]" value="'.$prID[$row["projID"]].'"></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" name="btnOutputCancel" value="Zurück zur Eingabe">';
	[COLOR="#4169e1"]echo '<input type="submit" name="delete" value="Löschen"><br><br>';    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```



^^ Wie man schon am Button ganz unten erkennt, versuche ich jetzt erstmal, nur die Löschen-Funktionalität hinzuzufügen.

formular.php:


Spoiler





```
<?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";
        }
    }
	
    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')");
				}
			}
        }
	}
	
	[COLOR="#4169e1"]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]");
			}
		}
    }
```



Schaut soweit auch schon ganz gut aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Nur, wie man sieht, kriege ich halt leider immer nur die ID des ersten DB-Eintrages ins Feld gespeichert, das die Größe der Gesamtzahl aller DB-Projekt-Einträge hat. Und damit eben auch immer die selbe ID ausgegeben. Für den ersten Eintrag stimmt BTW der 4er. Nur danach ginge es eben mit 5, 6, ... weiter.

Und in formular.php funktioniert das Löschen noch nicht, was ich aber gar nicht verstehe, weil im query bei id= ganz korrekt 4 eingesetzt wird, wie ich überprüft habe. Das query ansich dürfte auch keinen Fehler haben. Zumindest der id-4er Eintrag müsste korrekt gelöscht werden können. 

Ich muss jetzt erstmal weg, aber das überlege ich mir heute noch weiter. Jetzt bin ich mal auf einem guten Weg ...

[EDIT]
Ha, mein DELETE funktioniert einwandfrei! Lediglich ein klitzekleiner Syntaxfehler war drinnen: Das Sternchen musste weg. Au, Mann ... 

Jetzt muss ich es nur mehr schaffen, dass er in der Tabelle für jeden Eintrag die richtige ID anzeigt und nicht immer die des ersten Eintrages (lösche ich dann zwar später im finalen Programm eh wieder, aber jetzt während dem Arbeiten wär's ganz praktisch zum Mitschauen). Dann hätte ich das DELETE und könnte gleich beim EDIT weiterbasteln. Geht ja doch.

[EDIT2]
Fürs Editieren von Einträgen versuche ich jetzt erstmal, eine vorbelegte Zeile zu basteln.


Spoiler





```
if (isset($_POST['edit'])) {
    	if (isset($_POST['check'])) {
    		$selected = $_POST['check'];
    		$a = count($selected); // Anzahl der Zeilen
    		
    		$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;
    			}
    		}
    		 
    		$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;
    			}
    		}
    		
    		for ($j = 0; $j < count($selected); $j++) { 			 			
    			$taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id=$selected[$j]");
    			$row_taetid1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
    			$init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id=$row_taetid1");
    			$row_taetid2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
    			echo '<tr><td><select name="taetigkeit'.$a.'">';
    			foreach ($taetigkeiten as $taetigkeit) {
    				echo '<option value="'.$row_taetid1[0].'" selected style="color: #A9F5A9">'.$row_taetid2[0].'</option>';
    			}
    			echo '</select></td>';
    			
    			$prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id=$selected[$j]");
    			$row_prodid1 = mysqli_fetch_row($prod_id); // produkt-id aus projekte
    			$init_prod = mysqli_query($mysqli, "SELECT produkt FROM produkte WHERE id=$row_prodid1");
    			$row_prodid2 = mysqli_fetch_row($init_prod); // produkt aus produkte
    			echo '<td><select name="product'.$a.'">';
    			foreach ($products as $product) {
    				echo '<option value="'.$row_prodid1[0].'" selected style="color: #A9F5A9">'.$row_prodid2[0].'</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'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
    			
    			$hours = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE taetprodid=$selected[$j]");
    			$row_time1 = mysqli_fetch_row($hours); // zeit aus zeiten
    			$date = mysqli_query($mysqli, "SELECT datum FROM zeiten WHERE taetprodid=$selected[$j]");
    			$row_time2 = mysqli_fetch_row($date); // timestamp aus zeiten
    			for ($i = 0; $i < 7; $i++) {
    				//echo $row_time2[$i]; // 1412157600 (timestamp)
    				//echo date("d.m.Y", $row_time2[$i]); // 01.10.214 (MI)
    				//$ts = $wochenanfang + ($i * 60 * 60 * 24);
    				$ts = $row_time2[$i];
    				echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time1[$i].'" maxlength="6" size="4"></td>';
    			}
    						
    			//$update1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit=XX, produkt=YY, beschreibung=ZZ, erstellt=XYZ WHERE id=$selected[$j]");
    		}
    	}
    }
```



Liefter:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Irgendwo habe ich also noch einen Fehler in den Dropdowns, weshalb die leer bleiben. Und dann kommt noch dazu, dass Stunden nicht am richtigen Tag eingetragen werden, obwohl ich den richtigen Timestamp ermittle. Da muss auch im echo irgendwo eine falsche Variable eingetragen sein. Aber das finde ich heute nicht mehr. Vielleicht sieht von euch wer die beiden Fehler, sonst suche ich morgen weiter ...


----------



## boss3D (1. Oktober 2014)

@ Mods
Sorry für DP, aber sind eh Tage dazwischen.

@ DarkMo
Eine Verständnisfrage habe ich: Was genau speichern wir in folgender Zeile?
	
	



```
$row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
```
Zuerst hatte ich angenommen, den Klarnamen des Mitarbeiters. Aber das kann's nicht sein, weil du über die projekte-Tabelle in deinem "Pfad" dahin gehst und wir darin bestenfalls die user-id hätten. Landet die am Ende des geposteten $row_collector-"Pfades"?

Es geht um folgendes: Die Editierfunktion habe ich vorerst auf Eis gelegt, weil ich jetzt genau 2.5 Wochen Zeit habe, die letzten Wünsche der Firma zu erledigen. Und das sind Filterfunktionen. Sollte ich die vorzeitig schaffen, schaue ich mir am Ende noch einmal mein "Editieren" an (das eh nicht sooo weit weg davon ist, zu funktionieren).
Bei den Filterfunktionen (die eh nur der Admin haben soll) ist meine Idee, dem Admin einen weiteren Button "Alle Einträge der Datenbank anzeigen" zu geben, der dann nach Anklicken eben genau das macht. Soweit auch kein Problem für mich, das umzusetzen ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Nur eben die Klarnamen der Mitarbeiter fehlen mir noch vor den jeweiligen Einträgen. So, wie ich das nach meiner Interpretation der genannten $row_collector-Zeile codetechnisch umgesetzt habe (siehe blaue Markierung), müsste ich doch zumindest die jeweilige Mitarbeiter-ID angezeigt kriegen, wenn schon nicht den Klarnamen?! 
Ich denke, das kriege ich selber raus, sobald du obige Zeile erklärt hast bzw. sobald ich weiß, wo im $row_collector ich Name und/oder ID finde ...


Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['auswertenadmin'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $tmp = 0;
        
        $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;");
    } else { // lese gesamten DB-Inhalt aus
        $tmp = 1;
        
        $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 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>';
    if ($tmp = 1) {
        echo '  <th>Mitarbeiter</th>';
    }
    echo '        <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();
            [COLOR=royalblue]$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                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>';

    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">';
```



Und auf der Seite, die den gesamten DB-Inhalt anzeigt, möchte ich dann mehrer Button+input Kombinationen machen, wo man z. B. eine Tätigkeit, oder ein Produkt, oder einen Mitarbeiter eingeben kann, und dann werden alle zugehörigen Einträge angezeigt und die Gesamtstunden für jeden Wochentag sowie die Gesamtstunden überhaupt angezeigt. Sollte nicht allzu schwer in der Umsetzung sein?! Werden wir sehen ...

@ all
Rein optisch sieht das m. E. eher unschön aus mit den vielen unterschiedlich (zu) langen Buttons. Wie würdet ihr euch das als Benutzer der Website wünschen, damit euch das ganze optisch mehr anspricht? Irgendwelche Ideen für eine bessere Umsetzung der Buttons?


----------



## DarkMo (1. Oktober 2014)

schau dir den sql string an, und du bekommst die antwort ^^

```
$db_erg = mysqli_query($mysqli, "SELECT 
                                            t.taetigkeit AS [B]Taetigkeit[/B], 
                                            p.produkt AS [B]Produkt[/B], 
                                            t.id AS [B]tID[/B], 
                                            p.id AS [B]pID[/B], 
                                            pr.beschreibung AS [B]Beschreibung[/B], 
                                            [COLOR="red"]u.name AS [B]User[/B], 
                                            z.zeit AS [B]Zeit[/B], 
                                            z.datum AS [B]Datum[/B] 
                                        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;");
```
habs dir mal rot markiert. dass fett markierte sind die keys für row - die resultierenden spaltennamen.

wieso wird das bei dir nicht angezeigt? weil der wert bestandteil eines inneren arrays ist, für den du noch keinerlei werte (schlüssel) hast - nämlich die produkt-id's. du musst das ding einfach ebbes weiter runter bauen:

```
foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            [COLOR="red"][STRIKE]$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];[/STRIKE]            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                [COLOR="lime"]$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
```
in dem falle ist es gut, dass ich das anfangs so kompliziert gebaut hatte. so macht es nämlich nix aus, dass man erst td[1] speichert und dann erst td[0] ^^ wird dennoch n der richtigen reihenfolge angezeigt.


----------



## boss3D (1. Oktober 2014)

Hm, von der Logik verstehe ich es, aber ausgegeben kriege ich immer noch nichts bei den MA-Namen ... 
Nochmal schauen ...

Das Feld(element) scheint leer zu sein?!
Mit einer simplen Testzeile kriege ich sofort Ausgaben:
	
	



```
$td[0] = "hallo";//$row_collector[$row['tID']]['data'][$row['pID']]['user'];
```
[EDIT]
So muss die Zeile lauten:
	
	



```
$td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
```
^^ Dann kriege ich zumindest schon mal "test" ausgegeben, allerdings leider für alle Einträge, nicht nur seine eigenen.


----------



## DarkMo (1. Oktober 2014)

aso, ja. is ja klar ^^
$td[0] = $row_collector[$row['tID']]['data'][$row['pID']]['user'];
$td[0] = $row_collector[*$taet_id*]['data'][*$prod_id*]['user'];


----------



## boss3D (1. Oktober 2014)

^^ Bin schon selber draufgekommen. 

Das einzige Problem: Er zeigt für alle Einträge den Mitarbeiter "test" an, auch für die von anderen Mitarbeitern.


----------



## DarkMo (1. Oktober 2014)

die von anderen MA's kann er doch garnich anzeigen ^^

```
WHERE 
                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' [COLOR="blue"]AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
```
hier wird alles rausgefiltert, was nicht der aktuell eingeloggte user ist. ohne das werden schlicht alle zeiten ausgegeben. für einen personenfilter müsstest du genau hier dann irgendwie ansetzen und mit ner forschleife den sql string erweitern. aber das nur als aussicht für später ^^


----------



## boss3D (1. Oktober 2014)

^^ Ne, ne, daran sollte es nicht scheitern! Die querys habe ich mir schon für mein Vorhaben angepasst:



Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['auswertenadmin'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $tmp = 0;    
        $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;");
    } else { // lese gesamten DB-Inhalt aus
        $tmp = 1;    
        $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 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>';
    if ($tmp = 1) {
        echo '  <th>Mitarbeiter</th>';
    }
    echo '        <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[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                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>';
    
    include(dropdowns.php);

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    echo '<br><input type="submit" name="filterTaet" value="Tätigkeit >"> <input name="taetigkeitdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterProd" value="Produkt >"> <input name="produktdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```



Nach meinem Verständnis müsste der sich durch das zweite query ALLE Mitarbeiter in den $row_collector holen?!

Sieht dann (rein von der Idee her) BTW so aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Die 3 Buttons vor den Eingabefeldern sollen dann die Filterfunktionen werden, sobald darüber die gesamte DB korrekt ausgegeben werden kann. Und da scheitert es ATM eben nur noch an den Mitarbeiter-Namen.

[EDIT]
Ich glaube, ich komme dem Fehler schon auf die Spur: Der kommt gar nie ins else, sodass er das zweite query ausführen würde?!

Das müsste korrekterweise wohl so aussehen:
	
	



```
} elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus
```
Der Button in projektzeiterfassung.php heißt ja "auswertenall". Nur, jetzt kommt er beim Anklicken erstmal gar nicht mehr zu auswerten2.php. Irgendwo muss noch ein kleiner Fehler drinnenstecken.

[EDIT2]
In index.php hat's auch noch gefehlt:
	
	



```
} elseif (isset($_POST['auswertenall']) or $section == "output_admin") {
                include('auswerten2.php');
```
Aber ich kriege immer noch nur "test" angezeigt. 
Obwohl er doch jetzt das zweite query ausführen und alle Mitarbeiter auslesen müsste ... ???


----------



## DarkMo (1. Oktober 2014)

if (isset($_POST['auswertenadmin'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)

das verwirrt mich irgendwie ^^ auswertenadmin lässt für mich darauf schließen, dass diesen button der admin gedrückt hat - welcher eigentlich keine beschränkungen hat. aber hier wird wieder u.name = $user gesagt (also gefiltert) und auch oben im kommentar stehts so. und auch das in klammern verwirrt. was hat u.id mit der filterung zu tun? ^^ u.id = z.userid gleicht nur tabellen u und z miteinander ab, dass eben DER username aus der usertabelle gezogen wird, der laut id in der zeitentabelle vermerkt ist.


----------



## boss3D (1. Oktober 2014)

Ja, so ist ja auch der Sinn davon. Bei _auswertenadmin_ soll ja auch gefiltert werden ...

Hier nochmal etwas anders dargestellt:



Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    [COLOR=orange]if (isset($_POST['auswertenadmin']) or isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    } [COLOR=darkorchid]elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $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 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>';
    echo '      <th>Mitarbeiter</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>';
    $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[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                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>';
    
    include(dropdowns.php);

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    echo '<br><input type="submit" name="filterTaet" value="Tätigkeit >"> <input name="taetigkeitdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterProd" value="Produkt >"> <input name="produktdb" type="text" size="30" maxlength="30"><br><br>';
    [COLOR=orange]echo '<input type="submit" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```



In Orange alles, das nur DB-Einträge für einen bestimmten vom Admin eingegebenen Mitarbeiter ausliest und anzeigt. In Violett alles, das den gesamten DB-Inhalt (also alle Einträge aller Mitarbeiter) anzeigen soll:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Was jetzt zugegeben noch verwirrend ist, ist, dass ich derzeit noch 2 Buttons habe, die das gleiche machen: Zum einen in projektzeiterfassung.php "für folgenden Mitarbeiter anzeigen >" (orange) und in auswerten2.php dann die Filterfunktion "Mitarbeiter >" (auch orange). Ersteres soll möglichst bald rausfliegen. Gefiltert werden soll dann nur noch in auswerten2.php können. 

Der einzige Fehler den ich derzeit habe, ist eben, dass mir bei "alle" (violett) zwar alle DB-Einträge angezeigt werden, aber jedem Eintrag der Mitarbeiter "test" zugeteilt wird, was aber bei meinen 3 nur für 1 Eintrag stimmen würde. Wo bleibt der andere Mitarbeiter???

[EDIT]
Hier noch projektzeiterfassung.php in finaler Version, damit du's dir noch leichter vorstellen kannst:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Jetzt kann wirklich nur noch in auswerten2.php nach einzelnen Mitarbeitern gefiltert werden, und das funktioniert auch einwandfrei! Wenn ich dort nach anderen MAs als "test" filtern lasse, werden auch korrekterweise deren Namen angezeigt. Lediglich in der Gesamt-Tabelle steht bei allen Einträgen "test".

[EDIT2]
Ich glaube übrigens, dass das das selbe Problem ist, wie bei meiner Einträge-ID. Für alle Einträge wird immer der erste MA aus der DB (Tabelle _user_) angezeigt, ergo "test". Für alle Einträge wird immer die erste ID (Tabelle _projekte_) aus der DB angezeigt. Für mich sieht das ganz klar danach aus, dass ich in beiden Fällen mit Arrays arbeite, diese aber unabsichtlich nicht durchlaufe sondern am ersten Feldelement hängen bleibe?!




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Aber wenn ich's bloß finden würde:



Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."'");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    } elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $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 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>';
    echo '      <th>Mitarbeiter</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>';
    echo '        <th>ID</th>';
    echo '    </tr>';
    [COLOR=seagreen]$row_collector = array();    [COLOR=royalblue]$prID = array();    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            [COLOR=royalblue]if (!isset($prID[$row['projID']])) {
                $prID[$row['projID']] = array();
                $prID[$row['projID']] = $row['prID'];
            }            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=seagreen]$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[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                [COLOR=seagreen]$td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
               [COLOR=seagreen] for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }                [COLOR=royalblue]echo '    <td>'.$prID[$row["projID"]].'</td>';                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="11" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    echo '<br><input type="submit" name="filterTaet" value="Tätigkeit >"> <input name="taetigkeitdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterProd" value="Produkt >"> <input name="produktdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```


----------



## DarkMo (1. Oktober 2014)

ich fang mal unten an, weil ich da schon was enddeckt hatte.

```
if (!isset($prID[$row['projID']])) {
                $prID[$row['projID']] = array();
                $prID[$row['projID']] = $row['prID'];
            }
```
schau dir mal die keys an ^^ meist schreibste projID und am ende prID - dat kann ja so nix werden. und wie gesagt, bau es doch im collector mit ein:

```
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'];
                [COLOR="blue"]$row_collector[$row['tID']]['data'][$row['pID']]['prID'] = $row['prID'];                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
```
bringt uns allerdings noch nix, da wir die id garnich auslesen, müssten also noch die sql-anfrage abändern:

```
$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, 
                                            [COLOR="blue"]pr.ID AS prID, 
                                            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;");
```
musst halt drauf achten, dass der aliasname (das hinter AS) der selbe ist, den du als key für row benutzt.

wegen dem immer gleichen wert am anfang... probier mal folgendes (zum debuggen): lass dir mal var_dump(wert); ausgeben. als wert kannste beim erstellen des row-collectors die $row variable hernehmen und am ende dann den fertigen $row_collector. schau einfach mal, was da bei raus kommt. wenn da schon murks drin steht, müssen wir mal guggn...


----------



## boss3D (1. Oktober 2014)

Schau mal in deinem dritten Code in Zeile 2, direkt unter SELECT ... 
Das ist doch das, was du dann noch einam eingefügt und blau markiert hast?!

Ansonsten hätte ich vorhin auch schon probiert, das ID-Zeug direkt in den $row_collector einzubauen:



Spoiler





```
$row_collector = array();
    //$prID = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            /*if (!isset($prID[$row['projID']])) {
                $prID[$row['projID']] = array();
                $prID[$row['projID']] = $row['prID'];
            }*/
            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']]['proj'] = $row['prID'];
                $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[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                //echo '    <td>'.$prID[$row["projID"]].'</td>';
                echo '  </tr>';
            }
        }
    }
```



Hat allerdings nur dazu geführt, dass jetzt a) bei zweistelligen IDs immer nur der Einer-Wert ausgegeben wird. Also für ID=18 kriege ich 8 ausgegeben, für ID=16 eben 6. Und jede zweite ID, egal ob ein-oder zweistellig, wird ausgelassen:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Jetzt probiere ich es noch mit deinen Bezeichnungen ...

[EDIT]
Ich glaube, ich spinne! Ich sehe gerade, dass ich eh alle IDs völlig richtig kriege ... nur werden die bei MO eingetragen! 
Der 8er und der 6er sind Stundendaten vom SO, die sich eine Spalte zu viel verschoben haben.

Na, dann muss ich mir nochmal die $td Indexe vornehmen ...


----------



## DarkMo (1. Oktober 2014)

asö, ja du hast natürlich bei td ne "falsche" reihenfolge angegeben (falsch im sinne deiner kopfzeile - die dortige reihenfolge). der index von $td ist szs der zellen-index in der tabelle. wölltest du die id also am ende ausgeben, müsstest du bei den stunden ausgaben td[i+4] schreiben und dann in td[11] die prID hauen.


----------



## boss3D (2. Oktober 2014)

^^ Stimmt. Hätten wir bei den Tagen $td[4+$i] statt $td[$i+4] geschrieben, hätte ich es schneller gesehen, aber macht eh das gleiche. 

Allerdings hat uns das bei den Namen noch nichts genutzt. Da kriege ich immer noch nur "test" für alle Einträge ...

Vielleicht liegt's irgendwie am query?! Im $row_collector und den Schleifen sehe ich keinen Fehler, jedenfalls nichts, das anders wäre als bei allen anderen Daten, die korrekt angezeigt werden.

```
} elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $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 pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");
    }
```
^^ Also in meiner Logik darf im WHERE kein bestimmter User angegeben werden, wenn ich den gesamten DB-Inhalt haben will. Dann müsste er sich doch die Einträge von allen holen, also auch alle Namen?!


----------



## DarkMo (2. Oktober 2014)

also das u.name=user muss raus, das u.id=z.id geblubber muss bleiben (das fehlt hier glaube). wie gesagt, ein var_dump der einzelnen $row's würde mich erstmal interessieren.

```
$row_collector = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            [COLOR="blue"]echo var_dump($row).'<br>';            if (!isset($row_collector[$row['tID']])) {
                ...
```
und dann mal posten, was der spricht.

ach: ALLE db daten wird er immernoch nich auslesen, nur die der woche ^^ für alle müsste auch das mit wochenanfang/ende rausfliegen. wenn man aber mal irgendwann 1000e datensätze hat... unkuhl. also irgendwie limitiert sein sollte es schon.


----------



## boss3D (2. Oktober 2014)

Hier erstmal der Code im gesamten (auswerten.php). Nicht schrecken wegen den großen queries oben, die habe ich bereits für alle Filter ergänzt (auch wenn sie noch nicht wirklich funktionieren):


Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['taetigkeitdb'])) {
        $taet = $_POST['taetigkeitdb'];
        $ergebnis = mysql_query($mysqli, "SELECT id FROM taetigkeiten WHERE taetigkeit = '".$taet."';");
        $row = mysqli_fetch_object($ergebnis);
        $taetid = $row->id;
    }
    
    if (isset($_POST['produktdb'])) {
        $prod = $_POST['produktdb'];
        $ergebnis = mysql_query($mysqli, "SELECT id FROM produkte WHERE produkt = '".$prod."';");
        $row = mysqli_fetch_object($ergebnis);
        $prodid = $row->id;
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.ID
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $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 p.id = '".$prodid."' AND pr.produkt = '".$prodid."' AND z.taetprodid = pr.ID
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus
        $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 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>';
    echo '      <th>Mitarbeiter</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>';
    echo '        <th>ID</th>';
    echo '    </tr>';
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            echo var_dump($row).'<br>';
            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']]['proj'] = $row['prID'];
                $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[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                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>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    echo '<br><input type="submit" style="height:24px; width:100px" name="filterTaet" value="Tätigkeit >"> <input name="taetigkeitdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" style="height:24px; width:100px" name="filterProd" value="Produkt >"> <input name="produktdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" style="height:24px; width:100px" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```



Falls du das u.name im WHERE meinst, das ist doch schon die ganze Zeit weg. Ich habe im WHERE nichts mehr, das die Abfrage irgendwie auf einen einzelnen User beschränken würde, weswegen ich ja auch nicht verstehe, warum da immer nur "test" kommt.

var_dump liefert das hier: 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## DarkMo (2. Oktober 2014)

hmm hmm, also im query in diesem row dingens hat er jedesmal den korrekten usernamen. wieso nimmt er den nicht im row_collector auf? du kannst ja mit echo-debugging mal stück für stück "tiefer" in den schleifen wandern und schauen, was er so für werte ausgibt. irgendwo scheint ers ja zu verschlampern. bin erstmal wieder bissl wech ^^


----------



## boss3D (2. Oktober 2014)

Wenn ich folgendes probiere, kriege ich schon nur noch 4x "test" ausgegeben:


Spoiler





```
$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'];
                [COLOR=royalblue]echo  $row_collector[$row['tID']]['data'][$row['pID']]['user'];                $row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
```



Auf den ersten Blick könnte man also meinen, dass andere Mitarbeiter gar nie im $row_collector landen, aber das stimmt ja auch nicht, weil ich sofort den anderen Namen angezeigt kriege, wenn ich in meine dritte Filterfunktion gehe. Die muss sich den Namen doch auch aus dem $row_collector holen?!




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Mit folgendem kriege ich die wohl deutlichste Ausgabe des Problems:
	
	



```
print_r($row_collector[$row['tID']]['data'][$row['pID']]);
```
Hier sieht man's genau, dass für jeden der 4 Einträge der Mitarbeiter "test" im $row_collector gespeichert wird ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



BTW: Mit "alle" hatte ich eh alle Daten für 1 Woche gemeint. Wirklich alles anzeigen wäre alleine optisch schon sinnlos, weil wir ja trotzdem unsere Wochenbegrenzung weiterhin hätten.

[EDIT]
Das hier
	
	



```
print_r($row_collector);
```
 am Ende der while-Schleife liefert genau all das, was wir eh in der Tabelle sehen. Für user immer "test".

Was mich völlig irritiert, ist, dass er es schafft, sich bei meinem query überhaupt immer "test" zu holen. Ich hätte doch sehr vermutet, dass er sich entweder korrekt alle Mitarbeiter holt, oder dass er sich gar keinen holen kann. Aber wieso kriegt er immer "test" her??? Es ist doch im zugehörigen query NICHTS mehr drinnen, das irgendwie zu "test" führen würde ...


----------



## boss3D (2. Oktober 2014)

Ich habe gerade beim Testen was interessantes festgestellt: Wieso liefert folgendes query nur folgendes Ergebnis?

```
$anf = mysqli_query($mysqli, "SELECT * FROM user;");
$us = mysqli_fetch_assoc($anf);
print_r($us);
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Gerade wenn ich ALLES aus der DB-Tabelle auslesen lasse, müsste er doch beide Mitarbeiter erwischen???  

Und wenn ich es so mache, dann kriege ich NUR die zweite Zeile mit Mitarbeiter 2 ausgegeben:
	
	



```
$anf = mysqli_query($mysqli, "SELECT * FROM user;");
$us = mysqli_fetch_assoc($anf);
while ($us = mysqli_fetch_assoc($anf)){
     print_r($us);
}
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## Rho (2. Oktober 2014)

In Zeile zwei holst du das erste Ergebnis deiner Abfrage und weißt es $us zu. Danach, in Zeile drei, beginnst du deine While-Schleife, in der du immer zuerst das nächste Ergebnis der Abfrage $us zuweist und danach ausgibst. Das erste Ergebnis wird also von der While-Schleife überschrieben ohne jemals ausgegeben worden zu sein. Wenn man in der Lage ist zu lesen (http://php.net/manual/en/mysqli-result.fetch-assoc.php) und sich darüber im Klaren ist, wie eine While-Schleife funktioniert sollte das ziemlich offensichtlich sein.

Toll wie du immer wieder demonstrierst, dass es bei dir nicht an den Grundlagen scheitert. Die Bezeichnungen der Variablen finde ich übrigens ganz ausgezeichnet gewählt. So weiß man auf den ersten Blick was gemeint ist. Eventuell hätte aber auch schon $a und $u ausgereicht. Damit könnte man noch etwas mehr Zeit beim Tippen sparen.


----------



## boss3D (2. Oktober 2014)

Der Code-Schnipsel kommt (vorerst) eh nicht in den eigentlichen Programmcode rein, insofern sind die Variablen-Namen in diesem Fall herzlich egal (und mit auch nur einem Hauch Fantasie könnte man sogar drauf kommen, dass "anf" für "anfrage" und "us" für "user steht). 
Es ging nur darum, zu testen, ob überhaupt alle User aus meiner DB ausgelesen werden können. Für den Fall, dass ich den Fehler, warum andere Usernamen außer "test" nicht im $row_collector gespeichert werden, nicht finde, hätte ich vor, eventuell die Usernamen gesondert vom großen query in einem eigenen kleinen zu ermitteln und dann "manuell" an die Tabelle vorne ranzubasteln, also vor den $row_collector. Wäre halt ein ziemlich unschöner workaround, rein codetechnisch, aber was soll ich machen ... besser dann so, als es geht nicht ...

[EDIT]
Hm, das ist wirklich irgendein Speicherproblem im $row_collector. Ich habe mir jetzt eine Mini-Version davon gebastelt, die nur User-Name und -ID aufnehmen sollte, aber schon wieder landet nur "test" und "9" drinnen ...

```
$row_coll = array();
        $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
        while ($row = mysqli_fetch_assoc($user_table)) {
            if (!isset($row_coll[$row['ma']])) {
                $row_coll[$row['ma']] = array();
                $row_coll[$row['ma']]['id'] = $row['id'];
                $row_coll[$row['ma']]['name'] = $row['name'];
            }
        }
        foreach ($row_coll as $ma_id => $ma) {
            $td = array();
            $td[0] = $row_coll[$ma_id]['id'];
            $td[1] = $row_coll[$ma_id]['name'];
            for ($i = 0; $i < count($td); $i++) {
                echo $td[$i].'<br>';
            }
        }
```


----------



## Rho (2. Oktober 2014)

Ach, und den freiwilligen Helfern hier im Forum gut lesbaren Code zu präsentieren ist wohl schon zu viel verlangt. Mal davon abgesehen glänzt dein "eigentlicher" Code auch nicht gerade vor Klarheit. Das arme Schwein, das dein Programm irgendwann mal warten muss, tut mir jetzt schon leid. Bei der Wahl eines geeigneten Bezeichners geht es übrigens nicht darum, ob der Leser mit "Fantasie" erraten kann, was du damit wohl gemeint haben könntest. Und selbst wenn man leicht darauf kommt, was der Variablenname zu bedeuten hat, liest sich der Code einfach deutlich schwerer, wenn haufenweise, noch dazu unübliche Abkürzungen verwendet werden.

Übrigens, gern geschehen. Nichts zu danken. Ich hoffe, dir ist jetzt wenigstens klar, warum dein Code-Schnippsel das macht, was es macht.


----------



## boss3D (2. Oktober 2014)

^^ Im eigentlichen Code achte ich darauf, klare Bezeichner zu verwenden. Im Übrigen muss es sich wirklich um einen "Design-Fehler" im $row_collector handeln (siehe EDIT oben). Ein kleinerer aber schematisch-identer Nachbau liefert den exakt selben Fehler: Es wird nur "test" gespeichert, andere Mitarbeiter gehen nach dem Auslesen durch das query verloren ...

[EDIT]
Hier noch der var_dump-Beweis, dass auch im kleinen query noch alles da ist und die Daten des zweiten MAs erst beim Speichern in den Mini-$row_coll verloren zu gehen scheinen:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## Rho (2. Oktober 2014)

Selbst wenn dem so wäre, ist dein Code alles andere als gut lesbar und übersichtlich. Dass du selbst regelmäßig nicht (mehr) durchblickst ist ja bezeichnend genug.


----------



## boss3D (2. Oktober 2014)

Ich weiß, wo ich was finde. Außer eben bei Fehlern, da suche ich dann schon u. U. ne ganze Weile ...

Bei diesem konkreten hier ist mein Problem, dass der $row_collector sich für sämtliche Tabellen aus der DB korrekt verhält, nur eben für die user-Tabelle nicht. Der exakt gleiche Mechanismus speichert völlig korrekt alle Tätigkeiten, Produkte, Zeiten, ... zu unterschiedlichsten Datensätzen, außer bei Mitarbeitern. Da wird nur der erste in der DB-Tabelle, "test", gespeichert. Tja, da soll mal einer draufkommen, woran das scheitert. Es wird ja zum Speichern von Mitarbeitern absolut nichts anderes gemacht, als zum Speichern von irgendwelchen anderen Daten.


----------



## BenRo (2. Oktober 2014)

$row['ma']  enthält in jeder Iteration das gleiche, dadurch werden natürlich jedes Mal die Werte überschrieben. Du liest ja auch keine Spalte namens ma aus der Datenbank. 

Sollte vermutlich $row['id']  heißen?


----------



## boss3D (2. Oktober 2014)

$row['ma'] war schon absichtlich gewählt und kein Versehen, aber kann natürlich sein, dass es falsch ist. 

BenRo, wenn du die Fehlerursache zu sehen meinst, kannst du dann bitte in wenigen Worten erklären, wieso das ganze nicht gleich mit DarkMo's $row_collector funktioniert? Er hat ziemlich sicher keine falschen Benennungen und trotzdem landet immer wieder nur "test" als einziger MA-Name im collector, während sonst alle möglichen Datensätze korrekt gespeichert werden. 
_(Mein Mini-collector war ja nur als "workaround" gedacht, aber lieber wäre mir, und vor allem auch sinnvoller, den großen collector normal weiterzuverwenden)_

Ich kann's zwar erst morgen in meinem Mini-collector mit 'id' testen, aber ich fürchte fast, dass das das Problem nicht löse wird. Dann müsste es m. E. im großen collector schon die ganze Zeit richtig laufen. 

Immerhin sind mir heute noch ein paar gute Ideen zum Weiterbasteln bei den Filterfunktionen gekommen:
- input-Felder bei Tätigkeit und Produkt durch dropdowns ersetzen (Code dafür haben wir ja schon)
- dann queries für Such-Kombinationen aus User-Tätigkeit-Produkt basteln. Sollte eigentlich nur Anpassungen im WHERE des großen queries erfordern
- ...

^^ Aber als erstes muss eben noch der User-Fehler gefunden und behoben werden.

[EDIT]
BenRo, du hattest recht. So ...
	
	



```
$row_coll = array();
        $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
        while ($row = mysqli_fetch_assoc($user_table)) {
            if (!isset($row_coll[$row['id']])) {
                $row_coll[$row['id']] = array();
                $row_coll[$row['id']]['id'] = $row['id'];
                $row_coll[$row['id']]['name'] = $row['name'];
            }
        }
        foreach ($row_coll as $ma_id => $id) {
            $td = array();
            $td[0] = $row_coll[$ma_id]['id'];
            $td[1] = $row_coll[$ma_id]['name'];
            for ($i = 0; $i < count($td); $i++) {
                echo $td[$i].'<br>';
            }
        }
```
... funktioniert mein Mini-collector jetzt tatsächlich und ich kriege "9", "test" und "11", "M..." reingespeichert (und gegebenenfalls ausgegeben). Aber das macht's jetzt noch kurioser, wieso der exakt gleich aufgebaute große $row_collector das nicht schafft ...

[EDIT2]
Jetzt habe ich es im großen $row_collector noch so probiert:



Spoiler





```
$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']]['user'] = $row['User'];
                $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=seagreen]//$row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];                $row_collector[$row['tID']]['data'][$row['pID']]['proj'] = $row['prID'];
                $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[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                [COLOR=seagreen]//$td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
               [COLOR=seagreen] [COLOR=royalblue]echo test1;
                [COLOR=seagreen]/**************/                $userid = $mysqli_query($mysqli, "SELECT userid FROM projekte WHERE id = '".$td[11]."';");
                $td[0] = $mysqli_query($mysqli, "SELECT name FROM user WHERE id = '".$userid."';");
                [COLOR=seagreen]/**************/                echo test2;                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';             
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
```



^^ Aber da bleibt er gleich nach test1 hängen, danach kriege ich keine Ausgabe mehr. Offenbar kommt er über meine queries nicht drüber?!


----------



## BenRo (3. Oktober 2014)

Bin momentan nur mit Handy unterwegs, da kann ich mirs nicht gut anschauen.


----------



## DarkMo (3. Oktober 2014)

ich glaub, mir kam grad die erleuchtung... wir speichern immer nur das erste vorkommen bla. also immer, wenn irgendwas neu ist, wirds gespeichert, ansonsten nicht. das funzt, um doppelte einträge für produkte usw zu vermeiden, stört aber bei anderen sachen. so richtig sicher bin ich mir grad nich, aber probier mal folgendes:


```
while ($row = mysqli_fetch_assoc($db_erg)) {
            echo var_dump($row).'<br>';
            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']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = array();
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']][time] = $row['Zeit'];
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']][user] = $row['User'];
        }
```
ok, jetzt beim überarbeiten kommts mir klarer vor. die user-id ist bei den zeiten gespeichert (in der db), im row-collector wird sie aber bei den projekt-daten gespeichert. hab sie dort jetzt rausgenommen und die letzte zeile erweitert. dazu musste ich ein weiteres subarray anlegen um beide werte im selben datum unter zubringen. muss man jetzt natürlich die darstellung auch abändern:

```
foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
```

ok (das hier ist unverändert...), ich seh gerade ein weiteres problem: so würden wir alle zeiten - egal von welchem user, in einer zeile sammeln. mit der obigen strucktur können wir daran nich wirklich was ändern. also müssten wir das umbauen... ich schlage folgendes vor:

```
$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, 
                                            [COLOR="sienna"]u.id AS UserID,                                             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 [COLOR="sienna"]// wie auch immer es hier weitergeht - wurst ^^                                            z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");
        // ...

        while ($row = mysqli_fetch_assoc($db_erg)) {
            echo var_dump($row).'<br>';
            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']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            [COLOR="sienna"]if (!isset($row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['User']])) {
                $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['UserID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['UserID']]['name'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['UserID']]['user'] = $row['UserID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['UserID']]['work'] = array();
            }            $row_collector[$row['tID']]['data'][$row['pID']]['time'][COLOR="sienna"][$row['UserID']]['work'][$row['Datum']] = $row['Zeit'];
        }

        // ...
        // ausgehend von folgendem tabellen-kopf-aufbau dingenskirchen... ^^
        // projID (0) | tätigkeit (1) | produkt (2) | beschreibung (3) | subtabelle (4)
        // subtabelle:
        // MA (0) | zeiten (1-7)

        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '    <td colspan="8">'; // glaub 8 passt
                echo '      <table>';
                echo '        <tr>';
                foreach ($row_collector[$taet_id]['data'][$prod_id]['time'] as $user_id => $u) {
                    $subtd = array();
                    $subtd[0] = $row_collector[$taet_id]['data'][$prod_id]['time'][$user_id]['name'];
                    for ($i = 0; $i < 7; $i++) {
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$user_id]['work'][$ts])) {
                            $td[$i+1] = $row_collector[$taet_id]['data'][$prod_id]['time'][$user_id]['work'][$ts];
                        } else {
                            $td[$i+1] = ' ';
                        }
                    }
                    for ($i = 0; $i < count($subtd); $i++) {
                        echo '          <td>'.$subtd[$i].'</td>';
                    }
                }
                echo '        </tr>';
                echo '      </table>';
                echo '    </td>';
                echo '  </tr>';
            }
        }
```
puh, das is jetzt ohne ide geschrieben, nur hier im textfeld ^^ hoffe, das klappt so, wie ich mir das denke. sinn des ganzen: für das projekt wird eine zeile in der großen tabelle angelegt. die große tabelle hat immernoch alle spalten, damit eben die "überschrift" (der tabellenkopf) ordentlich passt. müsste halt in der reihenfolge "prID | Tätigkeit | Produkt | Beschreibung | MA | Mo | ... | So" sein. für das projekt wird nun alles bis beschreibung ausgefüllt, die letzten 8 felder werden zu einem zusammen gefasst um dort ein sub-tabelle reinzupacken. in dieser subtabelle werden dann alle user mit ihren zeiten untereinander aufgeführt.

sollte prinzipiell klappen. was passieren kann: es sieht vom format her blöde aus ^^ einerseits wird wohl der "projekt kopf" (also der teil bis beschreibung) bei mehreren usern in der höhe zentriert ausgegeben (da müsstest du vertical-align:top oder so beim css anfügen) und andererseits kann es vorkommen, dass die spalten vom tabellenkopf ab MA nicht mit den subtabellen harmonieren. die hängen ja nich zusammen, da es 2 verschiedene tabellen sind. da müsste man dann versuchen mit festen breiten gegen zu steuern. auch haste dann wohl nen doppelten rahmen bei der subtabelle. einmal den vom td der äusseren tabelle, wo die subtabelle drin steckt, und noch eben die rahmen der tabellen-zellen der inneren tabelle. da müsste man dann ggf diese äussere zelle ohne rand gestalten und ebenso den innenabstand auf 0 setzen (margin oder padding, eins von beidem war das) - sonst hat man da nen kleinen versatz drin. aber das ist nur css spielerei, daher will ich da jetz nich so sehr drauf eingehen.

vom layout her viel viel günstiger und einfacher (warscheinlich auch besser) wäre es, wenn man auf die subtabelle pfeifft und alles in eine packt (also die ursprüngliche), aber das wird glaube algorythmisch etwas schärfer ^^


----------



## boss3D (3. Oktober 2014)

^^ Puh, da zerlegt's uns optisch alles ... und ich glaube auch nicht, dass das stimmt?! Jetzt holt er sich zwar beide Mitarbeiter, aber weist jedem Datensatz auch beide zu. Jetzt haben ich 8x den einen UND 8x den anderen.




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ich glaube, die einfachste Lösung wäre es, meinen Mini-$coll zu verwenden:
	
	



```
$row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    foreach ($row_coll as $ma_id => $id) {
        $tb = array();
        $tb[0] = $row_coll[$ma_id]['id'];
        $tb[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < count($tb[1]); $i++) {
            echo $tb[1].'<br>';
        }
    }
```
Das einzige, wozu mir noch keine Lösung eingefallen ist, ist, wie ich jetzt noch die darin gespeicherten User den dazupassenden Datensätzen in der Ausgabe zuordne. 

Irgendwie müsste man halt den richtigen Mitarbeiter aus $tb[1] von $row_coll in $td[0] von $row_collector reinbringen:


Spoiler





```
/**************/    
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    foreach ($row_coll as $ma_id => $id) {
        $tb = array();
        $tb[0] = $row_coll[$ma_id]['id'];
        $tb[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < count($tb[1]); $i++) {
            echo $tb[1].'<br>';
        }
    }
    /**************/   
    $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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';             
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
```



Aber all meine bisherigen Verschachtelungs-/Schleifen-Versuche haben noch zu nichts funktionierendem geführt ...

[EDIT]
Und wieso funktioniert eigentlich das nicht? Das wäre überhaupt die einfachste Lösung gewesen:



Spoiler





```
foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                /**************/
                $userid = $mysqli_query($mysqli, "SELECT userid FROM projekte WHERE id = '".$td[11]."';");
                $td[0] = $mysqli_query($mysqli, "SELECT name FROM user WHERE id = '".$userid."';");
                /**************/
                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';             
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
```



[EDIT2]
Wenn ich in Bezug auf meine erste Idee einfach sage $td[0]=$tb[1], dann kriegen halt alle Datensätze "M..." zugewiesen. Hier müsste irgendwo "in unmittelbarere Codeumgebung" halt noch ne "kleine" Unterscheidung zwischen allen MA-Namen in $tb[1] rein, nur wie bloß???


----------



## boss3D (3. Oktober 2014)

Jetzt habe ich mal probiert, um das ständige Überschreiben auszutricksen, in jeder Schleifenrunde den jeweiligen Namen in ein Element eines neuen Feldes zu speichern, sodass wir dann alle Namen schön nacheinander in diesem Feld $namen hätten ...
	
	



```
$name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $abfrage = "SELECT name FROM user";
    $ergebnis = mysqli_query($mysqli, $abfrage);
    $anzahl = mysqli_num_rows($ergebnis);
    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$i] = $td[$i];
            //echo $td[$i].'<br>';
        }
    }
    for ($z = 0; $z < $anzahl; $z++) {
        echo $name[$z];
    }
```
Aber auch hier laufe ich wieder in das selbe Problem: $name hat am Ende wieder nur 1 Element, ergo nur 1 Namen gespeichert (den letzten aus der DB-Tabelle, logischerweise). 

Wo, verdammt, habe ich hier den Denkfehler drinnen??? Irgendwo hier ...
	
	



```
for ($i = 0; $i < $anzahl; $i++) {
            $name[$i] = $td[$i];
```
... würde ich mal stark vermuten, aber ich seh's ums Verrecken nicht. $anzahl ist BTW korrekterweise 2, wenn ich es ausgeben lasse.
---------------------

[EDIT]
Ich hab's geschafft! 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Alle Namen und IDs werden jetzt korrekt nacheinander im Feld $namen gespeichert und können durch Zugriff auf den richtigen Index auch wieder rausgeholt werden:


Spoiler





```
$name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;
    $abfrage = "SELECT name FROM user";
    $ergebnis = mysqli_query($mysqli, $abfrage);
    $anzahl = mysqli_num_rows($ergebnis);
    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }
    for ($z = 1; $z < count($name); $z += 2) {
        echo '['.$z.'] = '.$name[$z].'<br>';
    }
```



^^ Es wird immer abwechselnd ID, Name, ID, Name, ... gespeichert, deswegen das Weiterspringen um 2 in der Schleife. Ich will ja nur die Namen sehen, werde aber jetzt für den nächsten Schritt meines "workarounds" wohl auch die IDs brauchen?!

Die Idee wäre jetzt nämlich, im großen $row_collector bei $td[0] immer den Namen aus $namen reinzuspeichern, dessen (User-)ID (wie gesagt ebenfalls in $namen gespeichert) zur Projekt-ID aus der DB-Tabelle "projekte" passt. Letztgenannte ID haben wir ja im $row_collector immer korrekt in $td[11] drinnen ($td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj']).
Mal schauen, ob ich das auch noch hinkriege ...

[EDIT2]
So wäre der erste Versuch gewesen, aber das klappte noch nicht:



Spoiler





```
foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {    
                //$td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                [COLOR=royalblue]$user_id = mysqli_query($mysqli, "SELECT userid FROM projekte WHERE id = '".$td[11]."';");
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $user_id) {
                        $td[0] = $name[$j+1];
                    }
                }                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
```



^^ Aber weit weg kann ich nicht sein?!

Entweder darf ein query an dieser Stelle im Code nicht stehen (wenn richtig, warum?), oder das query selbst hat einen Fehler. Jedenfalls passiert alles, das im Code nach dem query kommt, nicht mehr. Beim query bleibt er stehen. Selbst ein möglicher Error, den ich nur 1 Zeile später ermitteln ließe, wird nicht mehr ausgegeben, ergo die Zeile nicht mehr ausgeführt.

```
$user_id = mysqli_query($mysqli, "SELECT userid FROM projekte WHERE id = '".$td[11]."';");
if (!$user_id) {
   die ('Ungültige Abfrage: '.$mysqli->error);
}
```
Wenn ich es wie folgt probiere, wird "hier komme ich noch her" und auch alles andere danach ganz normal ausgeführt und ausgegeben (nur leider immer noch vor jeder Zeile "test", weil wohl meine kleine for-Schleife noch nicht das richtige macht und/oder das query eben einen Fehler hat), aber sobald ich "echo $res" sage, ist wieder Endstation. Alles danach passiert dann wieder nicht mehr.
	
	



```
$user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."'";
$res = mysqli_query($mysqli, $user_id);
echo "hier komme ich noch her<br>";
//echo $res.'<br>';
for ($j = 0; $j < count($name); $j++) {
    if ($name[$j] == $user_id) {
       $td[0] = $name[$j+1];
    }
}
```
Für mich sieht das so aus als wäre Schluss, sobald ich das Ergebnis des querys in irgendeiner Form benutzen will?! Sei es nur durch ein simples echo, oder durch eine tatsächliche Verwendung in der Schleife.


----------



## boss3D (6. Oktober 2014)

Ich habe jetzt die Filterfunktionen fast korrekt fertiggebracht, nur an einem Problem hänge ich noch:

Filtere ich nach einer Tätigkeit, wird mir dieser Eintrag für JEDES in der DB vorhandene Produkt angezeigt, nicht nur jene, an denen mit dieser Tätigkeit gearbeitet wurde ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Ansonsten stimmen alle Daten. Hier noch das zugehörige query:



Spoiler





```
$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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.ID
                                        ORDER BY
                                            z.datum ASC;");
```



Ganz genau so verhält es sich, wenn ich nach einem einzelnen Produkt filtere. Dann wird mir dieses für JEDE Tätigkeit angezeigt. Und bei Kombinationen aus Tätigkeit/Produkt/MA wird mir der entsprechende Eintrag für JEDE Tätigkeit UND JEDES Produkt angezeigt.

Irgendwo im WHERE muss der Fehler sein?!

[EDIT]
Kombinationen habe ich gerade noch geschafft, da musste nur die Tätigkeits- bzw. Produkt-ID aus der Tätigkeiten- bzw. Produkt-Tabelle im WHERE ergänzt werden. Aber das war ja nicht schwer umzusetzen, weil es für eine bestimmte Tätigkeit/Produkt/MA-Kombination in einer Woche eh nur einen Eintrag geben kann.

Nur, wie mache ich das beim Filtern nach z. B. einer bestimmten Tätigkeit? Die kann ja auf mehrere Produkte angewandt worden sein, was a) in mehreren Datensätzen resultieren würde und mir b) nicht erlaubt, auch noch schnell eine bestimmte Produkt-ID im WHERE zu ergänzen. ???


----------



## BenRo (6. Oktober 2014)

Ich verstehe nicht, warum du es dir in deinem Beispiel so kompliziert machst:



Spoiler





```
$name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;
    $abfrage = "SELECT name FROM user";
    $ergebnis = mysqli_query($mysqli, $abfrage);
    $anzahl = mysqli_num_rows($ergebnis);
    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }
    for ($z = 1; $z < count($name); $z += 2) {
        echo '['.$z.'] = '.$name[$z].'<br>';
    }
```





Was spricht beispielsweise hiergegen:


```
$row_coll = array();

    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");

    while ($row = mysqli_fetch_assoc($user_table)) {
        $row_coll[$row['id']] = $row['name'];
    }
    
    foreach ($row_coll as $id => name) {
        echo '['.$id.'] = '.$name.'<br>';

        /* Falls in den Klammern nicht die id, sondern eine fortlaufende Nummer angezeigt werden soll,
            stattdessen so (und vor dem foreach $i= 0; setzen): */
        // echo '['.$i++.'] = '.$name.'<br>';
    }

    $anzahl = count($row_coll); // falls die Anzahl später für irgendwas benötigt wird

    /* Der Sinn aller weiteren Zwischenschritte blieb mir unklar */
```


----------



## boss3D (6. Oktober 2014)

^^ Also wenn ich deine Version richtig verstehe, kriegen wir am Ende beide ein array raus, das Namen und IDs beinhaltet. Bei uns beiden $row_coll, nur dass ich das eben noch an $name übertrage. Bis hier hin ist es ja auch noch nicht das wirkliche Problem ...

Worauf es jetzt ankäme, wäre, dass wir im großen $row_collector bei $td[0] immer (also für jede Schleifenrunde bzw. Anzahl der Datensätze) die zur in $td[11] gespeicherten Projekt-ID zugehörige User-ID mit der in $row_coll (bzw. bei mir $name) gespeicherten User-ID abgleichen und dann den zugehörigen Namen ausgeben.

Vereinfacht dargestellt ($row_collector):
td[0] ... hier kommt Username rein
td[11] ... Projekt-ID
1) Abfrage: $name[0], $name[2], etc. == $user_id des aktuell betrachteten Projekts (siehe query) ???
2) wenn ja z. B. bei $name[2] --> $td[0] = $name[3] (weil Name immer einen Index nach der zugehörigen ID gespeichert wird)

So funktioniert genau das eben beschriebene allerdings nicht:



Spoiler





```
/**************/ 
    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;
    $abfrage = "SELECT name FROM user";
    $ergebnis = mysqli_query($mysqli, $abfrage);
    $anzahl = mysqli_num_rows($ergebnis);
    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }
    for ($z = 1; $z < count($name); $z += 2) {
        echo 'name['.$z.'] = '.$name[$z].'<br>';
    } 
    /**************/   
    $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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                /**************/
                [COLOR=royalblue]$user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                echo $user_id.'<br>';
                $res = mysqli_query($mysqli, $user_id);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $res) {
                        $td[0] = $name[$j+1];
                        echo "td[0] = ".$td[0];
                    }
                }                /**************/
                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }
        }
```



Aus irgendeinem Grund scheint das query in der Schleife nicht zu funktionieren. Das echo zeigt folgendes:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Kann das sein, dass PHP mein $user_id automatisch zu einem array macht, wo dann all diese userids drinnenstecken, mein mysql_query ($res) mit dem array(?) aber nichts anfangen kann?  Eine andere Erklärung finde ich nicht. Aber irgendwie so muss es scheitern?!
Oder wird das query immer durch das nachfolgende query überschrieben, am Ende nur jenes mit id=24 ausgeführt, und die gehört natürlich zu "test"? Dann würd's zwar funktionieren, aber halt semantisch nichts anderes machen können, als nur "test" zu liefern. 
---------------

Allerdings hätte ich jetzt erstmal vorgehabt, die Filterfunktionen fertig zu basteln und mich erst danach nochmal um die Namensausgabe zu kümmern. Sollten wir diese nämlich nicht schaffen, könnten wir die zur Not nochmal rausschmeißen und das Programm käme auch ohne aus. Das witzige ist nämlich, dass die Namen "intern" völlig korrekt gespeichert zu werden scheinen! Obwohl nämlich z. B. vor sämtlichen Einträgen "test" angezeigt wird, kann ich ganz normal nach "M.E..." filtern und er zeigt mir dann völlig korrekt nur jene Einträge an, die in der DB dem User M.E... zugeordnet sind (dann plötzlich auch mit dem richtigen Namen). Verrückte Welt. 

Wenn du mir helfen willst, dann schau dir bitte mein Posting ganz unten auf der Vorseite an. Das wäre jetzt erstmal wichtiger als diese Namensgeschichte hier ...


----------



## boss3D (6. Oktober 2014)

Als Ergänzung zu Posting #720:

Wenn ich das nach-Tätigkeit-filtern-query nur um die Produkt-ID erweitere, dann erhalte ich schon nur noch einen korrekten Eintrag. (Selbes gilt für nach-Produkt-filtern)

```
WHERE
    z.datum >= '".$wochenanfang."' AND z.datum <=  '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit =  '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id
```
Das Problem ist jetzt allerdings, dass es bei diesem einen Eintrag bleibt, selbst wenn es mehrere Einträge zu unterschiedlichen Produkten mit dieser Tätigkeit gibt.
Das Problem für alles ist einfach dieser sch*** $row_collector, der alles nur einmal speichern kann und nach Lust und Laune überschreibt, wenn noch was nachkommt ... 

Wie soll ich es so je schaffen, mehrere korrekte Zeilen für irgendwas auszugeben??? 
Kann man den ganzen verdammten $row_collector in ne Schleife mit der Durchlaufanzahl entsprechend der Anzahl der auszugebenden Datensätze stecken? Aber dann käme wahrscheinlich wieder zig mal das gleiche?!

[EDIT]
Ich frage mich nur gerade, wieso klappt eine mehrfache Zeilenausgabe (mit unterschiedlichen Datensätzen) beim User-filtern?

Sieht irgendwer einen gravierenden Unterschied zwischen den WHEREs in folgenden beiden queries:



Spoiler





```
if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus 
        $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;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id 
                                        ORDER BY
                                            z.datum ASC;");
    }
```


----------



## BenRo (6. Oktober 2014)

boss3D schrieb:


> Spoiler
> 
> 
> 
> ...



Der Code funktioniert nicht, weil $res ein mysqli-result-objekt ist:
PHP: mysqli_result - Manual
Um eine Zeile daraus als assoziativen Array zu erhalten, kannst du mit mysql_fetch_assoc arbeiten.


----------



## boss3D (6. Oktober 2014)

^^ Das sollte dann wohl so ausschauen:
	
	



```
$user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                echo $user_id.'<br>';
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[0] = $name[$j+1];
                        echo "td[0] = ".$td[0];
                    }
                }
```
Ändert aber gar nichts am Problem, es wird immer noch nur "test" in der Namen-Spalte ausgegeben.

[EDIT]
Ne, stimmt schon, es musste ['userid'] statt ['id'] heißen.
----------

Warum ist es bei User-filtern sehr wohl möglich, für den selben User mehrere Zeilen auszugeben wenn sich die übrigen Daten unterscheiden, für Tätigkeiten- und Produkte-filtern aber nicht?


----------



## BenRo (6. Oktober 2014)

Habe mir nun deinen Code auf der letzten Seite angesehen. Im Query fehlt folgendes:
 AND u.id=pr.userid AND p.id = pr.produkt

Also so:


```
$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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.ID AND u.id=pr.userid AND p.id = pr.produkt
                                        ORDER BY
                                            z.datum ASC;");
```
EDIT:

Zu deinem Problem aus #725:


```
$user_id = "SELECT name FROM user,projekte WHERE user.id =projekte.userid AND projekte.id = '".$td[11]."';";
// echo $user_id.'<br>';
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
echo 'Der Username lautet: '.$row['name'];
```


----------



## boss3D (6. Oktober 2014)

^^ #725 hat sich schon erledigt, ging noch leichter als in deinem Vorschlag. 

Ich schau mir jetzt deinen Tipp fürs query an ...

BTW: Bitte unbedingt meine Kommentare an den queries dran lassen! Ich habe 5 sehr ähnliche von den Dingern. So weiß ich selbst nur schwer, von welchem wir gerade reden.

[EDIT]
Unter der Annahme, dass du dich auf das Tätigkeit-filtern-query bezogen hast und das WHERE dann ausschaut wie folgt, das funktioniert nicht. Da kommt dann nur "keine Einträge gefunden".

```
WHERE
    z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND u.id = pr.userid AND p.id = pr.produkt AND z.taetprodid = pr.id
```
^^ Die Filterung ist m. E. viel zu "scharf". Das müsste doch eher "gelockert" werden, damit wir mehr Einträge kriegen?!


----------



## BenRo (6. Oktober 2014)

Naja, die User-Id der User- und Projekttabellen müssen halt korrespondieren, ebenso die Produkt-IDs.

Je nachdem, wonach du filterst, brauchst  du einen anderen Query.


----------



## boss3D (6. Oktober 2014)

^^ Nach meinem Verständnis darf die User-ID weder im WHERE des Tätigkeit-filtern-query, noch im WHERE des Produkt-filtern-query vorkommen. Es kann ja theoretisch Einträge von ein und dem selben Produkt (bzw. der selben Tätigkeit) geben, aber für mehrere verschiedene User. Wenn wir den User auch ins WHERE mitreinnnehmen, filtern wir schon zu scharf.

Ich hätte halt geglaubt, es würde (jetzt für Tätigkeiten) reichen, aus _projekte_ die Tätigkeit-ID zu holen, aus _tätigkeiten_ den Namen, und dann noch die taetprodid aus _zeiten_ mit der id aus _projekte_ abzugleichen. Das hätte nach meinem Verständnis sämtliche Einträge für die ausgewählte Tätigkeit liefern müssen ... aber diese Kriterien liefern leider nur den zeitlich aktuellsten Eintrag. 



Derzeit:



Spoiler





```
} elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $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 p.id = '".$prodid."' AND pr.produkt = '".$prodid."' AND t.id = '".$taetid."' AND z.taetprodid = pr.id
                                        ORDER BY
                                            z.datum ASC;");
    }
```


----------



## BenRo (6. Oktober 2014)

boss3D schrieb:


> ^^ Nach meinem Verständnis darf die User-ID weder im WHERE des Tätigkeit-filtern-query, noch im WHERE des Produkt-filtern-query vorkommen. Es kann ja theoretisch Einträge von ein und dem selben Produkt (bzw. der selben Tätigkeit) geben, aber für mehrere verschiedene User. Wenn wir den User auch ins WHERE mitreinnnehmen, filtern wir schon zu scharf.



Es geht nicht darum, nach user-id zu filtern, sondern darum, dass die Spalte id in der Tabelle user dem Feld userid in der Tabelle Projekte entspricht.

EDIT: Ah, sorry, muss natürlich die Tabelle Zeiten und nicht die Tabelle Projekte sein, also z.userid



> liefern leider nur den zeitlich aktuellsten Eintrag.


Hast du mal probiert, testweise die zeitliche Einschränkung z.datum >= ... AND z.datum <= ... wegzulassen?
Stehen in $taetid und $prodid jeweils die korrekten Werte?


----------



## boss3D (6. Oktober 2014)

```
WHERE
     z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND [COLOR=royalblue]u.id = z.userid AND z.taetprodid = pr.id
```
... liefert leider auch nur eine Zeile für den aktuellsten Eintrag zu einer bestimmten Tätigkeit. 

Zeitliche Einschränkung wegzulassen habe ich noch nicht probiert, dürfte aber auch gar keine Relevanz haben, da alle meine Einträge in der DB in der selben Woche sind und ich eh immer diese Woche auswählen muss, um überhaupt was angezeigt zu kriegen. Da kann mir kein "ich-habe-vergessen,-die-richtige-Woche-auszuwählen"-Fehler passieren.

Ich check nochmal schnell die taetid und prodid, aber eigentlich müssten auch die stimmen, weil deren Werte ja direkt per $_POST von dem ausgewählten dropdown-Feld in meinen Code reingeholt werden:

```
if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
```
Ich könnte aber zum Testen mal die taetid von einer mehrfach vorkommenden Tätigkeit in das query "hardcoden". Dann hätten wir taetid (bzw. prodid) auch noch definitv ausgeschlossen.

[EDIT]
taetid und prodid müssen stimmen. Der Hardcode-Test hat auch nicht mehr als eine Zeile geliefert, der Fehler liegt woanders ...


----------



## BenRo (6. Oktober 2014)

Ich bekomme durchaus mehrere Zeilen aus meiner Testdatenbank.
Kannst du deinen Gesamtcode nochmal posten/hochladen?


----------



## boss3D (6. Oktober 2014)

Reicht dir meine auswerten2.php, oder brauchst du mehr files? Dann bitte nochmal sagen. Meine DB kann ich dir allerdings schwer mitgeben, weil da logischerweise sämtliche Firmeninfos drinnen sind.


Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND p.id = '".$prodid."' AND z.taetprodid = pr.id 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $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 p.id = '".$prodid."' AND pr.produkt = '".$prodid."' AND t.id = '".$taetid."' AND z.taetprodid = pr.id
                                        ORDER BY
                                            z.datum ASC;");
    } if (isset($_POST['kombination'])) { // nach Kombination filtern
        $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.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id = '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."' AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $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 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>';
    echo '      <th>Mitarbeiter</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>';
    echo '        <th>ID</th>';
    echo '    </tr>';

    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    $anzahl = mysqli_num_rows($user_table);
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }  
    $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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[0] = $name[$j+1];
                    }
                }
                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                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>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    
    echo '<br><input type="submit" style="height:24px; width:100px" name="filterTaet" value="Tätigkeit >"> ';    
    $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;
        }
    }
    echo '<tr><td><select name="filter_taetigkeit">';
    foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
    echo '</select></td><br><br>';
        
    echo '<input type="submit" style="height:24px; width:100px" name="filterProd" value="Produkt >"> ';
    $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;
        }
    }
    echo '<td><select name="filter_product">';
    foreach ($products as $product) {
        echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
    }
    echo '</select></td><br><br>';
    
    echo '<input type="submit" style="height:24px; width:100px" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" style="height:24px; width:140px" name="kombination" value="^^ Kombination"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```



BTW: Das erste, das letzte, und das Kombinationen-query funktionieren einwandfrei. Es geht wirklich nur um Tätigkeit-filtern und Produkt-filtern.


----------



## BenRo (6. Oktober 2014)

Du verwendest $prodid auch im Query "filterTaet" und $taetid auch im Query "filterProd". Ist das denn so richtig?


----------



## boss3D (7. Oktober 2014)

Ich weiß nicht, ob's "richtig" ist, aber ich kann dir was zeigen ...

Query filterTaet ohne $prodid:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Query filterTaet mit $prodid:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



(für die queries bei filterProd verhält es sich genau so)

Wie du siehst, kriege ich ohne die $prodid meine Einträge für die gesamte Produktpalette ausgegeben, nicht nur für jene Produkte, für die es tatsächlich DB-Einträge mit dieser Tätigkeit gibt. Ich weiß nicht, ob die $prodid verhindert, dass mir gegebenenfalls mehr als 1 korrekter Datensatz angezeigt wird, aber wenn ich die $prodid wieder rausschmeißen soll, wie verhindere ich dann die Sinnlosausgabe aus Bild 1?


----------



## BenRo (7. Oktober 2014)

So sähe z. B. der korrekte Query für "filterTaet" aus:


Spoiler





```
$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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."'  AND z.taetprodid = pr.id AND z.userid=u.id AND p.id=pr.produkt
                                        ORDER BY
                                            z.datum ASC");
```





Funktioniert bei mir und filtert korrekt nach Tätigkeit.

Und hier der "filterProd":


Spoiler





```
$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 p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid=u.id AND p.id=pr.produkt AND t.id=pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC");
```


----------



## boss3D (7. Oktober 2014)

^^ Ja, funktioniert jetzt bei mir auch, allerdings verstehe ich gerade nicht ganz, wieso das gestern bei mir nicht ging, wo ich deine Tipps selbst ausprobiert hatte.

Spielt die Reihenfolge der Angaben im WHERE eine Rolle? Also, ob ich einen Vergleich vor oder nach einem bestimmten anderen schreibe?
Bzw., spielt es eine Rolle, ob ich "z.userid = u.id" oder "u.id = z.userid" sage? 

Das wäre der einzige Unterschied, der mir zu meinen Versuchen von gestern auffällt ...
Immerhin geht's jetzt.
------------

Eine weitere Idee, die für sinnvolle Filterfunktionen eigentlich noch ergänzt werden sollte, ist mir gestern noch gekommen: Wenn ich da jetzt wirklich mehrere Datensätze (Zeilen) für eine bestimmte Filterung ausgegeben kriege, dann wär's ja jetzt noch interessant, zu sehen (berechnen), wie viele Stunden sind insgesamt (über alle angezeigten Einträge hinweg) a) an einem Tag gemacht worde, b) in einer Woche gemacht worden? Dazu müsste man sich halt die entsprechenden Zeitdaten aus der DB holen (stecken vielleicht jetzt sogar schon in den queries drinnen und wir könnten die gleich weiterverwenden _*überleg*_), addieren, und dann unter der jeweiligen Spalte bzw. neben der jeweiligen Zeile ausgeben.
------------

^^ Bevor ich das allerdings angehen möchte, gäbe es noch ein vorerst letztes Problem zu lösen, das ich zwar schon die ganze Zeit mitschleppe aber bewusst nicht erwähnt habe, damit wir uns nicht bei Korrekturversuchen was zerschießen solange die queries nicht gestimmt haben.

Wenn ich von projektzeiterfassung.php weiter gehe zu auswerten2.php, also dahin, wo mir erstmal der gesamte DB-Inhalt angezeigt wird, und ich dann DORT (in auswerten2.php) auf die Pfeiltasten zum Vor- und Zurückschalten der Kalenderwochen klicke, springt er automatisch zur Eingabemaske in projektzeiterfassung.php zurück anstatt korrekterweise in auswerten2.php zu bleiben und mir dort eventuell "Keine Einträge gefunden" anzuzeigen.
Das Problem ist genau zu dem Zeitpunkt zum ersten Mal aufgetreten, als ich meine Filter-Buttons und Felder ins Programm bzw. den Code eingebaut habe (in auswerten2.php).

Meine Vermutung ist, dass der Fehler jetzt irgendwo in meiner "verunstalteten" index.php liegt:
	
	



```
<?php
    session_start();
    session_regenerate_id();

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

    if (isset($_POST['export']) and isset($_SESSION['name'])) {
        include('export.php');
    } else {
        include('html_header.php');

        if (!isset($_SESSION['name'])) {
            if (isset($_POST['btnRegForm']) or $section == "register") {
                include('registrieren.php');
            } else {
                include('login.html');
            }
        } else {
            if (isset($_POST['auswerten']) or $section == "output") {
                include('auswerten.php');
            } [COLOR=royalblue]elseif (isset($_POST['filterName']) or $section == "output_admin") { 
                include('auswerten2.php');
            } elseif (isset($_POST['filterTaet']) or $section == "output_admin") {
                include('auswerten2.php');
            } elseif (isset($_POST['filterProd']) or $section == "output_admin") {
                include('auswerten2.php');
            } elseif (isset($_POST['kombination']) or $section == "output_admin") { 
                include('auswerten2.php');
            } elseif (isset($_POST['auswertenall']) or $section == "output_admin") {
                include('auswerten2.php');
            } else {
                include('projektzeiterfassung.php');
            }
        }
    
        include('html_footer.php');
    }
```
Wobei's allerdings gewünscht wäre, dass er in auswerten2.php bleibt. Drum sehe ich jetzt den Fehler nicht, aber seit ich das alles eben so umgebaut bzw. erweitert habe, habe ich ihn.

Ich bin mir auch nicht so ganz sicher, ob ich nicht "im Übereifer" an zu vielen Stellen überprüfe, was gerade angeklickt wurde?! Zum einen eben in index.php, zum anderen aber eben auch vor den queries in auswerten2.php. Und in formular.php, das ja eigentlich für Buttons zuständig wäre, gar nicht.
Das normale auswerten.php (für normale Mitarbeiter, nicht Admin) funktioniert noch einwandfrei und der einzige Unterschied zu auswerten2.php sind eben die Filterfunktionen in letzterem ...


Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    [COLOR=royalblue]if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    [COLOR=royalblue]} elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt 
                                        ORDER BY
                                            z.datum ASC;");
    [COLOR=royalblue]} elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $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 p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt AND t.id = pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC;");
    [COLOR=royalblue]} if (isset($_POST['kombination'])) { // nach Kombination filtern
        $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.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id = '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."' AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
    [COLOR=royalblue]} elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $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 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>';
    echo '      <th>Mitarbeiter</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>';
    echo '        <th>ID</th>';
    echo '    </tr>';

    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    $anzahl = mysqli_num_rows($user_table);
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }  
    $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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[1] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[11] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[11]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[0] = $name[$j+1];
                    }
                }
                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+4] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+4] = ' ';
                    }
                }
                echo '  <tr>';            
                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>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    
    [COLOR=royalblue]echo '<br><input type="submit" style="height:24px; width:100px" name="filterTaet" value="Tätigkeit >"> ';    
    $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;
        }
    }
    echo '<tr><td><select name="filter_taetigkeit">';
    foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
    echo '</select></td><br><br>';
        
    [COLOR=royalblue]echo '<input type="submit" style="height:24px; width:100px" name="filterProd" value="Produkt >"> ';    $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;
        }
    }
    echo '<td><select name="filter_product">';
    foreach ($products as $product) {
        echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
    }
    echo '</select></td><br><br>';
    
    [COLOR=royalblue]echo '<input type="submit" style="height:24px; width:100px" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" style="height:24px; width:140px" name="kombination" value="^^ Kombination"><br><br><br><br>';    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```


----------



## BenRo (7. Oktober 2014)

Die Reihenfolge (ob ich "z.userid = u.id" oder "u.id = z.userid" sage) spielt hier keine Rolle. Vielleicht hattest du einfach nen Schreibfehler drin.

Für die Berechnung der Gesamtstundenzahl, verwende die SQL-Funktion SUM(). Wenn du "mysql SUM()" googelst findest du Erklärung und Beispiele.

Deine index.php ist allerdings verunstaltet. Wenn man sich das hier durch den Kopf gehen lässt:
ODER WENN (X der Fall ist ODER $section "output_admin" ist)
ODER WENN (Y der Fall ist ODER $section "output_admin" ist)
ODER WENN (Z der Fall ist ODER $section "output_admin" ist)
sollte eigentlich schnell klar werden, dass man das einfacher haben kann. Allgemein gilt: Wenn man den selben Code mehr als zweimal irgendwo hinschreiben oder hinkopieren muss, hat man fast sicher einen Denkfehler. Der Sinn von Programmierung ist ja gerade, Dinge zu automatisieren und zu vereinfachen.

Hier eine kürzere Fassung, die genau das gleiche tut wie oben (d. h. falls ein Fehler drin ist, ist der nach wie vor drin):

```
<?php
     session_start();
     session_regenerate_id();
     include('config.php');
     include('formular.php');
     if (isset($_POST['export']) and isset($_SESSION['name'])) {
         include('export.php');
     } else {
         include('html_header.php');
         if (!isset($_SESSION['name'])) {
            if (isset($_POST['btnRegForm']) or $section == "register") {
                 include('registrieren.php');
            } else {
                 include('login.html');
            }
         } else {
             if (isset($_POST['auswerten']) or $section == "output") {
                 include('auswerten.php');
             } elseif ($section == "output_admin" or isset($_POST['filterName']) 
                      or isset($_POST['filterTaet']) or isset($_POST['filterProd'])
                      or isset($_POST['kombination']) or isset($_POST['auswertenall'])
                      ) {
                 include('auswerten2.php');
             } else {
                 include('projektzeiterfassung.php');
             }
         }
         include('html_footer.php');
     }
```
(Hmm... Ein paar Einrückungen haben sich beim Kopieren verschoben seltsam)

Ich werd mich jetzt nicht in das konkrete Problem einarbeiten, sieht kompliziert aus. Zur Fehlersuche empfehle ich einfach mal herauszufinden, was in $section steckt.


----------



## boss3D (7. Oktober 2014)

Das Problem ist geblieben. Er springt immer zu projektzeiterfassung.php sobald ich in auswerten2.php die Kalenderwochen durchzuschalten versuche ...

Ich hätte ja ursprünglich versucht, das Filter-Button-auswerten wie alle anderen Buttons auch in formular.php unterzubringen, aber ich kann ja dort keine queries und Ausgabe reinbasteln, die ich dann in auswerten2.php sehen will?! Und von formular.php aus auswerten2.php aufzurufen hätte auch nicht viel Sinn gemacht, weil ich dadurch wieder die index.php umgangen wäre.
Der Aufbau ist halt ne verzwickte Sache, jetzt mit den Filterfunktionen erst recht, aber ich wüsste nicht, wie ich das umbauen sollte. Ja, ich schau mir mal den Inhalt von $section an ...

[EDIT]
BenRo, du könntest mit deiner Vermutung richtig liegen.

```
echo 'auswerten2.php = '.$section;
```
^^ in auswerten2.php ergibt "auswerten2.php = pze", eigentlich sollten wir aber "auswerten_admin" statt "pze" kriegen. Das hilft mir schon mal sehr weiter. Jetzt nur noch die Quelle des Fehlers finden.


----------



## boss3D (7. Oktober 2014)

Hm, in formular.php habe ich jetzt folgendes hinzugefügt, das offenbar gefehlt hatte:

```
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";
    }
```
Jetzt kriege ich auch die richtige Ausgabe in auswerten2.php:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Aber wenn ich jetzt versuche, in auswerten2.php die KWs durchzuschalten, dann kriege ich das:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Und die Fehlermeldung kann nur durch ein fehlerhaftes query in auswerten2.php zustande kommen:



Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $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 p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt AND t.id = pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC;");
    } if (isset($_POST['kombination'])) { // nach Kombination filtern
        $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.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id = '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."' AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['auswertenall'])) { // lese gesamten DB-Inhalt aus    
        $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 pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id
                                        ORDER BY
                                            z.datum ASC;");              
    }
    [COLOR=royalblue]if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
```



Fragt sich nur, wodurch das jetzt wieder passiert. Einmal funktioniert's definitiv, wenn ich von projektzeiterfassung.php zum ersten Mal nach auswerten2.php komme. Aber sobald ich dann die KW vor- oder zurückschalten will, müsste er ja nach meinem Verständnis das query, das den gesamten DB-Inhalt ausliest, nochmal durchführen und auswerten2.php dann mit aktualisierten Daten nochmal aufbauen?! Aber daran scheitert es dann ...


----------



## BenRo (7. Oktober 2014)

Wenn keiner der Queries ausgeführt wird, ist $db_erg nicht gesetzt und somit erscheint der Fehler.


----------



## boss3D (7. Oktober 2014)

^^ DAS ist schon klar, bin ja nicht doof. Die Frage ist, WARUM das passiert.

BTW wundert es mich gerade, warum $mysqli->error keine Meldung ausgibt. Das "ungültige Abfrage" habe ich selbst geschrieben. Zuerst dachte ich an einen Syntaxfehler und habe das Zeug gegoogelt. Dabei kam ich auf connect_error, aber das liefert auch nichts.


----------



## BenRo (7. Oktober 2014)

Du hast mich missverstanden. $mysqli->error gibt keine Meldung aus, weil es leer ist. Ich gehe davon aus, dass keine deiner if-Bedingungen zutrifft und es deswegen nicht dazu kommt, dass ein Query an die Datenbank gesendet wird.


----------



## boss3D (7. Oktober 2014)

^^ Ah ja, stimmt!  Das query "auswertenall" wird ja auch immer erst nach dem Klicken des zugehörigen Buttons in projektzeiterfassung.php ausgeführt. Nur, da kommen wir nicht mehr hin zurück, wenn ich in auswerten2.php bleiben und dort die KWs durchschalten will. Muss ich mir schnell nen kleinen workaround überlegen.

Kann man nen Button "manuell" setzen, ohne dass er zuvor gedrückt worden sein muss? Dann könnte man ja jetzt das ganz oben zu Beginn von auswerten2.php machen. If !isset blablub, dann setze ... ???
unset() gibt's. Vielleicht gibt's auch ein set(), schnell googlen.

[EDIT]
So ging's auch:

```
} elseif (isset($_POST['auswertenall']) or (!isset($_POST['kombination']) and !isset($_POST['filterProd']) and !isset($_POST['filterTaet']) and !isset($_POST['filterName']))) { // lese gesamten DB-Inhalt aus
```
Damit habe ich gesamten-DB-Inhalt-ausgeben einfach zum default gemacht, wenn nichts anderes explizit ausgewählt wurde.
-----------

Damit kann ich mich jetzt um die Berechnungen der Stunden für Tage und Wochen kümmern. Vielen Dank wieder mal bis hierher! 

[EDIT2]
Na, das war ja jetzt keine große Kunst. 

```
/**************/
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum = mysqli_fetch_row($time_table);
                    $td[12] = $sum[0];
                }
                echo '  <tr>';   
                /**************/
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';               
                }
                echo '  </tr>';
            }
        }
        /**************/
        echo '  <tr>';
        echo '    <td></td>';
        echo '    <td></td>';
        echo '    <td></td>';
        echo '    <td></td>';
        echo '    <td></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum = mysqli_fetch_row($time_table);
            echo '    <td>'.$sum[0].'</td>';
        }
        echo '  </tr>';
        /**************/
```
Irgendwie optisch hervorheben muss ich die letzte Zeile bzw. Spalte noch.




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## boss3D (7. Oktober 2014)

Schaut doch schon ganz cool aus ... 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Jetzt muss mir nur noch einer verraten, was zur Hölle den blöden Strichpunkt reingebracht hat. 
Entweder ich bin so doof und habe irgendwo ein "echo ';';" reingebastelt, das ich jetzt nicht mehr finde, oder ich weiß auch nicht ...

Und die 4 unnötigen leeren Feldumrandungen würde ich auch noch gerne weghaben.


Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $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 p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt AND t.id = pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC;");
    } if (isset($_POST['kombination'])) { // nach Kombination filtern
        $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.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id = '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."' AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['auswertenall']) or (!isset($_POST['kombination']) and !isset($_POST['filterProd']) and !isset($_POST['filterTaet']) and !isset($_POST['filterName']))) { // lese gesamten DB-Inhalt aus    
        $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 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="12" 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>';
    echo '      <th>ID</th>
                <th>Mitarbeiter</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>;
                <th>∑</th>';
    echo '    </tr>';

    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    $anzahl = mysqli_num_rows($user_table);
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }  
    $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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[2] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum = mysqli_fetch_row($time_table);
                    $td[12] = $sum[0];
                }
                echo '  <tr>';   
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';               
                }
                echo '  </tr>';
            }
        }
        echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td></td>';
        echo '    <td></td>';
        echo '    <td></td>';
        echo '    <td></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum = mysqli_fetch_row($time_table);
            echo '    <td>'.$sum[0].'</td>';
        }
        echo '  </tr>';
    } else {
        echo '  <tr><td colspan="12" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    
    echo '<br><input type="submit" style="height:24px; width:100px" name="filterTaet" value="Tätigkeit >"> ';    
    $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;
        }
    }
    echo '<tr><td><select name="filter_taetigkeit">';
    foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
    echo '</select></td><br><br>';
        
    echo '<input type="submit" style="height:24px; width:100px" name="filterProd" value="Produkt >"> ';
    $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;
        }
    }
    echo '<td><select name="filter_product">';
    foreach ($products as $product) {
        echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
    }
    echo '</select></td><br><br>';
    
    echo '<input type="submit" style="height:24px; width:100px" name="filterName" value="Mitarbeiter >"> <input name="mitarbeiterdb" type="text" size="30" maxlength="30"><br><br>';
    echo '<input type="submit" style="height:24px; width:140px" name="kombination" value="^^ Kombination"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File">';
```


----------



## TessaKavanagh (7. Oktober 2014)

wie wäre es mit der Funktion "suchen" und da dann einfach echo ";"; eingeben. Wenn es das ist dann hast du den Übeltäter doch gefunden.


----------



## boss3D (7. Oktober 2014)

0 matches, habe ich schon probiert. Ist das schräg! Ich habe ja über der Tabelle gar nicht rumgebastelt im Code, nur darunter und daneben ...

Ich schaue mir jetzt erstmal das mit den <td>s an. style="display:hidden;" würde sie leider ganz wegmachen, aber ich brauche sie ja, damit die Summen unter den korrekten Tagen landen. Ich bräuchte sie nur unsichtbar.

[EDIT]
style="border:none" hat geklappt.

[EDIT2]
Habe das verirrte Strich-Pünktchen schon gefunden, jetzt schaut's ganz sauber aus. 
--------------

Nun, nachdem das jetzt auch alles umgesetzt ist und ich mich hier in der Firma noch 10 Tage mit dem Projekt befassen darf, wäre das nächste, das mir einfällt, die Editier-Funktion noch umzusetzen zu probieren. So richtig werde ich mir das erst morgen dann anschauen, aber auf jeden Fall kann ich schon mal den Ansatz rauskramen, den ich vor 2(?) Wochen schon gebaut habe:

```
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $a = count($selected); // Anzahl der Zeilen
            
            $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;
                }
            }
             
            $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;
                }
            }
            
            for ($j = 0; $j < count($selected); $j++) {                          
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id=$selected[$j]");
                $row_taetid1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                $init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id=$row_taetid1");
                $row_taetid2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $taetigkeit) {
                    echo '<option value="'.$row_taetid1[0].'" selected>'.$row_taetid2[0].'</option>';
                }
                echo '</select></td>';
                
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id=$selected[$j]");
                $row_prodid1 = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                $init_prod = mysqli_query($mysqli, "SELECT produkt FROM produkte WHERE id=$row_prodid1");
                $row_prodid2 = mysqli_fetch_row($init_prod); // produkt aus produkte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $product) {
                    echo '<option value="'.$row_prodid1[0].'" selected>'.$row_prodid2[0].'</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'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                
                $hours = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE taetprodid=$selected[$j]");
                $row_time1 = mysqli_fetch_row($hours); // zeit aus zeiten
                $date = mysqli_query($mysqli, "SELECT datum FROM zeiten WHERE taetprodid=$selected[$j]");
                $row_time2 = mysqli_fetch_row($date); // timestamp aus zeiten
                for ($i = 0; $i < 7; $i++) {
                    //echo $row_time2[$i]; // 1412157600 (timestamp)
                    //echo date("d.m.Y", $row_time2[$i]); // 01.10.214 (MI)
                    //$ts = $wochenanfang + ($i * 60 * 60 * 24);
                    $ts = $row_time2[$i];
                    echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time1[$i].'" maxlength="6" size="4"></td>';
                }
                            
                //$update1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit=XX, produkt=YY, beschreibung=ZZ, erstellt=XYZ WHERE id=$selected[$j]");
            }
        }
    }
```
Die Idee wäre jedenfalls, erstmal eine mit den korrekten Werten der zu editierenden Zeile vorbelegte Zeile zu basteln, und diese dann an der richtigen Stelle in der Tabelle in auswerten(2).php einzufügen.

^^ Ich bin eh nicht schlecht unterwegs, nur habe ich es nicht geschafft, die dropdowns vorzubelegen. Die werden mir einfach leer angezeigt, wobei ich auf einen Index-Fehler in den eingefügten arrays tippe ...


----------



## BenRo (7. Oktober 2014)

Edit: Hier stand Quatsch


----------



## boss3D (7. Oktober 2014)

^^ np. Siehe mein Vorposting, habe da reineditiert wie's weitergeht.

Zur Zeit schaut's mit dem Editieren jedenfalls so aus ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



... also noch nicht so berauschend.

[EDIT]
Au, Mann, hab's schon gesehen:

```
$row_taetid1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
$init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id=$row_taetid1[COLOR=royalblue][B][0][/B]");
```
Na, dann müssen jetzt nur noch alle Zeiten im richtigen Feld landen ...


----------



## boss3D (8. Oktober 2014)

Das mit der Zeit kriege ich nicht hin. Es wird nur 1 korrekter Wert aus der DB geholt und dann im ersten Feld, also bei MO, als vorbeleg-Wert verwendet ...


Spoiler





```
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $a = count($selected); // Anzahl der Zeilen
            
            $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;
                }
            }
             
            $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;
                }
            }
            
            echo '<table>';
            for ($j = 0; $j < count($selected); $j++) {                          
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j]");
                $row_taetid1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                $init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id = $row_taetid1[0]");
                $row_taetid2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $taetigkeit) {
                    echo '<option value="'.$row_taetid1[0].'" selected>'.$row_taetid2[0].'</option>';
                }
                echo '</select></td>';
                
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$j]");
                $row_prodid1 = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                $init_prod = mysqli_query($mysqli, "SELECT produkt FROM produkte WHERE id = $row_prodid1[0]");
                $row_prodid2 = mysqli_fetch_row($init_prod); // produkt aus produkte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $product) {
                    echo '<option value="'.$row_prodid1[0].'" selected>'.$row_prodid2[0].'</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'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                
                [COLOR=royalblue]$hours = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE taetprodid = $selected[$j]");
                $row_time1 = mysqli_fetch_row($hours); // zeit aus zeiten
                $date = mysqli_query($mysqli, "SELECT datum FROM zeiten WHERE taetprodid = $selected[$j]");
                $row_time2 = mysqli_fetch_row($date); // datum-timestamp aus zeiten
                for ($i = 0; $i < 7; $i++) {                  
                    $ts = $row_time2[0];
                    echo ' <td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time1[$i].'" maxlength="6" size="4"></td>';
                }                echo '<td>'.$selected[$j].'</td><br>';
                echo '</table>';
                            
                /*$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."';");
                    }
                }*/      
            }
        }
    }
```






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT]
Folgender Versuch liefert keine Werte in den Feldern:
	
	



```
for ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = '".$selected[$j]."', datum = '".$i."';");
    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
}
```
Dieser kleine Test liefert "nope!":
	
	



```
if (!$hours) {
   echo "nope!<br>";
}
```
$i und $selected[$j] haben aber definitiv die richtigen Werte. Habe ich gerade durch echo Ausgaben für jede Schleifenrunde überprüft.


----------



## boss3D (9. Oktober 2014)

Auf ein anderes Problem bin ich heute beim Testen noch draufgekommen ...
Nachfolgend nochmal der Code von auswerten2.php:


Spoiler





```
<?php
    if (isset($_POST['mitarbeiterdb'])) {
        $user = $_POST['mitarbeiterdb'];
        $ergebnis = mysqli_query($mysqli, "SELECT id FROM user WHERE name='".$user."';");
        $row = mysqli_fetch_object($ergebnis);
        $userid = $row->id;
    }
    
    if (isset($_POST['filter_taetigkeit'])) {
        $taetid = $_POST['filter_taetigkeit'];
    }
    
    if (isset($_POST['filter_product'])) {
        $prodid = $_POST['filter_product'];
    }
    
    if (isset($_POST['filterName'])) { // lese DB-Inhalt für einen bestimmten Mitarbeiter aus (siehe u.id)
        $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;");
    } elseif (isset($_POST['filterTaet'])) { // lese DB-Inhalt für eine bestimmte Tätigkeit aus
        $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 t.id = '".$taetid."' AND pr.taetigkeit = '".$taetid."' AND  z.taetprodid = pr.id AND z.userid = u.id AND p.id = pr.produkt 
                                        ORDER BY
                                            z.datum ASC;");
    } elseif (isset($_POST['filterProd'])) { // lese DB-Inhalt für ein bestimmtes Produkt aus
        $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 p.id = '".$prodid."' AND z.taetprodid = pr.id AND z.userid = u.id  AND p.id = pr.produkt AND t.id = pr.taetigkeit
                                        ORDER BY
                                            z.datum ASC;");
    } if (isset($_POST['kombination'])) { // nach Kombination filtern
        $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.id = '".$userid."' AND pr.taetigkeit = '".$taetid."' AND t.id =  '".$taetid."' AND pr.produkt = '".$prodid."' AND p.id = '".$prodid."'  AND pr.id = z.taetprodid
                                        ORDER BY
                                            z.datum ASC;");
     } elseif (isset($_POST['auswertenall']) or  (!isset($_POST['kombination']) and !isset($_POST['filterProd']) and  !isset($_POST['filterTaet']) and !isset($_POST['filterName']))) { //  lese gesamten DB-Inhalt aus    
        $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 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="12" 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>';
    echo '      <th>ID</th>
                <th>Mitarbeiter</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>
                <th>∑</th>';
    echo '    </tr>';

    $name = array();   
    $row_coll = array();
    $user_table = mysqli_query($mysqli, "SELECT id, name FROM user;");
    $anzahl = mysqli_num_rows($user_table);
    while ($row = mysqli_fetch_assoc($user_table)) {
        if (!isset($row_coll[$row['id']])) {
            $row_coll[$row['id']] = array();
            $row_coll[$row['id']]['id'] = $row['id'];
            $row_coll[$row['id']]['name'] = $row['name'];
        }
    }
    
    $j = 0;    
    foreach ($row_coll as $ma_id => $id) {
        $td = array();
        $td[0] = $row_coll[$ma_id]['id'];
        $td[1] = $row_coll[$ma_id]['name'];
        for ($i = 0; $i < $anzahl; $i++) {
            $name[$j] = $td[$i];
            $j++;
        }
    }  
    $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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[2] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {     
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                /**************/
                [COLOR=darkorchid]for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum = mysqli_fetch_row($time_table);
                    $td[12] = $sum[0];
                }
                echo '  <tr>';   
                /**************/
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';               
                }
                echo '  </tr>';
            }
        }
        /**************/
        [COLOR=royalblue]echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum = mysqli_fetch_row($time_table);
            if (!$sum[0]) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum[0].'</td>';
            }
        }
        echo '  </tr>';        /**************/
    } else {
         echo '  <tr><td colspan="12"  style="text-align:center">Keine Einträge  gefunden.</td></tr>';
    }  
    echo '</table>';

    echo '<br>Alle Einträge anzeigen für folgende(s/n) ...<br>';
    
     echo '<br><input type="submit" style="height:24px;  width:100px" name="filterTaet" value="Tätigkeit >"> ';     
    $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;
        }
    }
    echo '<tr><td><select name="filter_taetigkeit" style="width:210px">';
    foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
    echo '</select></td><br><br>';
        
    echo '<input type="submit" style="height:24px; width:100px" name="filterProd" value="Produkt >"> ';
    $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;
        }
    }
    echo '<td><select name="filter_product" style="width:210px">';
    foreach ($products as $product) {
        echo '<option value="'.$product['id'].'">'.$product['produkt'].'</option>';
    }
    echo '</select></td><br><br>';
    
     echo '<input type="submit" style="height:24px; width:100px"  name="filterName" value="Mitarbeiter >"> <input  name="mitarbeiterdb" type="text" size="30"  maxlength="30"><br><br>';
    echo '<input  type="submit" style="height:24px; width:140px" name="kombination"  value="^^ Kombination"><br><br><br><br>';
    echo '<input type="submit" name="btnOutputCancel" value="Zurück zur Eingabe"><br><br>';
     echo '<input type="submit" name="export" value="Exportiere MySQL  Daten zu Excel File">';
```



Das Violette macht die zeilenweise Stundenberechnung, das Blaue die spaltenweise.

Das  Problem ist jetzt allerdings, dass beide Code-Abschnitte nur das richtige  machen, solange ich den gesamten DB-Inhalt ausgeben lasse. Filtere ich  allerdings einzelne Einträge heraus, stimmt die Spaltenberechnung nicht  mehr. Da bleibt dann weiterhin die von der Gesamttabelle angezeigt. Zur  Verdeutlichung:

Alles (für eine Woche)




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Gefiltert




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^  Dir Ursache des Problems ist nicht schwer zu erkennen: Während ich den  violetten Zeilencode (der die Spalte baut) innerhalb der großen  foreach-Schleife, die sich um das Auslesen der Daten aus dem  $row_collector und dem Aufbau der Ausgabe kümmert, platzieren konnte,  musste ich den blauen Spaltencode (der die Zeile baut) außerhalb davon platzieren, weil ich diese Zeile ja nur 1x will. 
Dadurch  wird jetzt aber die Stundenberechnung nicht dynamisch angepasst, wenn  sich durch eine Filterung plötzlich die Anzahl der Datensätze, und damit  Stunden, verändert.

Hat irgendjemand eine Idee, wie ich das im Code umbauen könnte? 

Ich  habe heute stundenlang versucht, den blauen Code-Teil auch noch  irgendwie in die foreach-Schleife mitreinzunehmen, aber dann habe ich  nach jedem Datensatz eine Ausgabe, und natürlich nie eine  Gesamtstundenbrechnung über alle Datensätze.


----------



## DarkMo (9. Oktober 2014)

wieso so kompliziert? erstell dir doch nen array mit 7 werten für die 7 tage. gibst du beim tabellen aufbau eine zeit aus, wird dieser zeitwert zum array-wert addiert und gut is. man muss nicht zwingend alles per db lösen ^^ grobe vorstellung:


```
sum = array();
for(i=0; i<7; i++) sum[ts[i]] = 0; // initialisieren mit 0, als key wird unser timestamp für den tag benutzt

// tabelle erstellen...
for each(tabellenzeile)
    // projekt-geblubber (tät, prod...)
    row_sum = 0;
    for each(tag-spalte mit dem ts gedingse) {
        if(zeit[ts] > 0) {
            echo <td>zeit[ts]</td>;
            sum[ts] += zeit[ts];
            row_sum += zeit[ts];
        }
    }
    echo <td>row_sum</td>;
}
// edit: die sum ausgabe vergessen ^^
for each(sum-spalte mit dem ts gedingse) {
    if(sum[ts] > 0) {
        echo <td>sum[ts]</td>;
    } else {
        echo leerzelle;
    }
}
```
und wie gesagt: SKIZZIERT ^^

btw: hab grad nich so derb zeit, daher bin ich so still. das bissl was ich hab, zogg ich grad ^^ und ben hilft ja gut aus


----------



## boss3D (10. Oktober 2014)

^^ Ich habe ehrlich gesagt nicht die leiseste Ahnung, wo im Code ich das reinbasteln soll ... 
Und warum musst du immer für alles foreach-Schleifen nehmen? Ich hasse die Dinger so sehr! Funktionieren eh nie so wie sie sollen. Ich nehme immer nur for und while.

Soweit kann ich das ganze jedenfalls in tatsächlichen Code umwandeln ...
	
	



```
$sum = array();
                for ($i = 0; $i < 7; $i++) {
                    $sum[$ts[$i]] = 0; // initialisieren mit 0, als key wird unser timestamp für den tag benutzt
                }
                
                // tabelle erstellen...
                foreach (tabellenzeile) {
                // projekt-geblubber (tät, prod...)
                    $row_sum = 0;
                    foreach (tag-spalte mit dem ts gedingse) {
                        if ($zeit[$ts] > 0) {
                            echo '<td>'.$zeit[$ts].'</td>';
                            $sum[$ts] += $zeit[$ts];
                            $row_sum += $zeit[$ts];
                        }
                    }
                    echo '<td>'.$row_sum.'</td>';
                }
                // edit: die sum ausgabe vergessen ^^
                foreach (sum-spalte mit dem ts gedingse) {
                    if ($sum[$ts] > 0) {
                        echo '<td>'.$sum[$ts].'</td>';
                    } else {
                        echo '<td style="border:none"></td>';
                    }
                }
```
... aber bei deinen foreach-Schleifen steige ich völlig aus.


----------



## BenRo (10. Oktober 2014)

Ohne jetzt DarkMos Ansatz gutheissen zu wollen, so funktioniert foreach:
Die Schleife wird für jedes Element in einem Array ausgeführt:

```
foreach($array as $arrayElement) { ... }
```
Das bedeutet, dass in der Variable arrayElement in jeder Iteration ein anderer Wert steht, nämlich der nächste im Array. Beispiel:

```
$arrayMitZahlen = array(16 => 19, 5 => 8, 13 => 15, 2 => 4, 55 => 76);
foreach($arrayMitZahlen as $zahl) {
   print($zahl.'-');
}
```
Der obige Code zeigt 19-8-15-4-76- an (und nicht, wie man als Einsteiger evtl. meinen könnte 4-8-15-19-76-, die Keys werden nicht umsortiert.)

Wenn man im foreach neben dem Wert auch den Schlüssel des Arrays benötigt, geht das so:

```
$inhaltMeinerMoebel = array();
$inhaltMeinerMoebel['Kommode'] = 'Zeitschriften';
$inhaltMeinerMoebel['Vitrine'] = 'Gläser';
$inhaltMeinerMoebel['Truhe'] = 'Tischdecken';

foreach($array as $schluessel => $wert) {
   print('In '.$schluessel.' steckt '.$wert);
}
```
Möchte man die Abarbeitung von foreach abbrechen, kann man break; benutzen, möchte man zur nächsten Iteration springen continue; (ist in while und for nicht anders):

```
foreach($array as $wert) {
   if(empty($wert)) continue;
   ...
}
```
Wenn for und while klar sind, hilft es dir evtl, wenn ich foreach in for/while ausdrücke:

```
$array = array(16 => 19, 5 => 8, 13 => 15, 2 => 4, 55 => 76);
foreach($array as $value) {
   // ...
}

// entspricht etwa diesem Code hier:

$array = array(16 => 19, 5 => 8, 13 => 15, 2 => 4, 55 => 76);
$arrayWithAscendingKeys = array_values($array);
for($i=0;$i<count($array);$i++) {
   $value = $arrayWithAscendingKeys[$i];
   //..
}

// entspricht etwa diesem Code hier:

$array = array(16 => 19, 5 => 8, 13 => 15, 2 => 4, 55 => 76);
$arrayWithAscendingKeys = array_values($array);
$i = 0;
while($i<count($array)) {
   $value = $arrayWithAscendingKeys[$i];
   //..
   $i++;
}
```
Das Handbuch erklärt das eigentlich alles ganz gut, da stehen dann auch ein paar schicke neue Sachen seit PHP 5.5 drin:
PHP: foreach - Manual

EDIT: Zu deinem ursprünglichen Problem: Ich verstehe das Problem nicht. Lies das doch aus der Datenbank, indem du einfach deinen Filtercode verwendest und zusätzlich von den anderen Spalten SUM(z.zeit) as zeitsumme selektierst (oder ähnlich).


----------



## DOcean (10. Oktober 2014)

erstmal Respekt an alle die hier helfen, wie viel Mannjahre das wohl schon sind 

du solltest unbedingt mit foreach Schleifen arbeiten, ich nutze die auch oft bei C#...

-> es verbessert die Lesbarkeit deutlich (kein Frage wie weit, oder wie der Zähler erhöht wird oder ob bei 0 oder 1 gestartet wird)
-> innerhalb der Schleife hab nur noch foo und nicht bar_ vereinfacht auch das Lesen

klar geht alles mit for oder while oder do/while aber um einfach nur durch eine Liste zu laugen ist foreach ideal_


----------



## boss3D (10. Oktober 2014)

^^ Wie die foreach-Schleife grundsätzlich funktioniert, habe ich mir schon irgendwann im Juli(?) zusammengegoogelt. Trotzdem danke für die Erklärung!

Mein Problem damit ist, dass ich bei meinen konkreten mir im Code zur Verfügung stehenden Variablen, Feldern, etc. nicht weiß, was genau ich da wie in den Schleifenkopf einsetzen sollte. Allerdings vermute ich, dass ich mir da bei DarkMo's Ansatz gar nichts neues überlegen sollte, sondern er eigentlich an eine Weiterverwendung der bereits vorhanden Schleifen vom $row_collector gedacht hat?! Dass ich quasi seinen Mini-Code rund um den $row_collector herumbastlen sollte?! Jedenfalls verstehe ich so seinen sehr frei interpretierbaren Kommentar: // projekt-geblubber (tät, prod...) (--> dass das der $row_collector sein soll?!) 

 So oder so wird mir sein Ansatz nicht klar. Ich würde auch lieber bei  meinem eigenen bleiben, allerdings komme ich auch nicht ganz mit, was  du, BenRo, mit deinem EDIT meinst. Soll ich nur folgenden Code behalten  und da was zusätzliches im query hinzufügen? Was meinst du mit "anderen Spalten"? Es gibt die MO-, DI-, MI-, ... Spalten, und es hängen immer Zeit und Datum zusammen. 

```
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum = mysqli_fetch_row($time_table);
                    $td[12] = $sum[0];
                }
                echo '  <tr>';
```
BTW komme ich von C. foreach habe ich erst später in Java kennen gelernt. Da ich Java aber nie mochte (und auch nie für was brauchen konnte), habe ich sie mir nie angewohnt.


----------



## BenRo (10. Oktober 2014)

Ja, ich würde den Query anpassen, wenn gefiltert wird.


----------



## boss3D (10. Oktober 2014)

^^ Sowas ähnliches hatte ich gestern schon versucht, allerdings nicht den einen query anzupassen, sondern beide queries in die selbe Schleife reinzunehmen.  Der Schleifenkopf ist ja der selbe bei meinen beiden ...

Sähe dann so aus:

```
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
    $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
    $sum1 = mysqli_fetch_row($time_table1);
    $sum2 = mysqli_fetch_row($time_table2);
    $td[12] = $sum1[0];
    if (!$sum2[0]) {
        echo '    <td style="border:none"></td>';
    } else {
        echo '    <td>'.$sum[0].'</td>';
    }
}
```
Das Problem dabei ist allerdings die übergeordnete foreach-Schleife in der "alles" drinnensteckt. Dann kriege ich nämlich dadurch nach jedem einzelnen Datensatz eine Zeit-Zeile, und nicht erst ganz zum Schluss nach der Tabelle.


Spoiler





```
[COLOR=red]foreach ($row_collector as $taet_id => $teat) {            $td = array();
            $td[2] = $row_collector[$taet_id]['taet'];           
            [COLOR=red]foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {                     $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                /**************/
                [COLOR=royalblue]for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum = mysqli_fetch_row($time_table);
                    $td[12] = $sum[0];
                }                /**************/
                echo '  <tr>';   
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';               
                }
                echo '  </tr>';
            }
        }
        /**************/
        [COLOR=royalblue]echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum = mysqli_fetch_row($time_table);
            if (!$sum[0]) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum2[0].'</td>';
            }
        }
        echo '  </tr>';        /**************/
    }
```




[EDIT]
Ich glaube, jetzt checke ich langsam, was du meinst ...

So in die Richtung --> if (isset($_POST['einerDerDreiFilter'])) { auswerten2.php neu aufbauen* } 
* damit der $row_collector mit den neuen (= weniger) Datensätzen angefüllt und somit die nun vorhanden Stunden neu zusammengezählt werden.

Aber auch das hatte ich schon probiert, hat gar nicht geklappt.


----------



## boss3D (10. Oktober 2014)

Wenn ich es so mache, dann nimmt er offenbar nur 7x den letzten Wert, also von SO, her:
	
	



```
/**************/
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                    $sum2 = mysqli_fetch_row($time_table2);
                    $td[12] = $sum1[0];
                }
                /**************/
                echo '  <tr>';   
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';               
                }
                echo '  </tr>';
            }
        }
        /**************/
        echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            //$time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            //$sum = mysqli_fetch_row($time_table);
            if (!$sum2[0]) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum2[0].'</td>';
            }
        }
        echo '  </tr>';
        /**************/
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT]
So käme ich dem ganzen am nächsten:
	
	



```
/**************/
                echo '  <tr>';
                echo '    <td>∑</td>';
                echo '    <td style="border:none"></td>';
                echo '    <td style="border:none"></td>';
                echo '    <td style="border:none"></td>';
                echo '    <td style="border:none"></td>';
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                    $sum2 = mysqli_fetch_row($time_table2);
                    $td[12] = $sum1[0];
                    if (!$sum2[0]) {
                        echo '    <td style="border:none"></td>';
                    } else {
                        echo '    <td>'.$sum2[0].'</td>';
                    }
                }
                echo '  </tr>';
                /**************/
```
Aber dann habe ich die Berechnugsergebnisse über jedem Datensatz in der Anzahl der Datensätze ausgegeben, nicht nur 1x unter allen.


----------



## BenRo (10. Oktober 2014)

Die Schleife ist schon Unsinn, wenn man doch sowas schönes machen kann:

```
[URL="http://kathi/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.5%2Fen%2Fselect.html&token=b8600cbff5d13036f20ce197026015b2"]SELECT[/URL] [URL="http://kathi/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.5%2Fen%2Fgroup-by-functions.html%23function_sum&token=b8600cbff5d13036f20ce197026015b2"]SUM[/URL]( zeit ) AS zeitsumme, datum
FROM zeiten
GROUP  BY datum
```

EDIT: Dann könnte man noch mit einem WHERE das eingrenzen, sodass nur Daten aus dieser Woche verwendet werden.


----------



## boss3D (10. Oktober 2014)

^^ Genau das mache ich doch in meinen queries (nur dass ich keinen AS Name vergebe)?! Und die Schleife ist dafür, dass ich das zweite query für jeden Wochentag durchführen kann ...
Er macht ja jetzt auch das richtige, allerdings hängt das eben in der übergeordneten foreach-Schleife drinnen, die bei 3 Datensätzen 3x durchläuft, und dadurch bekomme halt ich meine Zeile mit den SUM-Ergebnissen auch 3x ausgegeben. Jeweils über einem Datensatz.

Das "über" kommt daher, dass ich die eigentliche Ausgabeschleife unter dem geposteten Code-Schnipsel haben muss, weil dort ja $td[12] verwendet wird, das aber vorher noch durch $sum1 einen Wert erhalten muss.

Die for-Schleife mit den "$wochentag" ist jedenfalls nicht das Problem. Ich müsste es nur irgendwie schaffen, dass das 1x ausgeführt wird und nicht in der Anzahl der auszugebenden Datensätze. Und dann halt noch unter den Datensätzen und nicht darüber.


----------



## BenRo (10. Oktober 2014)

Das GROUP BY ist der entscheidende Unterschied.
Damit muss du nicht 7mal die Datenbank anquerien sondern nur einmal.


----------



## Rho (10. Oktober 2014)

DB-Queries in Schleifen sind immer eine sehr gute Idee. Quasi ne Arbeitsbeschaffungsmaßname für Datenbanken.


----------



## boss3D (10. Oktober 2014)

BenRo schrieb:


> Das GROUP BY ist der entscheidende Unterschied.
> Damit muss du nicht 7mal die Datenbank anquerien sondern nur einmal.


Okay, aber das ändert ja an meinem jetzigen Problem nichts. Habe ich 3 Datensätze, kriege ich 3x meine Zeitberechnugszeile ausgegeben, völlig unabhängig von den 7 Wochentagen.
DAS müsste gelöst werden.

Das liegt an der übergeordneten foreach-Schleife, deren Durchlaufanzahl die Anzahl der auszugebenden Datensätze ist. Ich kann meinen Zeitberechnungscode aber nicht einfach außerhalb hinbasteln, was ich ja bis heute Morgen noch hatte, weil der dann bei veränderter Ausgabe nicht dynamisch neu berechnet wird.


----------



## BenRo (10. Oktober 2014)

Na, dann nimms doch einfach aus dem foreach raus. Stells davor oder danach oder sonstwohin.

Edit: Du musst ja auch nicht alles immer sobald es berechnet ist per echo ausgeben. Kannst ja auch Dinge einer Variable zuweisen und dann einmalig ausgeben.


```
$test = '<p>Diese Variable enthält ein HTML-Fragment und darin Text, der beschreibt, was diese Variable enthält.</p>';
// Hier passieren viele Dinge
echo $test;
```


----------



## boss3D (10. Oktober 2014)

BenRo schrieb:


> Na, dann nimms doch einfach aus dem foreach raus. Stells davor oder danach oder sonstwohin.





boss3D schrieb:


> Das liegt an der übergeordneten foreach-Schleife,  deren Durchlaufanzahl die Anzahl der auszugebenden Datensätze ist. *Ich  kann meinen Zeitberechnungscode aber nicht einfach außerhalb  hinbasteln, was ich ja bis heute Morgen noch hatte, weil der dann bei  veränderter Ausgabe nicht dynamisch neu berechnet wird.*


 .....


----------



## DOcean (10. Oktober 2014)

wenn die Summe x mal ausgegebn wird dann gib die Summe doch einfach nur aus wenn du im letzten Durchlauf bist...

if(letzterDurchlauf)
{
  echo 'Summe';
}


----------



## boss3D (10. Oktober 2014)

^^ Das habe ich alles gestern selber schon probiert, aber so einfach klappt das nicht ...

BenRo's Idee würde im Code so ausschauen:



Spoiler





```
/**************/              
                $tmp = 0;
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                    $sum2 = mysqli_fetch_row($time_table2);
                    $tmp = $sum2[0];
                    $td[12] = $sum1[0];
                    
                }              
                /**************/
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                echo '  </tr>';
            }            
        }
        echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        if (!$sum2[0]) {
            echo '    <td style="border:none"></td>';
        } else {
            echo '    <td>'.$tmp.'</td>';
        }
        echo '  </tr>';
```



Ergebnis: 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Und bei dem Ansatz mit der letzten Schleifenrunder habe ich gestern gar keine Ausgabe für diese eine Zeile gekriegt, obwohl der Variableninhalt gestimmt hätte. Aber das schaue ich mir jetzt trotzdem nochmal an.

[EDIT]
Okay, jetzt hat's zur Abwechslung doch mal geklappt:


Spoiler





```
[COLOR=royalblue]$tmp1 = 0;       
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[2] = $row_collector[$taet_id]['taet'];           
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                [COLOR=royalblue]$tmp1++;     
                $tmp2 = count($row_collector[$taet_id]['data']);                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                /**************/
                [COLOR=royalblue]if ($tmp1 == $tmp2) {                    echo '  <tr>';
                    echo '    <td>∑</td>';
                    echo '    <td style="border:none"></td>';
                    echo '    <td style="border:none"></td>';
                    echo '    <td style="border:none"></td>';
                    echo '    <td style="border:none"></td>';
                    for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                        $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                        $sum1 = mysqli_fetch_row($time_table1);
                        $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                        $sum2 = mysqli_fetch_row($time_table2);
                        [COLOR=darkorchid]$td[12] = $sum1[0];                        if (!$sum2[0]) {
                            echo '    <td style="border:none"></td>';
                        } else {
                            echo '    <td>'.$sum2[0].'</td>';
                        }
                    }
                    echo '  </tr>';
                [COLOR=royalblue]}                /**************/
                echo '  <tr>';
                [COLOR=darkorchid]for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }                echo '  </tr>';
            }
        }
```



Allerdings habe ich die eine Zeile immer noch über allen Datensätzen (also, nur über dem obersten). Jetzt nur noch einen Weg finden, wie ich sie darunter anhängen kann ...
Das Problem dafür sind die violetten Teile, die in der jetzigen Reihenfolge stattfinden müssen.

[EDIT2]
So, jetzt habe ich das komplett richtig. 


Spoiler





```
$tmp1 = 0;       
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[2] = $row_collector[$taet_id]['taet'];
            $tmp1++;
            $tmp2 = count($row_collector);
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';
                if ($tmp1 == $tmp2) {
                    echo '  <tr>';
                    echo '    <td>∑</td>';
                    echo '    <td style="border:none"></td>';
                    echo '    <td style="border:none"></td>';
                    echo '    <td style="border:none"></td>';
                    echo '    <td style="border:none"></td>';
                    for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                        $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                        $sum2 = mysqli_fetch_row($time_table2);
                        if (!$sum2[0]) {
                            echo '    <td style="border:none"></td>';
                        } else {
                            echo '    <td>'.$sum2[0].'</td>';
                        }
                    }
                    echo '  </tr>';
                }             
            }
        }
```


----------



## boss3D (10. Oktober 2014)

Damit bleibt jetzt vorerst nur noch eine einzige allerletzte Aufgabe, dann wäre das Projekt abgeschlossen.

Und zwar die Editier-Funktion, an der ich in den letzten Tagen wieder gearbeitet hatte ...
Der aktuelle Stand sieht wie folgt aus:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Der Code dazu:



Spoiler





```
echo '<table>';
    if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $a = count($selected); // Anzahl der Zeilen
            
            $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;
                }
            }
             
            $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;
                }
            }
            
            for ($j = 0; $j < count($selected); $j++) {                          
                [COLOR=royalblue]$taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j]");
                $row_taetid1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                $init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id = $row_taetid1[0]");
                $row_taetid2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $taetigkeit) {
                    echo '<option value="'.$row_taetid1[0].'" selected>'.$row_taetid2[0].'</option>';
                }
                echo '</select></td>';
                
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$j]");
                $row_prodid1 = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                $init_prod = mysqli_query($mysqli, "SELECT produkt FROM produkte WHERE id = $row_prodid1[0]");
                $row_prodid2 = mysqli_fetch_row($init_prod); // produkt aus produkte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $product) {
                    echo '<option value="'.$row_prodid1[0].'" selected>'.$row_prodid2[0].'</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'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                
                [COLOR=royalblue]for ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
                    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = '".$selected[$j]."', datum = '".$i."';");
                    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
                    if (!$hours) {
                        echo "nope!<br>";
                    }
                    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
                }                echo '<td>'.$selected[$j].'</td><br>';
                            
                /*$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."';");
                    }
                }*/      
            }
        }
    }
    echo '</table>';
```



Die beiden Probleme damit sind, dass zwar beim Vorbelegen der Dropdowns das richtige Produkt bzw. die richtige Tätigkeit ausgewählt zu werden scheint, aber leider bestehen die gesamten Dropdowns nur aus diesem einen Produkt bzw. dieser einen Tätigkeit.
Und bei den Stunden jedes Tages kriege ich keine Ausgabe, was irgendwie schon am query scheitern dürfte, weil das "nope!" ausgegeben wird.



BTW, die Idee wäre: Erstmal den Code für diese dynamische Zeile zu haben, die Daten eines ausgewählten Datensatzes aus der DB holt und sich damit vorbelegt. Sobald das steht, wäre dann zu überlegen, wie und vor allem wo der Code in auswerten.php einzubauen ist. Mit etwas Glück brauchen wir etwa die Hälfte von dem gespoilerten Code hier dann am Ende gar nicht (nochmal), weil ja Teile davon schon in auswerten.php vorhanden sind.


----------



## DarkMo (10. Oktober 2014)

DarkMo schrieb:


> wieso so kompliziert? erstell dir doch nen array mit 7 werten für die 7 tage. gibst du beim tabellen aufbau eine zeit aus, wird dieser zeitwert zum array-wert addiert und gut is. man muss nicht zwingend alles per db lösen ^^ grobe vorstellung:
> 
> 
> ```
> ...


 ich weis nich, wie ichs blinkend hinbekomm ^^ nimm doch nich immer alles so wörtlich >< stell dir vor, einer haut den spruch raus "schei** die wand an!" - ungut, wenn man sich das zu herzen nimmt oder? 

foreach nahm ich in dem bsp (es ist schlicht ein algorythmusentwurf, es soll völlig losgelöst von irgendeiner sprache sein) einfach nur, weil es vom lesen her gut verständlich ist. for each (zeile) wird wohl bedeuten, dass ich hier IRGENDEINE schleife meine, die das folgende für jede zeile macht. nicht mehr, und nicht weniger.

und das ganze würde in deinem code dieser zeile entsprechen:
foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {

davor irgendwo (wenn ich mich nich irre noch vor die ganz äussere foreach für die tätigkeiten) solltest du ein array, dass die einzelnen summen annimmt und aufaddiert erstellen und mit 0 initialisieren. da ich den code nich auf die schnelle hatte, hatte ich gehofft, dass du mit ts (welche wir für die wochentage nehmen) was anfangen kannst und weist, was ich meine ^^ explizit hätte ich sowas hier gemeint:

```
$sum = array();
for ($i = 0; $i < 7; $i++) {
  $ts = $wochenanfang + ($i * 60 * 60 * 24);
  $sum[$ts] = 0;
}
```
dann eben rein in die schleife, dort wird dann irgendwann unser kram ausgegeben, bzw in das $td array geschrieben (hier hatte ich noch die variable $row_sum angelegt). hier eben zuerst das "projekt geblubber" (was uns hier nich interessiert) und danach die einzelnen tage. DAS hier:

```
[COLOR=red]$row_sum = 0;                [COLOR=lime]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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                        [COLOR=red]$sum[$ts] += $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                        $row_sum += $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];                    } else {
                        $td[$i+5] = ' ';
                    }
                }
```
rot markiert die ergänzungen, die ich meinte. grün markiert ist im übrigen die entsprechung zu "for each(tag-spalte mit dem ts gedingse) {"  du siehst, obwohl ich for each schrieb, meinte ich einfach nur eine schleife, die sich um die werte der tage kümmert. eben eine irgendwie geartete schleife die was mit unserem $ts zu schaffen hat.

am ende wird dann noch besagte row_sum ausgegeben. ich hatte bei dem algorythmus natürlich nicht beachtet, dass wir werterfassung und ausgabe getrennt hatten ^^ aber gemeint wäre das hier gewesen:

```
for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }
                [COLOR=red]echo '    <td>'.$row_sum.'</td>';                echo '  </tr>';
```
also halt ganz normal wie immer das gelumbe ausgeben und am ende die summe für die zeile. und dann mit dem edit meinte ich eben, dass NACH der normalen tabellen malerei (also alle db-ausgelesenen spalten wurden gebaut) nochmal die eine zeile mit den tages-summen ausgegeben wird. sonen code hattest doch glaube sogar schon oder? *nachgugg* ahja, das hier (dein blau markiertes):

```
echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            $time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum = mysqli_fetch_row($time_table);
            if (!$sum[0]) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum[0].'</td>';
            }
        }
        echo '  </tr>';
```
würde nach meiner idee halt so aussehen:

```
echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ([COLOR=red]$i = 0; $i < 7; $i++) {
            [COLOR=red]$ts = $wochenanfang + ($i * 60 * 60 * 24);            if ($sum[$ts] == 0) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum[$ts].'</td>';
            }
        }
        echo '  </tr>';
```
fertig ^^ das wäre meine idee auf die schnelle gewesen. aber im bett später kam mir auch in etwa der selbe gedanke, den ben wohl ansprach. also es doch mittels db-anfrage zu machen. da hab ich grad einen verdacht...

das hier im blau markierten war deine anfrage für die summe der zeiten der wochentage, wenn ichs richtig seh:
$time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
um deine ausgabe zu generieren, nutzt du aber so einen von großen anfrage-strings. mit sehr viel mehr bedingungen im WHERE teil  wenn die nicht zueinander passen, dann können natürlich auch die ergebnisse nicht zueinander passen. zum bsp deine mitarbeiter-abfrage (der erste große dingens im code) müsste für die summe dann so aussehen:
$time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."' AND userid = '".$userid."';");
wenn der part fehlt, kann die db natürlich nich die richtigen daten zusammen suchen. ich weis jetz nich, ob du die variable $userid hast, wenn nich, müsstest du wieder über 2 tabellen abfragen, oder sie (also die variable $userid) dort mit auslesen (und erstellen), wo du $user erstellst (wenn es dort geht, sollte eigentlich). ansonsten könnte es auch so aussehen:
$time_table = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten AS z, user AS u WHERE z.datum = '".$wochentag."' AND u.user = '".$user."' AND z.userid = u.id;");

so könnt es funktionieren. für die anderen fälle bräuchtest du dann natürlich auch wieder andere (anders bedingte) summen-abfragen.


----------



## boss3D (10. Oktober 2014)

Okay, jetzt ist klar, was du meintest. Übrigens hatte ich mich noch gewundert, warum du "for each" schreibst, und da es sich ja nur um Pseudocode handelte, nahm ich an, dass das "schlampigkeitshalber" war, du aber ne foreach-Schleife gemeint hattest ... 

Jedenfalls, wie du in #768 im EDIT2 siehst, konnte ich das selbst noch lösen. Jetzt ginge es nur mehr um das Editieren von Einträgen --> #769


----------



## DarkMo (10. Oktober 2014)

wenn ich lange texte schreibe, hast du das gefälligst vorherzusehen mit einer glaskugel vom letzten weihnachtsbaum und nichts zu machen!  ^^

editieren... das wird sicher auch nich so leicht :/


----------



## boss3D (10. Oktober 2014)

^^ Ich stell's mir gar nicht kompliziert vor. Zuerst mal "irgendwo" (bei mir derzeit in formular.php, wo eben der Button abgefragt wird) einfach nur eine dynamisch vorbelegte Zeile basteln. Und dann im zweiten Schritt diese in projektzeiterfassung.php einfügen, sodass die gegebenenfalls am Anfang der Eingabemaske als erste Zeile erscheint. Der Editier-Button muss halt dann dafür sorgen, dass aus auswerten.php zurück zu projektzeiterfassung.php gesprungen wird.

Und ich bin ja auch nicht mehr weit weg. Bei den Dropdowns habe ich einen Indexfehler in irgendeinem Array (das wirst du bei "deinen" foreach-Schleifen eher sehen als ich, wo der liegt), und bei Zeiten mag er das query aus irgendeinem Grund nicht. Wobei sich da taetprodid und datum im WHERE spießen dürften. Nehme ich eines von beiden raus, kriege ich sofort wieder Werte, wenn auch nicht die richtigen bzw. nicht an der richtigen Stelle ...


----------



## boss3D (13. Oktober 2014)

Ich habe wieder mal ein foreach-Problem (), aber zuvor kurz zum Stand: Es geht nur noch um die Editier-Funktion, und dafür habe ich noch genau 6 Tage (inkl. heute).

So, nachdem ich bei meinem letzten Versuch "gegen die Wand geknallt" bin und mir nichts mehr eingefallen ist, was ich noch probieren könnte, habe ich mir heute gedacht, ich probiere mal, in einem kleinen test-file einfach nur ein simples Dropdown zu basteln und darin zu versuchen, ein bestimmtes Element als vorbeleg-Wert auszuwählen. Hat soweit auch super geklappt:

```
<?php
    echo 'Dropdown<br><br>';
    
    $content = array("BMW", "Mercedes", "Audi");
    
    echo '<select>';
    for ($i = 0; $i < count($content); $i++) {
        if ($content[$i] == $content[1]) {
            echo '<option value="'.$content[$i].'" selected>'.$content[$i].'</option>';
        } else {
            echo '<option value="'.$content[$i].'">'.$content[$i].'</option>';
        }
    }
    echo '</select>';
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Und nachdem ich das eigentlich simple Prinzip durchschaut hatte, wollte ich genau das dann auch in meinem großen Projekt umsetzen. Sollte dort dann (jetzt mal nur für die Tätigkeiten) so aussehen:
	
	



```
$taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j]");
$row_taet1 = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
$init_taet = mysqli_query($mysqli, "SELECT taetigkeit FROM taetigkeiten WHERE id = $row_taet1[0]");
$row_taet2 = mysqli_fetch_row($init_taet); // taetigkeit aus taetigkeiten
echo '<tr><td><select name="taetigkeit'.$a.'">';
foreach ($taetigkeiten as $taetigkeit) { 
    if ($taetigkeit == $row_taet2[0]) {
       echo '<option value="'.$taetigkeit['id'].'" selected>'.$taetigkeit['taetigkeit'].'</option>';
    } else {
       echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
    }
}
echo '</select></td>';
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Funktioniert nicht, es bleibt einfach das erste Element ausgewählt. Wenn ich mir nun testweise den Inhalt von $row_taet2[0] ausgeben lasse, ist da allerdings völlig korrekt der Name der zum Editieren selektierten Tätigkeit drinnen. So weit, so gut.

Dann hapert's allerdings. Meine if-Abfrage in der Schleife dürfte so nicht stimmen?! Aber ich kenne mich halt bei dem foreach-Zeugs nicht so recht aus, was genau da jetzt in "$taetigkeiten" steckt, und was in "$taetigkeit" ... 
Ersteres ist das gesamte Feld, letzteres das für jede Schleifenrunde jeweilige Element, hätte ich mir gedacht?!
Was ich vorhabe, dürfte ja schon nach dem Mini-Beispiel von oben ersichtlich sein: Im if soll der Name der ausgewählten Tätigkeit mit sämtlichen anderen Tätigkeits-Namen aus dem Feld verglichen werden, bis es eine Übereinstimmung gibt. Mit ner for-Schleife wüsste ich sofort, wie das umzusetzen wäre, aber bei dem foreach-Zeugs???

Ich habe btw schon probiert, das in ne for-Schleife umzuschreiben, aber dann passt wieder bei den ganzen Indexen in den echos nichts, die ja auf die foreach ausgelegt sind ... _*seufz*

_[EDIT]
So klappt's auch nicht:
	
	



```
if ($taetigkeit['taetigkeit'] == $row_taet2[0]) {
```
[EDIT2]
Das "witzig" ist ja, in meinem kleinen test-file würd's schon so funktionieren:
	
	



```
<?php
    echo 'Dropdown<br><br>';
    
    $content = array("BMW", "Mercedes", "Audi");
    
    echo '<select>';
    /*for ($i = 0; $i < count($content); $i++) {
        if ($content[$i] == $content[1]) {
            echo '<option value="'.$content[$i].'" selected>'.$content[$i].'</option>';
        } else {
            echo '<option value="'.$content[$i].'">'.$content[$i].'</option>';
        }
    }*/
    foreach ($content as $con) {
        if ($con == $content[1]) {
            echo '<option value="'.$con.'" selected>'.$con.'</option>';
        } else {
            echo '<option value="'.$con.'">'.$con.'</option>';
        }
    }
    echo '</select>';
```
^^ Liefert auch wieder "Mercedes" als vorselektiertes Element. Warum klappt das selbe Prinzip also in meinem großen Projekt nicht???


----------



## DarkMo (13. Oktober 2014)

geh doch bei sowas über den key. also eben nicht _foreach ($content as $con) {_ sondern _foreach ($content as *$key =>* $con) {_. dann kannste auch sehr schön in der if nach dem key fragen: i_f ($key == 1) {_ - fertig. und du wirst eh den key benötigen, da er bei deinen tätigkeiten die id aus der db sein sollte. die einzelnen options sollten dann nämlich schlauer weise SO aussehen: _echo '<option value="'.*$key*.'" selected>'.$con.'</option>';_ (bzw eben ohne selected).


edit: bissl weiterführend... anstelle von $con könntest du bspw auch $content[$key] schreiben. was auch sehr nützlich is (hier in dem bsp glaube nich so), wenn du mehrere arrays mit selber key-struktur aber anderen werten hast (zum bsp eine zeile hat immer den "key" der zeilennummer. bsp: _echo '<tr><td><select name="taetigkeit'.$a.'">';_ das ding da meine ich. das wäre für tätigkeit, produkt usw usf immer gleich), dann kannst du ein array davon in der schleife durchiterieren, aber alle anderen arrays ebenso korrekt auslesen. als bsp:

```
// 3 arrays mit den selben keys
$a = array(0 => 'mercedes', 1 => 'bmw', 2 => 'audi');
$b = array(0 => 'e500', 1 => '3er', 2 => 'A6');
$c = array(0 => 'sli', 1 => '5er', 2 => 'A1');

// jetzt alles nebeneinander ausgeben, dabei nur EINE schleife nutzen:
foreach($a as $key => $content)
  echo $content.' | '.$b[$key].' | '.$c[$key].'<br>';
```


----------



## boss3D (13. Oktober 2014)

Okay, so kommen wir dem ganzen schon sehr nahe ...
	
	



```
$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'.$a.'">';
foreach ($taetigkeiten as $key => $taetigkeit) {
    if ($key == $row_taet[0]) {
       echo '<option value="'.$key.'" selected>'.$taetigkeit['taetigkeit'].'</option>';
    } else {
       echo '<option value="'.$key.'">'.$taetigkeit['taetigkeit'].'</option>';
    }
}
echo '</select></td>';
```
Lediglich eines durchschaue ich noch nicht:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Das ist zwar jetzt durch die Zensur schwer zu erkennen, aber $key ist offenbar immer 1 Index zu hoch. Jedenfalls erhalte ich jetzt immer die eine Tätigkeit nach der gewünschten als die vorselektierte. Fangen im Bsp am Screenshot halt blöderweise beide mit Pr... an, aber es sollte die VOR der blau markierten sein.

[EDIT]
Ich glaube, ich hab's schon durchschaut. $key sind die Feldindexe, die bekanntlich bei 0 beginnen. Die IDs unserer Tätigkeiten beginnen in der DB aber von 1 weg hoch zu zählen. Daher entspricht $key=0 also $id=1.

Und somit muss es wie folgt ausschauen:
	
	



```
if ($key == $row_taet[0]-1) {
```
Damit kriege ich jetzt sowohl bei den Tätigkeiten als auch bei den Produkten die jeweils richtige vorselektiert. 
------------

Womit jetzt nur noch die Zeiten blieben. So funktioniert's bei denen jedenfalls NICHT:
	
	



```
for ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
                    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = $selected[$j], datum = $i;");
                    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
                    if (!$hours) {
                        echo "nope!<br>";
                    }
                    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
                }
```
^^ Da kommt keine Ausgabe.


----------



## DarkMo (13. Oktober 2014)

die frage hierbei wäre: wie baust du dein $teatigkeiten array auf? das müsste (skizziert ) in etwa so aussehen:

```
select * from tätigkeiten;
$teatigkeiten = array();
while(row...)
  $teatigkeiten[$row['id']] = $row['name'];
```

dann verhaspelst du dich auch nicht mit nem array-index (der ohne besondere angaben bei ner 0 beginnt) und ner db-id (die bei 1 beginnt). zudemm muss das eh synchron sein. wenn in der db an 3. stelle die id 5 steht (weil schon was gelöscht wurde), dann muss das auch im array so passen. da muss dann auch der 3. index (key) die 5 sein, und nicht die 3 (oder gar 2).


----------



## boss3D (13. Oktober 2014)

^^ Siehe mein EDIT. 

Weiter geht's mit den Zeiten ...

Siehst du den Fehler? 
Eigentlich erscheint mir das subjektiv ganz korrekt: Ich habe ne Schleife, die für jeden einzelnen Wochentag die Zeit und das Datum aus der DB holt, wo die taetprodid zum Index des Projektes passt und der timestamp dem aktuellen Wochentag entspricht. Datum verwende ich dann weiter, um dem input-Feld den richtigen Namen* geben zu können, und die Zeit natürlich, um ausgegeben zu werden.
_(* bei dem Teil bin ich mir allerdings nicht ganz sicher)_


----------



## DarkMo (13. Oktober 2014)

wegen deinem edit und den row... -1. das ist halt nur die halbe wahrheit.
"wenn in der db an 3. stelle die id 5 steht (weil schon was gelöscht wurde), dann muss das auch im array so passen."

du musst dein array mit den indexen aus der db als keys erstellen. was anderes bringt nur blödsinn hervor.


edit: btw, hast du das wieder in nem seperaten file?


----------



## boss3D (13. Oktober 2014)

So einfach wie von dir "skizziert", klappt das aber leider nicht:
	
	



```
$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;
       $teatigkeiten[$row_t['id']] = $row_t['name'];
    }
}
```
@ edit
Ne, ist alles in formular.php


Spoiler





```
echo '<table>';
    if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $a = count($selected); // Anzahl der Zeilen
            
            $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;
                    $teatigkeiten[$row_t['id']] = $row_t['name'];
                }
            }
             
            $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;
                }
            }
            
            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'.$a.'">';
                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'.$a.'">';
                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'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                
                for ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
                    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = $selected[$j], datum = $i;");
                    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
                    if (!$hours) {
                        echo "nope!<br>";
                    }
                    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
                }
                echo '<td>'.$selected[$j].'</td><br>';
                            
                /*$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."';");
                    }
                }*/      
            }
        }
    }
    echo '</table>';
```



Aber wir werden uns nachher beim Integrieren in projetzeiterfassung.php eine ganze Menge von dem Code sparen können, weil vieles davon in letztgenanntem File schon vorhanden ist.


----------



## DarkMo (13. Oktober 2014)

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).


----------



## boss3D (13. Oktober 2014)

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) ...
	
	



```
$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) ...
	
	



```
$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.


----------



## boss3D (13. Oktober 2014)

Funktioniert einwandfrei und hat mich jetzt keine 3 Minuten gekostet:


Spoiler





```
<?php        
    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>';
    
    $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;
        }
    }
    
    $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;
        }
    }
    
    /*************/
    [COLOR=royalblue]if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $a = count($selected); // Anzahl der Zeilen
    
            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'.$a.'">';
                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'.$a.'">';
                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'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                
                for ($i = $wochenanfang; $i <= $wochenende; $i += 86400) {
                    $hours = mysqli_query($mysqli, "SELECT zeit, datum FROM zeiten WHERE taetprodid = $selected[$j], datum = $i;");
                    $ts = mysqli_fetch_row($hours); // zeit und datum aus zeiten
                    if (!$hours) {
                        echo "nope!<br>";
                    }
                    echo ' <td><input type="text" name="'.$ts['datum'].'_'.$a.'" value="'.$ts['zeit'].'" maxlength="6" size="4"></td>';
                }
                echo '<td>'.$selected[$j].'</td><br>';
            }
        }
    }    /*************/
      
    for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $taetigkeit) {
            echo '<option value="'.$taetigkeit['id'].'">'.$taetigkeit['taetigkeit'].'</option>';
        }
        echo '</select></td>';

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

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

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
        }
    } 
    echo '</table><br>';

    echo '<div class="submit">';
    echo '  <input type="submit" style="height:24px; width:130px" name="addLine" value="+ Zeile hinzufügen">';
    echo '  <input type="submit" style="height:24px; width:130px" name="remLine" value="- Zeile entfernen">';
    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 ...</div>';

    echo '<br><br><br>';
    echo '<div class="submit">';
    echo 'Einträge anzeigen ...';
    echo '  <input type="submit" style="height:24px; width:65px" name="auswerten" value="eigene">';
    if ($rechte == 0) {
        echo '  <input type="submit" style="height:24px; width:65px" name="auswertenall" value="alle"> ';
    }
```



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?!):




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



In formular.php brauche ich vorerst nicht mehr als das:
	
	



```
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 ...


----------



## boss3D (14. Oktober 2014)

Kann mir bitte wer verraten, warum folgendes INSERT-query leer ist?

```
$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:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Und alle 5 Variablen beinhalten korrekte Werte, wie ich bereits durch echo-Ausgaben überprüft habe. Nachfolgend der Gesamtcode:


Spoiler





```
<?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 ...

```
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>';
                }
```



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ 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.

[EDIT3]
YES! Hab's hingekriegt.  
taetprodid als zweites Identifikations-Merkmal ... jetzt klappt's wunderbar!




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## boss3D (14. Oktober 2014)

@ 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?


----------



## BenRo (14. Oktober 2014)

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.


----------



## boss3D (14. Oktober 2014)

BenRo schrieb:


> 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?


BenRo schrieb:


> 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.


----------



## BenRo (14. Oktober 2014)

Naja, halt prüfen, ob der hinzufügen oder der entfernen Button gedrückt wurde und wenn ja den Wert, der im Feld stand wieder reinschreiben:

```
/* Ganz primitives Codebeispiel */

$fuelleFelderAus = false;
if(isset($_POST['zeilehinzufuegen']) || isset($_POST['zeileentfernen'])) $fuelleFelderAus = true;

/* ... */

print('<input type="text"');
if($fuelleFelderAus && isset($_POST['beschreibung['.$i.']'])) print(' value="'.htmlspecialchars($_POST['beschreibung['.$i.']']).'"');
print('>');
```
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.


----------



## boss3D (14. Oktober 2014)

^^ 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:

```
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.


----------



## boss3D (15. Oktober 2014)

Kann irgendwer hierin Syntaxfehler erkennen?
	
	



```
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.

Wie gesagt:

```
echo 'Taet: '.$_POST['taetigkeit'].'<br>';
echo 'Prod: '.$_POST['product'].'<br>'; 
echo 'Desc: '.$_POST['beschreibung'].'<br>';
echo 'erst: '.$erstellt.'<br>';
echo 'ID: '.$_SESSION['prid'].'<br>';
```
^^ Liefert: 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



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.'_'.$a nicht 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:
	
	



```
//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:
	
	



```
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:
	
	



```
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 .. 

```
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>';
}
```


```
for ($b = 0; $b < 7; $b++) {
    $ts = $wochenanfang + ($b * 60 * 60 * 24);
    $dauer = [COLOR=royalblue]$_POST['ts['.$ts.']'];
```
^^ Aber irgendsowas, wenn richtig gemacht, müsste m. E. die Lösung des Problems sein?!


----------



## BenRo (15. Oktober 2014)

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

```
/* Ich gehe mal davon aus, dass $wochenanfang und $wochenende hier irgendwo gesetzt sind */
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
    $dauer = $_POST['ts['.$wochentag.']'];
/* ... */
}
```


----------



## boss3D (15. Oktober 2014)

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:



Spoiler





```
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:
	
	



```
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>';
                    }
                }
```
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.

Hier gäb's vielleicht einen Lösungsansatz, den ich aber gar nicht durchblickt habe.

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.
	
	



```
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 ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Zum Gegenvergleich formular.php-$ts:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



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?!?!


----------



## DarkMo (15. Oktober 2014)

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.


----------



## BenRo (15. Oktober 2014)

boss3D schrieb:


> Mag ja sein, dass es da Standards gibt, aber keine " zu benutzen funktioniert bei mir ÜBERALL sonst im Code!



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.

Hier stehts nochmal für verschiedene Datentypen:
MySQL :: MySQL 5.1 Referenzhandbuch :: 9.1 Literale: wie Strings und Zahlen geschrieben werden



> ^^ 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.


Nein.



> 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?



> Hier gäb's vielleicht einen Lösungsansatz, den ich aber gar nicht durchblickt habe.


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.


Richtig.


----------



## boss3D (15. Oktober 2014)

@ 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:



Spoiler





```
[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>';
            }
        }
    }
```



Wegen dem $erstellt bleibe ich btw dabei:


boss3D schrieb:


> 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 ...


Spoiler





```
$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>';
```






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[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:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[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?


----------



## DarkMo (15. Oktober 2014)

```
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 ^^


----------



## boss3D (15. Oktober 2014)

Jetzt habe ich es für die Ausgabe in projektzeiterfassung.php so:


Spoiler





```
$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;
            [COLOR=royalblue]$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;
            [COLOR=royalblue]$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">';
                [COLOR=royalblue]foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$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]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }                echo '</select></td>';
```



Aber in den beiden Dropdowns kriege ich immer noch nur den jeweils ersten Buchstaben der Tätigkeit bzw. des Produkts ... ???




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## DarkMo (15. Oktober 2014)

oO jetzt bin ich verwirrt ^^
mach mal irgendwo ein var_dump (oder print_r oder so) von den tätigeiten array. stehts da auch richtig drin?


----------



## boss3D (15. Oktober 2014)

Ja

Screenshot geht gerade nicht, weil's forum gerade langsam ist, aber es sieht so aus:

Array ([1]=>An... [2]=>As... ...)




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        


(edit: jetzt doch)


----------



## BenRo (15. Oktober 2014)

Könnte es evtl. sein, dass du irgendwo versehentlich mit Array-Syntax auf einen String zugreifst?
Also sowas:

```
$string = 'Dies ist ein String';

$erstesZeichenDesStrings = $string[0];
```


----------



## boss3D (15. Oktober 2014)

Ja, so sieht's aus, aber wo???

Das müsste dann hierin sein:

```
foreach ($taetigkeiten as $key => $taetigkeit) {
    if ($key == $row_taet[0]) {
       echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
   } else {
       echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
   }
}
```
Nur das Ding gibt das Tätigkeiten-Dropdown aus.


----------



## BenRo (15. Oktober 2014)

Sieht erstmal richtig aus. Wie sieht denn der ausgegebene HTML-Quelltext aus?


----------



## boss3D (15. Oktober 2014)

```
<!doctype html><html>  <head>    <title>Projektzeiterfassung - Projektzeiterfassung</title>    <meta charset="utf-8">    <link rel="stylesheet" type="text/css" href="style.css">  </head>  <body>    <div class="submit">      <form action="index.php?section=pze" method="post">        <h1>Projektzeiterfassung</h1><table>  <tr>    <td colspan="10" class="head_cap">      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>        <td style="width:90%; border:none; text-align:center">            Kalenderwoche 42: 13.10.2014 - 19.10.2014            <input type="hidden" value="1413194400" name="wa">            <input type="hidden" value="1413712800" name="we">          </td>        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>      </tr></table>    </td>  </tr>    <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>Taetigkeiten: Array
(
    [1] => A...

    [2] => A...

    [3] => E...

    [4] => O...

    [5] => P...

    [6] => P...

    [7] => S...

    [8] => S...

    [9] => S...

    [10] => S...

    [11] => V...

)
<tr><td><select name="taetigkeit1"><option value="A">A</option><option value="A">A</option><option value="E">E</option><option value="O">O</option><option value="P">P</option><option value="P">P</option><option value="S">S</option><option value="S">S</option><option value="S">S</option><option value="S">S</option><option value="V">V</option></select></td><td><select name="product1"><option value="R">R</option><option value="R">R</option><option value="R">R</option><option value="G">G</option><option value="M">M</option><option value="M">M</option><option value="R">R</option><option value="R">R</option><option value="R">R</option><option value="R">R</option><option value="C">C</option><option value="C">C</option><option value="C">C</option><option value="T">T</option><option value="V">V</option><option value="O">O</option><option value="O">O</option><option value="O">O</option><option value="M">M</option><option value="G">G</option><option value="-">-</option></select></td><td><input name="beschreibung1" type="text" size="50" maxlength="250"></td> <td><input type="text" name="1413194400_1" maxlength="6" size="4"></td> <td><input type="text" name="1413280800_1" maxlength="6" size="4"></td> <td><input type="text" name="1413367200_1" maxlength="6" size="4"></td> <td><input type="text" name="1413453600_1" maxlength="6" size="4"></td> <td><input type="text" name="1413540000_1" maxlength="6" size="4"></td> <td><input type="text" name="1413626400_1" maxlength="6" size="4"></td> <td><input type="text" name="1413712800_1" maxlength="6" size="4"></td></table><br><div class="submit">  <input type="submit" style="height:24px; width:130px" name="addLine" value="+ Zeile hinzufügen">  <input type="submit" style="height:24px; width:130px" name="remLine" value="- Zeile entfernen">  <input type="hidden" name="add" value="1"></div><br><div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div><br><br><br><div class="submit">Einträge anzeigen ...  <input type="submit" style="height:24px; width:65px" name="auswerten" value="eigene">  <input type="submit" style="height:24px; width:65px" name="auswertenall" value="alle">         <br><br><input type="submit" name="logout" value="Ausloggen">      </form>    </div>  </body></html>
```
Das Ding in der Mitte ist noch von meinem print_r (da habe ich die vollständigen Namen zensiert), das gehört normal nicht rein. Und dann kommen eben die Dropdowns mit den Anfangsbuchstaben.

BTW sehe ich auch gerade selbst, dass ja auch der $key (value) totaler Pfusch ist! Das sollten int-Zahlen (ergo Feldindexe) sein, nicht auch die Anfangsbuchstaben!


----------



## BenRo (15. Oktober 2014)

Poste doch bitte nochmal deinen PHP-Code (inkl. des print_r)


----------



## boss3D (15. Oktober 2014)

^^ Hat sich gerade erledigt: Das Problem war, dass ich über den EDIT-Button zu projektzeiterfassung.php gekommen bin. Dadurch hat er nicht den eigentlichen Ausgabecode gesehen, sondern den von der editierbaren Zeile, wo ich das noch nicht auf $key umgebaut hatte.

Jetzt habe ich das Programm neugestartet und ALLES umgebaut. Jetzt stimmt das mit den ganzen $keys, IDs, ...  _*schwere Geburt *_
-----------

Damit bleibt uns erstmal nur noch das Problem mit der $dauer, wobei ich vorhin festgestellt habe, dass BenRo und ich da die selbe Vermutung haben:


BenRo schrieb:


> 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





boss3D schrieb:


> 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?


projektzeiterfassung.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 $wochentag.'<br>';
                    echo '<td><input type="text" name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
```
formular.php
	
	



```
for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST['ts['.$ts.']'];
                    mysqli_query($mysqli, "UPDATE zeiten SET zeit = '$dauer' WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 'zeiten' fehlgeschlagen.<br>".mysqli_error());
                }
```


----------



## DarkMo (15. Oktober 2014)

mach mal bitte testweise aus if ($key == $row_taet[0]) { ein if ($key == $row_taet) { oder eher ein if ($key == $row_taet['taetigkeit']) {


----------



## boss3D (15. Oktober 2014)

^^ Mal kurz dazwischen gesagt: Ich habe exkl. dem Resttag von heute noch 3 Tage bis das Projekt endgültig fertig sein muss. Nachdem wir bei der $dauer gerade anzustehen scheinen, mal was anderes ...

Einen letzten Wunsch hat der Auftraggeber gestern noch geäußert: Es soll unter der Datensätze-Tabelle noch eine Tabelle mit den Mitarbeitern ausgegeben werden. War auch easy umzusetzen, habe ich gestern in 10 Minuten schnell hingebastelt (dazu brauchte ich btw auch die Vornamen und Nachnamen in der Registrierung dazu). Einzig eines ist mir davon übergeblieben: Die Passwörter sollen als Klartext angezeigt werden, falls ein MA seines vergisst, damit der Admin dann nachschauen kann. Derzeit habe ich sie noch verschlüsselt aus der DB ausgelesen.




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Insgesamt bleiben jetzt also noch 4 Dinge, von denen die ersten beiden Pflicht und die letzten beiden optional sind (bzw. das dritte ist zwar auch "Pflicht", ließe sich aber simple lösen):

1) $dauer richten.

2) Unterscheidungskriterium für INSERT/UPDATE finden. Eventuell brauche ich dann auch noch eine kleine zusätzliche Überprüfung, ob beim "updaten" ein Wert überschrieben werden, oder ein leeres Feld erstmalig befüllt werden soll?! Oder müsste ich dafür das alles nochmal grundlegend umbauen:



Spoiler





```
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 "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 {*/      
                mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['product']."', beschreibung = '".$_POST['beschreibung']."' WHERE id = '".$_SESSION['prid']."';") or die ("Update 'projekte' fehlgeschlagen.<br>".mysqli_error());
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST['ts['.$ts.']'];
                    mysqli_query($mysqli, "UPDATE zeiten SET zeit = '$dauer' WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 'zeiten' fehlgeschlagen.<br>".mysqli_error());
                }
            }          
        }
    //}
```



3) PWs als Klartext ausgegeben kriegen.

4.) +/- Zeile-Buttons eventuell löschen und mehrere Zeilen fix anzeigen.

^^ Wenn 1.) gerade nicht geht, können wir uns vielleicht bis uns was einfällt einen der anderen Punkte überlegen?! 2.) geht schlecht, weil das mit 1.) zusammenhängt. Bei 3) wär's halt die "Idiotenlösung", die PWs von Anfang an unverschlüsselt in der DB zu speichern. Aber geht das auch schlauer? Jedenfalls gibt's keine Funktion um unseren Hash zu knacken (was ja auch gar nicht der Sinn der Sache wäre).

[EDIT]
@ DarkMo
Habe dein Posting erst jetzt gesehen. Bezieht sich das noch auf das vorige Problem? Wenn ja, das haben wir bereits gelöst. Es läuft jetzt mit $row_taet[0] völlig korrekt. Oder geht's bei deiner Frage noch um irgendeine Optimierung?


----------



## DarkMo (15. Oktober 2014)

ging noch um den anfangsbuchstaben. is ja gut, wenns nu läuft. wegen den pw's... wie solln das gehn? xD du kannst dem admin höchstens ne funktion anbieten, dem mitarbeiter ein neues pw zu generieren, dass er dann dem MA gibt. dieser bräuchte dann natürlich noch ne funktion, das pw zu ändern. alles andere ist ein enormes sicherheitsrisiko (ich weis, is bei dir nich so wild, aber da rollt sich einem trotzdem alles zusammen ^^).


----------



## boss3D (15. Oktober 2014)

Was ist denn schlimm dran, wenn der Admin die PWs als Klartext sieht? Wenn er der einzige ist, ist eh gleich klar wer's gewesen sein muss, wenn was böswillig verstellt wurde. Aber egal ...

Jedenfalls sehe ich nur 2 Möglichkeiten:
a) Die PWs gleich unverschlüsselt in die DB speichern, dann kann man sie auch ohne Umstände unverschlüsselt wieder auslesen.
b) Sowas:

formular.php



Spoiler





```
[COLOR=royalblue]$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);    
    
    if (isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'");
        $row = mysqli_fetch_object($erg);
        [COLOR=seagreen]//$password = hash('sha512', ($_POST['password']).$salt);        [COLOR=royalblue]$password = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hash('sha256', $salt), $_POST['password'], MCRYPT_MODE_ECB, $iv);        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';
        [COLOR=red]} 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['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 {
                [COLOR=seagreen]//$passwort = hash('sha512', ($passwort).$salt);                [COLOR=royalblue]$passwort = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hash('sha256', $salt), $_POST['password'], MCRYPT_MODE_ECB, $iv);                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }
```



auswerten2.php



Spoiler





```
echo '<table>';
    echo '    <tr>';
    echo '      <th>Username</th>
                <th>Vorname</th>
                <th>Nachname</th>
                <th>Passwort</th>';
    echo '      </tr>';
    $mitarbeiter = array();
    $res_m = mysqli_query($mysqli, "SELECT * FROM user;") or die ("Get Mitarbeiter fehlgeschlagen.<br>".mysqli_error());
    if (mysqli_num_rows($res_m)) {
        while ($row_m = mysqli_fetch_assoc($res_m)) {
            $mitarbeiter[count($mitarbeiter)] = $row_m;
        }
    }
    foreach ($mitarbeiter as $mitarbeiter_sg) {
        echo '    <tr>';
        echo '        <td>'.$mitarbeiter_sg['name'].'</td>';
        echo '        <td>'.$mitarbeiter_sg['vorname'].'</td>';
        echo '        <td>'.$mitarbeiter_sg['nachname'].'</td>';
        [COLOR=royalblue]$pw_clear = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, hash('sha256', $salt), $mitarbeiter_sg['passwort'], MCRYPT_MODE_ECB, $iv);
        echo '        <td>'.$pw_clear.'</td>';        [COLOR=seagreen]//echo '        <td>'.$mitarbeiter_sg['passwort'].'</td>';        echo '    </tr>';
    }
    echo '</table><br>';
```



^^ Funktioniert allerdings eh nicht wie's sollte. Ich kann zwar MAs registrieren, aber beim Login-Versuch danach läuft er mir ins rote else: "Benutzername und/oder Passwort waren falsch oder nicht registriert"

Im $iv ist irgendwas RANDom-mäßiges drinnen. Ich vermute, dass der beim Login irgendwas neu generiert und der Vergleich der Verschlüsselungen dadurch fehlschlägt?!
--------------

Wichtiger als das wäre aber wirklich die EDIT-Funktion noch fertig zu kriegen. 1.) und 2.)

[EDIT]
Hab's schon, auch wenn ich's (noch) nicht gänzlich verstehe: Der Schlüssel darf nur $salt sein, kein hash('sha256', $salt) über den $salt. Eigentlich müsste es egal sein, weil der Schlüssel für den Rijndael in beiden Fällen eine Zeichenfolge wäre. Aber vielleicht generiert der hash irgendwas, das dann nicht gleich ist, sobald's um einen Vergleich ginge?! Wie ich das oben schon vermutet hatte.

Jedenfalls läuft's jetzt so: In der DB sind die PWs verschlüsselt, aber für den Admin und seine Ausgabe werden sie wieder entschlüsselt. So war auch der Wunsch des Auftraggebers.
--------------

Damit bleibt jetzt wirklich nur mehr das zu richten:

```
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 "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 {     
                mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['product']."', beschreibung = '".$_POST['beschreibung']."' WHERE id = '".$_SESSION['prid']."';") or die ("Update 'projekte' fehlgeschlagen.<br>".mysqli_error());
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST['ts['.$ts.']'];
                    mysqli_query($mysqli, "UPDATE zeiten SET zeit = '$dauer' WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 'zeiten' fehlgeschlagen.<br>".mysqli_error());
                }
            }          
        }
    }
```
Mit folgenden Punkten:
- (Funktionierendes) Unterscheidungskriterium im ersten if zwischen INSERT und UPDATE finden
- $dauer richten für korrektes Überschreiben alter Stundenwerte mit neuen
- Überprüfung ob ein Feld in der Zeile erstmalig beschrieben wird (= INSERT), oder ob es geUPDATEet werden soll (lässt sich vielleicht mit dem ersten Punkt verbinden?!)

^^ Dazu bräuchte ich bitte nochmal eure Hilfe.


----------



## BenRo (15. Oktober 2014)

$dauer kannst du selbst vermutlich deutlich besser debuggen als wir aus der Ferne. Vergleiche wie die Felder im HTML-Quelltext heißen, was in den Feldern drinsteht, was dann im $_POST ankommt (Ein Debugging-Plugin für den Browser wie Firebug o. ä. hilft enorm, in Firebug wäre das im Tab "Netzwerk" zu sehen), was in $dauer steht. So läuft halt Fehlersuche, an jedem Punkt an dem sich Daten ändern können prüfen, ob diese noch korrekt sind, oder nicht. Für die Zukunft: Schau dir mal xdebug an.

Passwort: Wennd er Mitarbeiter sein Passwort vergisst, kriegt er ein neues. Jedes andere Verfahren ist Quatsch. Ob er das neue kriegt, indem er einen Link klickt, oder indem er dem Administrator sagt "Ich hab mein Passwort vergessen" ist dann erstmal nachrangig, zweiteres ist natürlich leichter zu implementieren.

Zu INSERT/UPDATE werfe ich nochmal "ON DUPLICATE KEY UPDATE" (--> Google) in den Raum.

Zu guter Letzt


> Einen letzten Wunsch



Das zu glauben ist naiv. Kannst ja mal selbst den Thread durchgehen und nach Formulierungen wie "jetzt fehlt nur noch", "das einzige was noch fehlt" etc. schauen. Es werden immer noch Anforderungen dazukommen. Das ist auch ganz normal so.


----------



## boss3D (16. Oktober 2014)

1) Das "witzige" ist, es stimmt bis zum allerletzten Moment, also bis zum Anklicken des "Bestätigen" Buttons in projektzeiterfassung.php ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Das Problem muss in formular.php selbst liegen, wo der Wert für $dauer nicht ankommt?! Firebug hätte ich eh schon installiert, schaue ich mir dann vielleicht* mal an.

2) Das mit den PWs lasse ich jetzt so. Meine Umsetzung erfüllt den Wunsch des Auftraggebers. Damit ist das für mich erledigt. Hätte ich mehr Zeit, würde ich mir vielleicht auch noch was anderes überlegen. 

3) Das mit ON DUPLICATE KEY UPATE klingt gerade total interessant, vielen Dank! *Ich denke mir nämlich gerade, dass ich vielleicht meinen ganzen UPDATE-Code wegschmeißen und einfach den INSERT-Code, der ja einwandfrei funktioniert, um die genannte Funktion erweitern kann?! Muss ich mir gleich anschauen. Dann fiele nämlich auch das Überlegen eines Unterscheidungskriterium bzw. überhaupt das if-else weg. 

4) Das hat schon immer so gestimmt, wie ich es geschrieben habe. Du musst bedenken, ich habe in zwei Etappen (mit großem zeitlichen Abstand dazwischen) an dem Projekt gearbeitet. Dass es da mehrmals einen "letzten Wunsch" gab, ist somit nicht verwunderlich. Außerdem sind uns auch immer wieder neue Sachen eingefallen, die ich im Sommer noch nicht gewusst habe. Da hatten wir für Herbst (jetzt) nur noch die Filterfunktionen geplant. Dann habe ich jetzt aber freiwillig den DELETE-Button eingebaut. Das EDIT ist auch mir eingefallen, hat dem Auftraggeber aber so gut gefallen, dass aus einem nice-to-have schnell ein must-have wurde (so kann man sich's auch selber einbrocken ) ...
Übrigens ist am kommenden SA wirklich die Zeit aus, mehr geht also alleine deswegen schon nicht mehr.


----------



## boss3D (16. Oktober 2014)

Rein codetechnisch bzw. syntaktisch müsste das dann so ausschauen (in formular.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."");
            
            mysqli_query($mysqli, "INSERT INTO 
                                        projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                      VALUES 
                                        ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt') 
                                    ON DUPLICATE KEY UPDATE 
                                        taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', beschreibung = '".$_POST['beschreibung'.$a]."';");
            $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;");
                }
            }
        }
    }
```
Funktioniert allerdings noch nicht, aber mal langsam ...
Was ich nicht verstanden habe, ist, wodurch er wissen will, ob da irgendwo an der richtigen Stelle bereits was in der DB steht und er das updaten muss. Irgendwie fehlt mir bei dem ON DUPLICATE KEY UPDATE ein WHERE mit Bedingung für meine Logik. Müsste ich den queries nicht irgendwie die ID der Einträge mitgeben, damit dann genau dieser Eintrag auf ein Duplikat geprüft wird??? 

Und warum das so noch nicht funktioniert, dürfte an folgendem liegen:

projektzeiterfassung.php


Spoiler





```
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
    
            [COLOR=royalblue]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 [COLOR=royalblue]name="taetigkeit">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$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 [COLOR=royalblue]name="product">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</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 [COLOR=royalblue]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" [COLOR=royalblue]name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                
                $_SESSION['prid'] = $selected[$j];
                echo '<td>'.$selected[$j].'</td><br>';
            }
        }
    }
    /*************/
      
    [COLOR=royalblue]for ([B]$a = 1; $a <= $add; $a++[/B]) {        echo '<tr><td><select [COLOR=royalblue]name="taetigkeit'.[B]$a[/B].'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

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

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

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



^^ Die Namen im EDIT-Zeile-Code (oberer Abschnitt) passen noch nicht für die Abfrage in formular.php, siehe ganz oben im Posting. Aber die beiden Teile hier im Spoiler machen ja im Prinzip das selbe, also muss sich das doch innerhalb der for ($a...) Schleife kombinieren lassen?! Die for ($j...) Schleife hat ja exakt den selben Sinn.



[EDIT]
Wenn ich es allerdings so mache (projektzeiterfassung.php) ...



Spoiler





```
for ($a = 1; $a <= $add; $a++) {
        
        /*************/
        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[$a];");
                    $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                    echo '<tr><td><select name="taetigkeit'.$a.'">';
                    foreach ($taetigkeiten as $key => $taetigkeit) {
                        if ($key == $row_taet[0]) {
                            echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$a];");
                    $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                    echo '<td><select name="product'.$a.'">';
                    foreach ($products as $key => $product) {
                        if ($key == $row_prod[0]) {
                            echo '<option value="'.$key.'" selected>'.$product.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$product.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$a];");
                    $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                    echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                    for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                        $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$a]."';");
                        $row_time = mysqli_fetch_row($time_id);
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                    }
                    
                    $_SESSION['prid'] = $selected[$a];
                    echo '<td>'.$selected[$a].'</td><br>';
                //}
            }
        }
        /*************/
      
    //for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</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>';
        }
    }
```



... dann kriege ich zwar ganz normal meine EDIT-Zeile, aber ohne vorbelegte Werte:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



[EDIT2]
Ah, die projekt- bzw. taetprodid (der ersten EDIT-Zeile) ist in $selected[0] drinnen, aber $a fängt bei 1 an. Alle $selected[$a] zu $selected[0] ausgebessert, jetzt kriege ich auch mit dem kombinierten Code wieder EINE EDIT-Zeile. Jetzt müsste ich das aber trotzdem noch irgendwie dynamisch mit einer Variable lösen, damit auch mehrere EDIT-Zeilen wieder dargestellt werden können. Hm ...


----------



## BenRo (16. Oktober 2014)

Du musst für das ON DUPLICATE KEY in der Datenbank auch einen KEY (Index) erstellen. Und zwar einen UNIQUE Key, diesen kannst du über mehrere Spalten definieren. (D. h. "Hiermit sage ich, die Kombination aus A, B und C darf nur einmal vorkommen). Siehe z. B.
MySQL :: MySQL 5.0 Reference Manual :: 13.1.8 CREATE INDEX Syntax

(Falls du phpmyadmin einsetzt, damit geht das sehr simpel & graphisch.)

EDIT:

Zum Beispiel hierfür:

```
mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
```
wäre der notwendige UNIQUE Index eienr über userid, taetprodid und datum.


----------



## boss3D (16. Oktober 2014)

^^ Ich glaube, ganz habe ich das nicht kapiert mit dem UNIQUE INDEX, aber soweit ich das sehe, haben wir doch eh durch die auto-increment IDs in der _projekte_- und der _zeiten_-Tabelle eindeutige INDEXE?!

Ich frage mich nur, wie ich die dem ON DUPLICATE KEY UPDATE mitteilen soll, sodass er dann eben genau den Eintrag an dieser ID anschaut und zwischen INSERT und UPDATE entscheidet?!

[EDIT]
Die auto-increment ID wäre btw auch "unique" für z. B. userid+taetprodid+datum in _zeiten_, oder taetigkeit+produkt+beschreibung+erstellt in _projekte_.


----------



## BenRo (16. Oktober 2014)

auto-increment-IDs? Wusste ich nicht (mehr). Wie heißt denn das entsprechende Feld? id? Das wird im Code aber nicht benutzt, oder?

Naja, wenn du zum Beispiel einen Unique Index über userid, taetprodid und datum erstellst, dann arbeitet die Datenbank in etwa so:

-> Will eine Spalte für User 4, Taetprodid 7 und Datum 11.11.2014 erstellen, mit der Zeit 20
-> User, Taetprodid, Datum sind UNIQUE, das heißt, die Kombination aus diesen drei Werten darf in der Datenbank nur einmal vorkommen, soso...
-> Oje! Es kommt bereits vor! User 4, Taetprodid 7 und Datum 11.11.2014 mit Zeit 15 gefunden!
-> Bei einem Query ohne ON DUPLICATE KEY UPDATE würde ich jetzt einen Fehler melden, aber so...
-> Mache ich stattdessen ein Update der Zeile, in der die Kombination vorkommt! Hurra!

(Edit: Siehe
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Auch den obersten Kommentar lesen)


----------



## boss3D (16. Oktober 2014)

projekte




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



zeiten




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



(taetprodid in _zeiten_ == id aus _projekte_, aber wir würden auch in _zeiten_ die auto-increment ID letztgenannter Tabelle brauchen)

Wie das arbeitet, habe ich schon verstanden. Was mir nicht klar ist: Wie sag ich dem ON DUPLICATE KEY UPDATE, für welchen Eintrag, also welche ID, er prüfen soll??? Genau dafür fehlt mir in meiner Logik ein WHERE, das es aber in der Syntax der DUPLICATE-Funktion nicht gibt?!

[EDIT]
Ja, die Comments habe ich eh gelesen. Wenn ich den ersten richtig verstehe, dann muss ich eigentlich gar nichts machen?! Wenn eindeutige Kombinationen in der DB vorhanden sind, dann funktioniert ON DUPLICATE KEY UPDATE automatisch wie ein UPDATE ... WHERE auf einen bestimmten Eintrag?! 

Jedenfalls kann ich den formular.php-Code eh noch nicht so richtig testen, weil vorher noch die Ausgabe in projektzeiterfassung.php gerichtet werden muss. Noch ist die ein kleines Chaos:


Spoiler





```
for ($a = 1; $a <= $add+count($selected); $a++) {
        
        $b = $a-1;
        /*************/
        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[$b];");
                    $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                    echo '<tr><td><select name="taetigkeit'.$a.'">';
                    foreach ($taetigkeiten as $key => $taetigkeit) {
                        if ($key == $row_taet[0]) {
                            echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                    $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                    echo '<td><select name="product'.$a.'">';
                    foreach ($products as $key => $product) {
                        if ($key == $row_prod[0]) {
                            echo '<option value="'.$key.'" selected>'.$product.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$product.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                    $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                    echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                    for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                        $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                        $row_time = mysqli_fetch_row($time_id);
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                    }
                    
                    $_SESSION['prid'] = $selected[$b];
                    echo '<td>'.$selected[$b].'</td><br>';
                //}
            }
        }
        /*************/
      
    //for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</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>';
        }
    }
```



Liefert:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Die EDIT-Zeilen stimmen schon, aber ich kriege zu viele von den normalen Eingabezeilen, weil die Schleife zu hoch zählt. Muss ich jetzt erst wieder zwei getrennte Schleifen haben?  Ich brauche aber für ALLES den $a-Index ...


----------



## BenRo (16. Oktober 2014)

Siehe mein Beispiel oben. Mit einem UNIQUE INDEX oder PRIMARY KEY.

Ich bleibe beim Folgenden mal in der Tabelle zeiten:

Du hast in dem Fall zwei Sachen die eine Zeile eindeutig beschreiben, richtig?
a) Die Kombination aus user, taetprodid, datum
Oder
b) Die id (die sich per auto_increment erhöht)

Ich gehe davon aus, dass es bisher keine Indizes (plural von INDEX) in der Tabelle gibt, richtig? (Wenn du keine angelegt hast, gibts auch keine).

Davon ausgehend, dass das Datenbankschema (alle Tabellen, Spalten und deren jeweilige Namen etc.) bleiben soll, wie es ist, halte ich folgende beiden Keys für sinnvoll:
1. PRIMARY KEY auf id
2. UNIQUE INDEX auf user, taetprodid, datum (ACHTUNG: NICHT JEWEILS!!!, sonder ein UNIQUE-INDEX über alle drei)

PRIMARY KEY und UNIQUE sind sehr ähnlich. Es kann allerdings nur einen Primary Key geben (daher das Primary). Primary Key felder dürfen nicht null sein.

Nur der 2. Index ist für den in #813 zitierten SQL-Query relevant.


----------



## boss3D (16. Oktober 2014)

^^ Ja, aber ich verstehe noch nicht ganz, was und wo ich mit dem Zeug was machen soll.

Jetzt mal ganz vereinfacht gesprochen: Muss ich einfach nur eine einzige Zeile in meinem Code irgendwo vor der ersten Verwendung von DUPLICAT... einfügen, die lautet:
	
	



```
CREATE UNIQUE INDEX index_name ON projekte (taetigkeit, produkt, beschreibung, erstellt);
```
???

Ich will ja eigentlich nichts in der DB hinzufügen. Er soll die bereits vorhandene ID bzw. die möglichen Kombinationen vorhandener Spalten als Indizes/Keys verwenden.

Und siehe bitte mein EDIT im Vorposting ...

[EDIT]
So klappt die Darstellung schon mal einwandfrei:


Spoiler





```
for ($a = 1; $a <= $add; $a++) {
        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'.$a.'">';
                    foreach ($taetigkeiten as $key => $taetigkeit) {
                        if ($key == $row_taet[0]) {
                            echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$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'.$a.'">';
                    foreach ($products as $key => $product) {
                        if ($key == $row_prod[0]) {
                            echo '<option value="'.$key.'" selected>'.$product.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$product.'</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'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                    for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                        $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
                        $row_time = mysqli_fetch_row($time_id);
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                    }
                    
                    $_SESSION['prid'] = $selected[$j];
                    echo '<td>'.$selected[$j].'</td><br>';
                }
            }
        }
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</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>';
        }
    }
```



Bleibt nur zu hoffen, dass durch die verschachtelten Schleifen $a nicht irgendwann ungewollte Werte annimmt. 

Jedenfalls muss ich jetzt eben nur noch den Code in formular.php richten ...

[EDIT2]
$a scheint immer 1 zu sein. Dann wird das so eh noch nicht klappen. 
Der müsste bei 2 EDIT-Zeilen vor einer normalen Eingabezeile bei $a bis auf 3 kommen.

[EDIT3]
Yes! Jetzt stimmt's $a. 


Spoiler





```
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];

            for ($a = 1; $a <= count($selected); $a++) {
                $b = $a-1;
                    
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$b];");
                $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                    
                $_SESSION['prid'] = $selected[$b];
                echo '<td>'.$selected[$b].'</td><br>';
            }
        }
    }
    echo $a;
      
    for ($a = count($selected)+1; $a <= $add+count($selected); $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</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>';
        }
    }
```



Damit sollte jetzt schon mal alles den richtigen Index und Namen haben.


----------



## BenRo (16. Oktober 2014)

Du musst den Index nur einmalig erstellen.
Egal ob per Mysql Client, Phpmyadmin, PHP, sonstwie...
Also nicht in deinen Code stecken, sondern einfach einmal den Index erstellen.


----------



## DarkMo (16. Oktober 2014)

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. ^^


----------



## boss3D (16. Oktober 2014)

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 ...


----------



## BenRo (16. Oktober 2014)

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.



DarkMo schrieb:


> 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/


----------



## boss3D (16. Oktober 2014)

Wo sollte das denn sein?




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



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

[EDIT]
Hab's jetzt eingegeben. Das ist zurückgekommen:

```
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:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## BenRo (16. Oktober 2014)

Unter "Struktur", dann die drei Felder auswählen, dann auf UNIQUE klicken (unten drunter, links), kannst es selbstverständlich auch eingeben.


----------



## boss3D (16. Oktober 2014)

_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?


----------



## BenRo (16. Oktober 2014)

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?


----------



## boss3D (16. Oktober 2014)

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.  Wie behindert ist unser System eigentlich??? 

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.


----------



## BenRo (16. Oktober 2014)

Was soll alles editierbar sein und was nicht?

Edit: "UNIQUE heißt einzigartig"


----------



## boss3D (16. Oktober 2014)

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)_


----------



## BenRo (16. Oktober 2014)

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.


----------



## boss3D (16. Oktober 2014)

So meinst du?


Spoiler





```
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.


----------



## BenRo (16. Oktober 2014)

Was ist $_POST['confirm'], was ist $_POST['edit']? Wenns beides Buttons sind, kanns ja nicht klappen, da man sie schlecht gleichzeitig drücken kann.


----------



## Rho (16. Oktober 2014)

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)


----------



## boss3D (16. Oktober 2014)

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?


----------



## BenRo (16. Oktober 2014)

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.


----------



## boss3D (16. Oktober 2014)

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:


Spoiler





```
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.


----------



## BenRo (16. Oktober 2014)

Tuts an der unteren violetten Stelle nicht einfach $taetprodid = $_SESSION['prid'];
Oder ist das wieder was anderes?


----------



## boss3D (16. Oktober 2014)

^^ 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.


----------



## BenRo (16. Oktober 2014)

Was spricht eigentlich gegen ein hidden-Feld?


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

Ich finde es ein bisschen seltsam, diese Sachen in der Session zu speichern...


----------



## boss3D (16. Oktober 2014)

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:


Spoiler





```
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.


----------



## BenRo (16. Oktober 2014)

> Wo sollte ich das vernünftig hinbasteln?


Naja prinzipiell ist ja folgendes möglich (ich habe keine Ahnung, ob das genau auf deine Situation passt, es tut mir Leid, aber dein Code ist mir zu kompliziert geworden, daher bleibe ich bei einem allgemeinen Beispiel):

Seite A:
<input type="hidden" value="2" name="foo">

Seite B:
if(isset($_POST['foo'])) print('<input type="hidden value="'.intval($_POST['foo']).'" name="foo">');

Seite C:
if(isset($_POST['foo'])) print('Hurra, foo wurde von Seite A bis hierher gebracht! Magie! In foo steht '.intval($_POST['foo']));


----------



## boss3D (16. Oktober 2014)

^^ Ne, das passt nicht wirklich auf mein Beispiel.

Das Problem bei mir ist, dass ein Datensatz in mehrere Tabellen geschrieben wird, weshalb das Eintragen nicht in einem Aufwaschen erledigt werden kann. Bei mir ist das ganze gesplittet und MITTENDRIN brauche ich die id der ersten "Hälfte des Datensatzes", um sie für die "zweite Hälfte" verwenden zu können.

(skizziert)
1) Aus der ganzen Eingabezeile (erste "Hälfte") --> INSERT Tätigkeit, Produkt und Beschreibung --> _produkte_
2) ermittle die (auto-increment) ID von genau diesem INSERT-query ^^
3) Aus der Eingabezeile (zweite "Hälfte") --> INSERT userid, taetprodid (= jetzt genau das aus 2) ), Zeit, Datum --> _zeiten_

^^ Dadurch ist jetzt 1 ganzer Datensatz in der DB gelandet.

Das Problem müsste jetzt sein, dass $taetprodid an der markierten Stelle nicht richtig eingesetzt wird bzw. leer ist, aber warum???



Spoiler





```
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, [COLOR=royalblue]taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', [COLOR=royalblue]'$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;");
                }
            }
        }
    }
```



Wenn ein Eintrag in der DB noch nicht existiert, klappt das ja auch wunderbar. Aber wenn ein neuer Stundenwert einen alten ersetzen soll, dann landet dieser mit taetprodid=0 in _zeiten_ und kann dadurch auch nicht richtg ausgelesen werden.

[EDIT]
Ja, hab's gerade durch echos überprüft: $taetprodid ist immer 0, wenn ich sie aus dem if rausnehme, in dem sie ihren Wert vom INSERT kriegt.


----------



## boss3D (16. Oktober 2014)

Ich glaube, die Editier-Funktion können wir vergessen?! Zum einen fällt mir nichts mehr ein, wie ich die jeweils korrekte ID noch in die unteren beiden $taetprodid reinkriegen soll, und zum anderen habe ich beim Testen gerade noch einen Fehler festgestellt: Es werden immer nur Veränderungen an der untersten editierbaren Zeile in die DB geschrieben, diejenigen darüber bleiben unverändert.

Dabei hätte ich gedacht, dass doch gerade diese for-Schleife bewirken sollte, dass alle Zeilen behandelt werden:



Spoiler





```
if (isset($_POST['confirm'])) {
       [COLOR=royalblue] 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');");
                $taetprodid = mysqli_insert_id($mysqli);
            } 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']."';");
            }
                
            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;");
                }
            }
        }
    }
```



Auch da habe ich keinen Plan, wodurch das passieren könnte. 8h wären es (morgen) noch, aber ich bin mit meinem Latein am Ende ...


----------



## boss3D (17. Oktober 2014)

LOL!!!
Habe gerade in 2 Minuten die Lösung für die taetprodid gefunden:


Spoiler





```
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');");
                [COLOR=royalblue]$_SESSION['taetprodid'] = mysqli_insert_id($mysqli);            } 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']."';");
            }
                
            for ($b = 0; $b < 7; $b++) {
                [COLOR=royalblue]$taetprodid = $_SESSION['taetprodid'];                $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 klappt das ganze Editieren wunderbar ... für 1 Zeile. Jetzt muss ich es nur mehr schaffen, dass mehrere Zeilen editierbar sind. Irgendwo muss da echt noch ein kleiner Fehler in einer Schleife sein?!

[EDIT]
Habe den Fehler schon gefunden: $add (Schleifenrundenlimit) ist immer 1. Jetzt noch rausfinden, warum ...

Die Ursache dafür muss wohl hierin liegen:



Spoiler





```
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $_SESSION['update'] = 1;

            for ($a = 1; $a <= count($selected); $a++) {    
                $b = $a-1;    
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$b];");
                $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                    
                $_SESSION['prid'] = $selected[$b];
                echo '<td>'.$selected[$b].'</td><br>';
            }
        }
    }
      
    for ($a = count($selected)+1; $a <= $add+count($selected); $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</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>';
        }
    }
```


----------



## DarkMo (17. Oktober 2014)

also, ihr habt ja gestern fleissig geschrieben, und ich weis nich mehr, ob ich alles gelesen hatte. aber wegen der editiererei... du kannst dich noch an das missverständnis erinnern? für mich wurde dieses "projekt" (wie wirs getauft haben) eindeutig durch tätigkeit und produkt identifiziert. also diese kombination, machte ein projekt aus. und: mehrere user knnen am selben projekt arbeiten. dann half ich dir, mit diesem "wissen" im hintergrund, die db-struktur zu bauen. das resultat ist nun eben, dass das nich so leicht änderbar ist ^^

es gäbe eine möglichkeit, das recht schmerzfrei zu ändern. also es klingt erstmal schmerzfrei ^^ du müsstest die user-id aus der zeiten tabelle in die projekt-tabelle überführen. die zeiten würden immernoch per projekt-id verknüpft, aber um den user der zeite herauszufinden, müsste man nun eben über die projekttabelle gehen. wie gesagt: das umzubauen in der db ist nicht allzuschwer. es ließe sich sicher auch was schreiben, dass die id's korrekt transferiert. aber im code selber seh ich nen riesen aufwand. da müssten sämtliche (zumindest sehr viele) queries umgebastelt werden, der row_collector müsste angepasst werden, beim speichern neuer daten müsste man anpassen... ist machbar, aber ob das fehlerfrei in den 8h klappt? ^^

aber, andere betrachtung:
wozu alles editierbar machen? folgendes bsp: ich baue ein jahr lang an nem haus. nach diesem jahr entscheide ich mich - ach nö, das war ein motorrad, dass ich aufgebaut hab? also entweder hab ich dran gearbeitet, oder nich ^^ und: auch andere haben ein haus gebaut (ihr eigenes haus, aufgrund des missverständnisses aber, wird alles nur als "hausbau" und nicht "mein hausbau" geführt) - haben die urplötzlich dann alle motorräder gebaut, nur weils einer verwechselt hat? ^^

was könnte man nun also machen?
- auf die schnelle die projektdaten nicht editierbar machen. nur die zeiten können angepasst werden. schnellste lösung, denk ich mal
- die projektdaten nur editierbar machen, wenn es noch keine zeiten dafür gibt.
- die projektdaten nur durch den admin editierbar machen
- oder: zeiten so editierbar machen, dass man sie einem anderen projekt anhängen kann. das kann ein weiterer button sein, der jede zeit der zeile mit ner checkbox versieht und am ende eine selectbox mit den projekten zur verfügung stellt. dann wird für alle angehakten die proj-id geändert. dann kann man ein neues projekt erstellen und die zeiten dorthin schieben.


----------



## boss3D (17. Oktober 2014)

Also im Moment ist es so, dass jeder User seine eigenen Einträge editieren kann (können sollte). 

Worin liegt der Sinn, jetzt entweder nur die Projektdaten oder nur die Zeiten editierbar zu machen? Was, wenn ich mich bei einer Zeit vertippt habe, aber nur Tätigkeiten und Produkte ändern kann?

Alles umbauen kommt jedenfalls nicht mehr infrage, das ginge sich niemals mehr aus in den letzten paar Stunden. Da würden wir nur 1000 Fehler reinbringen und am Ende würde gar nichts mehr gehen. Am liebsten wär's mir immer noch, einfach eine ganze Zeile editierbar zu schaffen. Im Moment kämpfe ich damit, in $add den richtigen Wert zu übertragen, damit das Editieren für mehrere Zeilen klappt. Und dann habe ich rausgefunden, dass das Übertragen der taetprodid über eine SESSION-Variable nur 1x funktioniert, danach wird die Variable anscheinend gelöscht und ist erst wieder leer. Was dann wieder zu 0 in der DB führt.

[EDIT]
Das echo $add hier liefert mir auf jeden Fall den richtigen Wert, bei 2 Zeilen bspw. 2:


Spoiler





```
if (isset($_POST['confirm'])) {
       [COLOR=royalblue] echo 'add = '.$add;        for ($a = 1; $a <= [COLOR=royalblue]$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');");
                $_SESSION['taetprodid'] = mysqli_insert_id($mysqli);
            } 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']."';");
            }
                
            for ($b = 0; $b < 7; $b++) {
                $taetprodid = $_SESSION['taetprodid'];
                $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;");
                }
            }
        }
    }
```



Warum ist dann aber nur 1 Zeile korrekt editierbar?


----------



## DarkMo (17. Oktober 2014)

boss3D schrieb:


> Worin liegt der Sinn, jetzt entweder nur die Projektdaten oder nur die  Zeiten editierbar zu machen? Was, wenn ich mich bei einer Zeit vertippt  habe, aber nur Tätigkeiten und Produkte ändern kann?


 deswegen hab ich geschrieben: zeiten ändern sollte kein ding sein. aber die projektdaten (also tätigkeit und produkt) müssen im jetzigen stand eigentlich unverändert bleiben. und dass der umbau nich in frage kommt, hab ich ja selbst gesagt  aber, optionen wollt ich dennoch mal aufführen.


----------



## boss3D (17. Oktober 2014)

Zeiten ändern ist aber gerade das große Problem!!! Projektdaten ändern funktioniert einwandfrei ...

Ich kriege ja die verdammte taetprodid nicht ins zeiten-query rein!

[EDIT]
Ich behaupte jetzt mal ganz vorsichtig nach ersten Tests, dass sich so zumindest mal 1 ganze Zeile korrekt editieren lässt:



Spoiler





```
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');");
                $_SESSION['prid'] = mysqli_insert_id($mysqli);
            } 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']."';");
            }  
            
            for ($b = 0; $b < 7; $b++) {
                $taetprodid =  $_SESSION['prid'];      
                $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 = '".$_SESSION['prid']."' AND datum = $ts;");
                }
            }
        }
    }
```



Wenn ich jetzt noch rauskriegen würde, wie das auch bei mehreren Zeilen funktioniert, und das dann immer noch fehlerfrei läuft, hätten wir's. Aber SESSIONs sind leider wenig vorhersehbar. Kann sein, dass das ganze schon wieder nicht mehr geht, wenn ich das Programm neustarte oder sonst was mache.

[EDIT2]
Ja, scheint jetzt wirklich zumindest für 1 ganze Zeile (Projektdaten UND Zeiten) einwandfrei zu funktionieren. 

$add kriegt auch den richtigen Wert, woran scheitert es dann also bei mehr als 1 Zeile?


----------



## DarkMo (17. Oktober 2014)

wieso nich das angesprochene hidden feld nutzen? als value die projekt-id und als name projID_$a oder sowas.


----------



## boss3D (17. Oktober 2014)

^^ Bitte konkreter. Was genau soll das bezwecken? Wissen wir überhaupt, wodurch genau das Problem (nicht mehr als 1 Zeile editierbar) wirklich verursacht wird?

Übrigens hätte ich was ähnliches schon auf folgende Weise probiert gehabt, hat aber nur Blödsinn verursacht: "$taetprodid =  $_SESSION['prid'].$a"
----------

Mein Auftraggeber hat sich das ganze gerade angeschaut, und er meint, wenn sich eine einzelne ausgewählte Zeile ganz korrekt editieren lässt (was jetzt eh der Fall ist), dann würde ihm das schon passen. Dafür habe ich beim Testen was anderes unschönes festgestellt, bei dem ich dachte, dass wir das schon gelöst hätten:

In auswerten2.php stimmt die sum-Zeile, die direkt unter der Tabelle aller Datensätze angezeigt wird, eben nur bei ALLEN Datensätzen. Filtere ich nach irgendwas, werden trotzdem für jeden Wochentag die Summen ALLER Einträge angezeigt.


Spoiler





```
$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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        } 
        $tmp1 = 0;       
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[2] = $row_collector[$taet_id]['taet'];
            $tmp1++;
            $tmp2 = count($row_collector);
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';                                  
            }
        } 
        [COLOR=royalblue]if ($tmp1 == $tmp2) {
            echo '  <tr>';
            echo '    <td>∑</td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Zeilen
                $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                $sum2 = mysqli_fetch_row($time_table2);
                if (!$sum2[0]) {
                    echo '    <td style="border:none"></td>';
                } else {
                    echo '    <td>'.$sum2[0].'</td>';
                }
            }        [COLOR=royalblue]    echo '  </tr>';
        }       
    }
```






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ DAS wollen wir schon noch gelöst haben ...

[EDIT]
Wenn ich taetprodid ins WHERE des blauen querys mitreinnnehme und den blauen Code überhaupt rauf in die foreach Schleife reinbastle, dann kriege ich nach jeder Datensatz-Zeile eine Stunden-Zeile für genau diesen Datensatz. Da müsste man die Werte irgendwie addieren und dann aber nur als eine Gesamtzeile ausgeben lassen.

[EDIT2]
Ich versteh's auch irgendwie gerade nicht, wieso wir hier überhaupt ein Problem haben. Eigentlich müsste dieser Teil ...



Spoiler





```
$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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[2] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';
            }          
        } 
        echo '  <tr>';
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Zeilen
            $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
            $sum2 = mysqli_fetch_row($time_table2);
            if (!$sum2[0]) {
                echo '    <td style="border:none"></td>';
            } else {
                echo '    <td>'.$sum2[0].'</td>';
            }
        }
        echo '  </tr>';
```



... doch ohnehin bei jedem neuen Seitenaufbau (was ja durch Filtern passiert) neu berechnet und mit den entsprechenden Daten befüllt werden?! Und der Code macht ja für diese Berechnung der Zeiten aller Tage auch das richtige. Er holt sich nur nicht die Daten gefilterter Datenstätze, sondern bleibt bei der Zeitberechnung bei den Daten ALLER Datensätze, wie sie auf der Vorseite (also vor dem Filtern) angezeigt werden.

???


----------



## DarkMo (18. Oktober 2014)

boss3D schrieb:


> ^^ Bitte konkreter.


 wie, konkreter? ^^

- du hast schon zig inputfelder gebaut, wie das geht, sollte also klar sein.
- du steuerst deine mehrzeiligen inputs über input-namen mit nem $a (also einer zahl am namen angehängt) hinten dran. mein "als name projID_$a" spielte genau darauf an. dachte, das wäre klar.
- nem inputfeld den type hidden statt text zu geben sollte auch nicht schwer sein
- den wert der projekt-id hast du auch irgendwo, das weisst du auf anhieb besser wie ich
- und wo das teil hingehört, sollte auch klar sein. an und für sich isses auch völlig wurscht, WO das teil is. es ist nicht sichtbar und durch namen und nummer eindeutig zu identifizieren.

und was es bringt? du bearbeitest doch die ganzen formularfelder irgendwo. zeile für zeile (für jedes $a). so greiffst du dann einfach aus diesem hiddenfeld die aktuelle id ab und kannst sie verwenden?


----------



## boss3D (19. Oktober 2014)

Ich habe die Fehlerursache schon gefunden, warum immer nur eine Zeile geupdatet wird:


Spoiler





```
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');");
                $_SESSION['prid'] = mysqli_insert_id($mysqli);
            } else {
            	[COLOR="#4169e1"]echo 'prid = '.$_SESSION['prid'].'<br>';                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++) {
            	$taetprodid =  $_SESSION['prid'];      
                $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;");
                }
            }
        }
    }
```



^^ An der blau markierten Stelle kriegt er bei mehreren ausgewählten Einträgen für alle nur die selbe ID rein. Und dann update er eben nur den Eintrag, zu dem die ID gehört. An allen anderen Stellen im Code kriegt er allerdings witzigerweise alle unterschiedlichen korrekten IDs rein.

Muss ich mir also was für diese eine Stelle überlegen. Aber noch sehe ich das "warum" nicht. Warum's nur an dieser einen Stelle nicht klappt ...

Und dann wäre noch das, dass er die Zeiten-Zeile in der Ausgabe nicht neu berechnet.


----------



## boss3D (24. Oktober 2014)

Falls es noch wen interessiert: Ich hab's geschafft, dass man jetzt beliebig viele ausgewählte Einträge (und zwar die gesamten Daten jedes Eintrags ) editieren kann. Der Fehler war wirklich, dass für alle Einträge nur die ID des letztgewählten Eintrages an formular.php übertragen worden ist. Die Lösung war daher auch ganz simpel: Einfach aus der $_SESSION['prid']-Variable ein Array machen und die IDs der Einträge, die ja richtig ermittelt wurden, nacheinander reinschreiben, und dann eben nacheinander wieder auslesen. Dann werden sie nicht überschrieben, wie eben zuvor beim Speichern in einer normalen ($_SESSION-)Variable.

projektzeiterfassung.php:


Spoiler





```
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
            $_SESSION['update'] = 1;

            for ($a = 1; $a <= count($selected); $a++) {    
                $b = $a-1;    
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$b];");
                $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                    
                [COLOR=royalblue]$_SESSION['prid'][B][$a-1][/B] = $selected[$b];                echo '<td>'.$selected[$b].'</td><br>';
                $add = $a;
            }
        }
    }
```



formular.php:



Spoiler





```
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]$prid = $_SESSION['prid'][B][$a-1][/B];            
            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');");
                [COLOR=royalblue]$_SESSION['insert_id'] = mysqli_insert_id($mysqli);            } else {
                mysqli_query($mysqli, "UPDATE
                                            projekte
                                          SET 
                                            taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', userid = $userid, beschreibung = '".$_POST['beschreibung'.$a]."'
                                        WHERE 
                                            id = '".[COLOR=royalblue]$prid."';");
            }  
            
            [COLOR=royalblue]if (isset($_SESSION['prid'][B][$a-1][/B])) {
                   $taetprodid = $prid;
            } else {
                $taetprodid = $_SESSION['insert_id'];
            }            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 = '".[COLOR=royalblue]$taetprodid."' AND datum = $ts;");
                }
            }
        }
    }
```



Damit schaue ich jetzt nur noch, dass ich heute oder morgen noch eine sich der Ausgabe entsprechend neu berechnende Gesamtstunden-pro-Tag-Zeile in auswerten2.php hinkriege, dann kriegt die Firma noch ein kleines Update nachgereicht, und das ganze Programm funktioniert, wie es soll. 


Spoiler





```
$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']]['user'] = $row['User'];
                $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']]['proj'] = $row['prID'];
                $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[2] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = '".$td[0]."';");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';
            }          
        } 
        [COLOR=darkorchid]if (isset($_POST['auswertenall'])) { [COLOR=seagreen]// ATM Zeiten-Zeile wegen sonstiger nicht-neu-Berechnung nur bei "alle" anzeigen            echo '  <tr>';
            echo '    <td>∑</td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            echo '    <td style="border:none"></td>';
            for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { 
                $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = '".$wochentag."';");
                $sum2 = mysqli_fetch_row($time_table2);
                if (!$sum2[0]) {
                    echo '    <td style="border:none"></td>';
                } else {
                    echo '    <td>'.$sum2[0].'</td>';
                }
            }
            echo '  </tr>';
        }    }
```


----------



## boss3D (24. Oktober 2014)

Yesss! Habe das auch noch hingekriegt. War tricky, aber jetzt wird auch die Stundenanzahl pro Tag für jede mögliche Ausgabe neu (und korrekt) berechnet ... 


Spoiler





```
foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[2] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {              
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['user'];
                $td[3] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[4] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                $td[0] = $row_collector[$taet_id]['data'][$prod_id]['proj'];
                $user_id = "SELECT userid FROM projekte WHERE id = '".$td[0]."';";
                $res = mysqli_query($mysqli, $user_id);
                $row = mysqli_fetch_assoc($res);
                for ($j = 0; $j < count($name); $j++) {
                    if ($name[$j] == $row['userid']) {
                        $td[1] = $name[$j+1];
                    }
                }
                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+5] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    } else {
                        $td[$i+5] = ' ';
                    }
                }
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Spalten
                    $time_table1 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE taetprodid = $td[0];");
                    $sum1 = mysqli_fetch_row($time_table1);
                    $td[12] = $sum1[0];
                }
                echo '  <tr>';
                for ($i = 0; $i < count($td); $i++) {
                    echo '    <td>'.$td[$i].'</td>';
                }              
                echo '  </tr>';    
                /*************/
                [COLOR=royalblue]for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) { // Zeilen
                    $time_table2 = mysqli_query($mysqli, "SELECT SUM(zeit) FROM zeiten WHERE datum = $wochentag AND taetprodid = $td[0];");
                    $sum2 = mysqli_fetch_row($time_table2);
                    $day[$wochentag]+=$sum2[0];
                }
                echo '  </tr>';
            }          
        }
        echo '    <td>∑</td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        echo '    <td style="border:none"></td>';
        for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
            echo '    <td>'.$day[$wochentag].'</td>';
        }
```



Damit läuft jetzt das ganze Programm genau so, wie's soll. Ich gehe jetzt noch testen und optimieren. Thx again an BenRo und DarkMo für die Hilfe in der zweiten Projektphase! 




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.


----------



## Rho (24. Oktober 2014)

Zum Glück hat das Trauerspiel doch noch ein Ende gefunden.
Was hat das gesamte Projekt denn letztendlich gekostet?


----------



## boss3D (24. Oktober 2014)

Ziemlich genau 2.486 Nerven und ~3.4 Liter Kaffee ...


----------



## Rho (24. Oktober 2014)

Ach, du wirst nicht bezahlt für deine Arbeit?


----------

