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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Ah ja. :klatsch:
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 ...
 
Zuletzt bearbeitet:
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.)
 
Zuletzt bearbeitet:
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
PHP:
$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 ...
PHP:
$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'. ???
 
Zuletzt bearbeitet:
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?
 
Zuletzt bearbeitet:
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:
PHP:
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 ... :(
 
Zuletzt bearbeitet:
PHP:
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.
 
Zuletzt bearbeitet:
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.
 
@ 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.") ...
PHP:
<?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.
 
^^ geht steil vorran :P


gut, zum thema. hatte heute mittag mal bissl gebastelt wegen der "wochen geschichte". hat mich bissl hirnschmalz gekostet, aber nu funzt es:
PHP:
<?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.
 
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.
 
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
 

Anhänge

  • boss-zeit.png
    boss-zeit.png
    14,7 KB · Aufrufe: 146
Zeig mal :D. 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.
 
@ 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.
 
Zuletzt bearbeitet:
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...):
PHP:
  // ...
  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 :P). 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.
 
(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:

Unbenannt.PNG

Waren nur folgende Anpassungen im Code notwendig ...

auswerten.php
PHP:
<?php
    session_start();

    $verbindung = mysql_connect("localhost", "root" , "root") or die ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    
    $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.07.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":

Unbenannt2.PNG

Tabelle "zeiten":

Unbenannt3.PNG

Hier das korrekt angepasste formular.php
PHP:
<?php  
    session_start();
    
    $verbindung = mysql_connect("localhost", "root" , "root") or die  ("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("projektzeiterfassung") or die ("Datenbank konnte nicht ausgewählt werden.");
    
    $user = $_SESSION['name'];   
    $ergebnis = mysql_query("SELECT id FROM user WHERE name='".$user."'");
    $row = mysql_fetch_object($ergebnis);
    $userid = $row->id;
    $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.
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
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 ^^
 
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 ...
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 ...
PHP:
$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:
PHP:
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 ... :huh:
 
Zuletzt bearbeitet:
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:
Code:
          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 = pr.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 ><
PHP:
  $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 :/
 
Ich habe mir gerade mal die letzen Codepostings angesehen und da kam mir direkt das Thema SQL Injection in den Sinn :devil: 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 :D
 
Zurück