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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
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.
 
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 ...
 
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 :P

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:
<?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:
PHP:
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 ^^
 
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.
 
PHP:
<?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 ;).
 
Zuletzt bearbeitet:
Zu den aufgeteilten Tabellen: Das einzige, das ich wieder nicht kapiere, ist, wie ich an die (automatisch von phpmyadmin generierte) id kommen soll ...
PHP:
$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.
 
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 ^^
 
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:
PHP:
$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.
 
Zuletzt bearbeitet:
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 :D
 
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?!
 
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).
 
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
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 ...
 
Zuletzt bearbeitet:
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.
 
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:
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:
PHP:
// 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.

[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
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.");

    $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>';
    }
?>
 
Zuletzt bearbeitet:
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 ^^
 
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. :)
 
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... :P
 
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. :what:

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?
PHP:
$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?
 
Zurück