# Mein Mini Projekt



## Craganmore (18. Februar 2013)

Guten Abend Community,

Seit Heute beginnt mein Einstiegsqualifizierungsjahr für Sechs Monate als Fachinformatiker für Anwendungsentwicklung. Meine Aufgabe ist es in den Sechs Monaten eine Software zu schreiben, und zwar geht es um Urlaubsanträge für Mitarbeiter. Sie sollen sich einloggen können und eine Übersicht haben wie viele Urlaubstage sie noch haben. Außerdem soll das dann an dem Admin geschickt werden, der die Urlaubsanfrage dann bestätigen bzw. ablehnen kann.

Nun zu meiner Frage, wie bewerkstellige ich das am besten??
Womit fang ich an und was müsste ich dabei alles beachten??

Ich habe minimale Erfahrungen mit HTML, sodass ich mir erst neues Wissen aneignen müsste dafür.

Auf Antworten würde ich mich freuen.


----------



## DarkMo (18. Februar 2013)

meine erste idee wäre eine "webseite" gewesen - und da du html ins spiel bringst, scheint das auch der richtige dampfer zu sein. FALLS dem so is:

html, php, mysql.

für html ist SELFHTML 8.1.2 (HTML-Dateien selbst erstellen) sehr gut geeignet.
für php wiederrum find ich PHP: PHP Manual - Manual nicht schlecht ( PHP: Mysql - Manual zum bsp für ne mysql db anbindung)
und für mysql MySQL :: MySQL 5.1 Referenzhandbuch ( MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.7 SELECT für select als bsp)

als hinweis: das sind dokumentationen und keine tutorials oder anleitungen/bücher. du kannst dort nachschlagen, was es für funktionen gibt und was die wie machen (parameter bla blubb). die dinger sagen dir nicht so wirklich, wie du nen "programm" damit baust. aber nach tutorials googlen dürfte nich das problem sein, denk ich mal.

zur grundfunktion: php ist ein script, dass vom aufbau her c++ oder java und so weiter sehr ähnlich ist. direkt programmiersprachen kann mans wohl aber nicht nennen. man kann mit php eben dynamische webseiten bauen (also von bedingungen/variablen/staus abhängiger aufbau). der server wandelt diese dynamische php datei bei anfrage vom user in eine statische html datei um und sendet diese zum client-browser. man braucht hierfür also einen php-fähigen webserver -> xampp ist hierfür ein top programm. bietet auch gleich ne mysql db mit an. einfach installieren und das gebastel kann losgehn.

gut, nun brauchst du also kentnisse in php um damit html zu schreiben -> du brauchst auch html kenntnisse ^^
in html sieht nen textfeld zum bsp so aus:

```
<textarea>testtext</textarea>
```
in php dann so:

```
<?php
  echo '<textarea>testtext</textarea>';
?>
```
echo gibt eben einfach den string dahinter aus -> es würde das obige statische html liefern. aber gut, das soll fürn anfang reichen. nun musst du also formulare (<form>) einbauen mit eingabemasken der daten. diese daten müssen dann in ne sql db gespeichert werden und ggf auch wieder ausgelesen werden - logisch ^^und: ein loginsystem wäre nicht verkehrt ^^ das mal so als stichpunkte. hoffe, ich konnte dir in gröbsten zügen schonmal helfen. wenn du magst, kann ich morgen mal paar alte projekte ausgraben und etwas konkretere code schnipsel posten


----------



## Craganmore (19. Februar 2013)

Okaay Dankeschön DarkMo.

Ich werde mir dann mal die dokumentationen anschauen und nach Tutorials dafür suchen.

Okaay dann fasse ich mal zusammen, ich brauche für mein Projekt HTML, Php, und Mysql. Mysql ist dann nur für das Loginsystem nötig, um die Benutzernamen bzw. Passwörter in einer Db zu speichern und ggf auszulesen.


----------



## DarkMo (19. Februar 2013)

naja, das auch ^^ aber du willst doch *nachles* ahja, urlaubsanträge speichern/verwalten. ergo musst du mittels html (schlussendlich) ein formular anbieten, dass es den nutzern ermöglicht, ihre anträge zu stellen, und dem admin, diese zu gewähren oder abzulehnen. da das ganze dynamisch passieren muss, wird die seite indirekt über php gebaut. die anträge werden in der db gespeichert und das wars im groben.

als db struktur würden mir jetzt spontan einfach 2 tabellen einfallen: einmal ne user tabelle und einmal ne urlaubs- oder antragstabelle. wie auch immer man das nennt ^^ beim user wird der login gespeichert (also ne personal nummer vllt, oder schlicht und ergreifend der vor/name) sowie die verbleibenden urlaubstage und das passwort (als md5). und bei den anträgen joa... da würde dann per personal nummer (oder id, whatever) die "verknüpfung" zum nutzer gesetzt (also WER stellt den antrag) und dann start und enddatum. achja, nen "flag" eintrag für genehmigt oder nich müsste noch mit hin ^^

joa, das dürfts im groben schon gewesen sein. in php musste dann halt erstmal zur db connecten und dann darauf mittels sql befehlen zugreifen.

verbinden:

```
define('MYSQL_HOST', 'localhost'); // ip - oder hier halt der xampp webserver aufm eigenen rechner
define('MYSQL_USER', 'sql_user_name'); // anmelde name für mysql
define('MYSQL_PASS', 'sql_pw'); // passwort für mysql
define('MYSQL_DATABASE', 'db_name'); // der name der datenbank, auf die man zugreifen will

$error='';
// Verbindung zu MySQL Aufbauen
$verbindung = @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR $error.="Konnte keine Verbindung zur Datenbank herstellen.<br>Fehlermeldung: ".mysql_error();
mysql_select_db(MYSQL_DATABASE) OR $error.="Konnte Datenbank nicht benutzen.<br>Fehlermeldung: ".mysql_error()."\n\n<br><br>";
if($error != '') {
    echo $error;
} else {
    // setze arbeit fort
}
```
hoffe, das is selbsterklärend ^^

sql anfrage stellen:

```
$sql = "SELECT * FROM user WHERE UID = '".$UserID."';";
$res = mysql_query($sql) OR die("Userdaten lesen fehlgeschlagen.<br>".mysql_error());
if(mysql_num_rows($res)) {
    $row = mysql_fetch_assoc($res);
    echo 'Name: '.$row['Name'].', '.$row['Vorname'];
}
```
$sql ist einfach ein string mit der sql anfrage. dieser string (ob direkt oder eben wie her per variablen) wird dann an mysql_query gesendet und die antwort in $res gespeichert. mit mysql_num_rows prüft er dann, ob überhaupt was zurück kam und mit mysql_fetch_assoc wandelt man das res in nen array um, was hier $row benannt wurde. als array-keys gelten dann die spalten namen der tabelle. also, wenn man in einer user-tabelle der db die spalten namen Vorname und Name zum bsp hat, dann greifft man eben im code mittels $row['Name'] zum bsp auf den wert davon zu. man kann damit also dann die werte aus der db auslesen.

das mit dem login is ne härtere nummer ^^ muss ich ma suchen, wo ich das hab. achja: ich hab den tswebeditor immer genommen. nettes kleines progrämmchen. kA was das alles kann  aber es hatte php syntax-hl, das reichte mir


----------



## Craganmore (20. Februar 2013)

Vielen Dank für deine hilfe, das hört sich jaa alles ganz einfach an, ich hoffe ich kriege das hin


----------



## kühlprofi (20. Februar 2013)

Craganmore schrieb:


> Vielen Dank für deine hilfe, das hört sich jaa alles ganz einfach an, ich hoffe ich kriege das hin


 
Wird schon schief gehen. Lade dir doch mal XAMPP heruntern, das ist ein Apache(Web)server inkl MySQL Datenbank. Es sind einige Beispiele vorhanden die du studieren kannst und im Internet findest du auch ziemlich viel darüber.
Für das Login würde ich dir ein Sessionbasiertes Login empfehlen (Gibt viele Tutorials dazu im Netz). Musst du die Benutzer erfassen oder sind diese irgendwo elektronisch bereits erfasst?


----------



## DarkMo (20. Februar 2013)

nuja, das sind ja nur die grundlagen. anwenden musst du die dann selber. bspw die sql befehle anpassen usw. ändert der admin was an nem bestehenden datensatz, muss man UPDATE statt SELECT nehmen als bsp. oder wenn man nen neuen datensatz anlegen möchte, dann INSERT. dafür hoffe ich halt, sind die dokus vom ersten posting nützlich. bei detailfragen kann ich aber sicher immernoch versuchen zu helfen ^^ aber ich will dir das ding ja nich in allen einzelheiten schreiben, sollst ja auch was lernen 

wegen login: im grunde ist es einfach. du legst nen formular an, wo man sich erstmal reggen kann. da kommt also alles rein, was du zu dem speichern möchtest. name, vorname, personummer als bsp. dann natürlich noch ein passwort - fast das wichtigste vergessen *g* wenn du das abschickst, wird per insert alles in die db geschrieben (immer schauen, obs ned schon sonen datensatz gibt) und der user existiert schonmal. nun bietest du noch nen login formular an, wo er zum bsp die personummer oder name (oder whatever) kombiniert mim passwort aufnimmt, und dann vergleichst du einfach, ob beim user mit der personummer (oder oder) das pw stimmt. stimmts, ist er eingeloggt.

das schwierige is hierbei nur: sobald er wieder kilckt, müsste dieser check erneut erfolgen, sonst is er wieder ausgeloggt ^^ also jedesmal, wenn irgendeine seite vom server (durch nen klick auf nen link oder button) erzeugt wird, muss dieser check erfolgen. nur jedesmal son blödes login formular ausfüllen zu müsen oder so, is ned grad prall. ne lösung bieten die sessions an. loggt sich der user ein, wird bei erfolgreichem login ne session gestartet. bei weiteren klicks, wird dann auf diese session geprüft. jetz muss ich selber erst nochma glotzen, wie das alles funzte 

achja: vorweg noch was anderes grundsätzliches zur arbeit mit formularen:
man hat dazu in html ja den <form> tag. für meine login seite hatte ich zum bsp so eins hier:

```
<form name="form" action="index.php?section=login" method="post">
```
der name ist für php relativ uninteressant. wenn man irgendwas mit javascript macht zum bsp, kann man anhand des namens auf dieses element bspw zugreifen. aber wie gesagt - für unsere zwecke erstmal egal. daher auch dieser äusserst sinnvolle name ^^ gut, bei action kommt die url rein, wo das hingeschickt wird. also wenn man einen button drückt, wird diese url aufgerufen - und dort muss man halt irgendwie druff reagieren. an der adresse hier siehste schon eine der besonderheiten die ich meine. als nächstes kommt noch die methode, mit der wir die daten versenden wollen. hier gibt es 2 varianten (soweit ich weis): get und post. bei action siehst du die get-variante. an eine url werden per ? parameter in der form name=value angehängt (mehrere werden dann mittels & verknüpft. 2 parameter würden dann also so aussehen: index.php?param1=value1&param2=value2.

gut, an der zielseite (durch action definiert) kannst du dann mit dem "globalen" array $_GET auf eben jene daten zugreifen. dieses array gibts immer und nimmt eben diese parameter auf (sofern vorhanden). um also value1 zu erhalten, müssten wir $_GET['param1'] abfragen/ausgeben/what ever. die methode is natürlich für formulare unschön. und unsicher ^^ bei passwörtern sollte sich die methode natürlich von allein verbieten - bei größeren formularen bombt man sich die adressleiste zu ><

jo, daher gibts noch methode 2: post. da passiert genau das selbe, nur im hintergrund. zugriff gibts dann nicht über $_GET sondern mittels... na? du wirst es erraten - richtig, $_POST ^^ also bei formularen möglichst immer post verwenden.

noch ein kleiner abschließender tip: bei eingabefeldern für passwörter kommen da ja immer so sternchen oder punkte "mittlerweile". um diesen effekt zu erzielen, nutze dieses input-dingelchen:

```
<input type="password" name="userpw">
```
achja, siehste: der name DIESER elemente ist wichtig. um das klartext-pw bei der "action-seite" zu bekommen, musst du dann $_POST['userpw'] abfragen. also der parametername ist hier der elementname des input-elements. genauso auch alle anderen natürlich.

und wie du gerade lesen konntest: das pw kommt hier ja im klartext an. so sollte man das aber freilich ned speichern. dazu gibts dann die md5 variante. hier mal meine verarbeitung des logins:

```
$login=false;

     session_start();
     session_regenerate_id();

     $ipadresse = $REMOTE_ADDR;

     if(isset($_GET['section']) && $_GET['section']=='login') {
       if(isset($_POST['username'], $_POST['userpw']) && trim($_POST['username'])!='' && trim($_POST['userpw'])!='') {
         $sql="SELECT * FROM user WHERE Login = '".$_POST['username']."';";
         $res = mysql_query($sql) OR die("Account-Name prüfen fehlgeschlagen.<br>".mysql_error());
         if(mysql_num_rows($res)) {
           $row = mysql_fetch_assoc($res);
           if($row['Password']==md5($_POST['userpw'])) {
             $log='Ihr Login war erfolgreich.';
             $login=true;
             setcookie('UserID', $_POST['username'], strtotime("+1 month"));
             setcookie('Password', md5($_POST['userpw']), strtotime("+1 month"));
             $_COOKIE['UserID'] = $_POST['username'];
             $_COOKIE['Password'] = md5($_POST['userpw']);
             $_SESSION['ID'] = $row['ID'];
             $_SESSION['Time'] = strtotime("+10 minutes");
             $_SESSION['IP']=$ipadresse;
             unset($_GET['section']);
           } else
             $log='Falsches Passwort!';
         } else
           $log='Benutzername nicht vorhanden!';
       }
     }
```
zuerst prüfe ich, obs nen get-parameter mit dem namen session gibt. haben wir unser formular da abgeschickt, gibts das (stand ja so bei action dabei). und dann prüf ich noch, ob das teil den wert login hat - hats in unserem falle. als nächstes prüf ich, ob alle angaben "sinnvoll" sind - bei mir also, wenn überhaupt was eingetragen wurde. trim() löscht alle leerzeichen aus einem string. gibt man als pw oder so also "    " ein, dann würde das durchfallen, da nach trim nur "" über bleit ^^ joa, danach hol ich mir aus der db den datensatz dieses users. wenns einen gibt, is ok, ansonsten sagt er halt, das es keinen mit dem benutzernamen gibt. gibts einen, wirds spannend ^^ dann wandeln wir $res wieder in $row um und schauen, ob die pw's "stimmen":

```
if($row['Password']==md5($_POST['userpw']))
```
das pw in der datenbank ist als md5 gespeichert, wir müssen unser POST-pw also jetzt auch umwandeln, um vergleichen zu können -> dazu dient die md5() funktion. falls du nicht weisst, was md5 macht: das erzeugt einen hascode(?) aufgrund des eingegebenen wertes. dieser code ist bei gleicher eingabe immer gleich. also aus "abc" wird IMMER (jetzt nur erfunden) "u4ui54w3" (son hashcode ding is glaub 11 zeichen lang). die zuordnung wert->md5wert ist also immer eindeutig. andersrum funzt das allerdings nicht mehr. kann durchaus auch andere eingabewerte geben, die zum selben md5 code führen. jemand mit dem passwort holla_die_waldfeh könnte also rein zufällig auch den md5 code "u4ui54w3" haben. also abc und holla_die_waldfee führen beide (wie gesagt nur rein exemplarisch) zu "u4ui54w3". wäre dem nicht so, könnte man zu jedem md5 code ja auch das pw wieder bekommen ^^ wäre dann also unsinnig. im gegenzug kanns mit nem extremen zufall aber eben passieren, dass man mit dem falschen passwort dennoch zugriff bekommt. aber wie gesagt - äusserst unwarscheinlich.

kurzer zwischenschub: um in ner db einen wert als md5 zu speichern, musste diesen sql befehl nehmen:

```
$sql= "INSERT INTO user
                 (UName, Password)
             VALUES
                 ('".addslashes(htmlspecialchars($_POST['Username']))."',
                  MD5('".$_POST['Userpw']."'));";
      mysql_query($sql) OR die("Fehler beim Schreiben der Daten!<br>".mysql_error());
      echo '<b>Registrierung erfolgreich! Sie können sich nun einloggen.</b>';
```
also INSERT INTO <tabellen-name> (<param1> ... , <paramN>) VALUES (<value1> ... , <valueN>);. und um nun das ganze als md5 zu speichern -> einfach MD5(<value>). die spalte der db muss dann glaub ich als long mit 11 zeichenlänge eingestellt sein. oder 32? irgendwie sowas >< ach ok, 32 war richtig, aber so: varchar(32) <- das format brauch die spalte dann. was dir auch auffallen dürfte: addslashes und htmlspecialchars. die sorgen wiederrum für sicherheit. ganz wichtig! man kann da nämlich ganz locker selber sql code in son eingabefeld tippseln und damit (webnn mans geschickt macht) den im php-code stehenden sql befehl erweitern und somit schundfug treiben. htmlspecialchars sorgt glaub ich dafür, dass eben sonderzeichen in diese html dinger umgewandelt werden. also aus < wird < usw (wenn ich jetz ma keinen blödsinn erzähl ^^). und addslashes baut überall \ <- slash davor. das bewirkt, dass befehle unwirksam werden. nen \SELECT kann ne db ned mehr auswerten ^^ im umkehrschluss muss man dann beim auslesen den krempel wieder entfernen. wie war denn dass nu wieder >< ahja, einfach stripslashes().

gut, so also vergleicht man dann erstmal das pw. failt dieser vergleich, wird ausgegeben, dass dass pw falsch war. für den user ist das hilfreich zu wissen, ob nu pw oder username falsch war - für nen hacker aber notfalls auch ^^ daher ist diese variante nicht unbedingt zu bevorzugen. die viel gehasste simple aussage "nutzername oder pw falsch" ist also die sicherere variante.

weiter: danach kommt das ganze zeugst mit der session. um die session nutzen zu können, muss man erstmal (was ganz am anfang steht) das ganze starten und das regenerate_id ding ist auch wieder was zur sicherheit. da wird die session-id immer geändert oder so. das is zu lange her, wo mir das nen kumpel erklärt hatte >< jedenfalls ändert sich das eben dann bei jedem seiten laden und ist somit schwerer zu hacken. irgendwie so war das.

gut, mit setcookie baust du ein cookie eben. da kommt der name (parametername als vergleich zum bsp), nen wert (parametervalue bla) und ne lebensdauer des cookies rein. ich bau hier 2e, eins mim loginnamen und eins mit dem verschlüsselten pw. zudem fülle ich noch die "globalen" arrays $_COOKIE und $_SESSION mit werten. tme bei session war glaube für mich der inaktivitäts timer. also nach 10 mins erfolgt autologout. sprich, macht man 10 mins nix mehr und lickt in der 11. erst wieder was, dann wird man als ausgeloggt gewertet und das ganze zählt nich mehr.

gut, ok. nu haben wir uns also eingeloggt und alles schön. aber wir müssen die gelegte fährte ja auch wieder aufnehmen. dazu dann dieser codeschnipsel:

```
if(isset($_COOKIE['UserID'], $_COOKIE['Password']) || (isset($_SESSION['ID']) && trim($_SESSION['ID'])!=0)) {
       $login=false;

       $sql_chk = "SELECT * FROM user WHERE Login='".$_COOKIE['UserID']."' AND Password = '".$_COOKIE['Password']."';";
       $res_chk = mysql_query($sql_chk) OR die("Accountkontrolle fehlgeschlagen.<br>".mysql_error());
       if(mysql_num_rows($res_chk)) {
         if(isset($_SESSION['IP']) && $_SESSION['IP']==$ipadresse) $ip=true;
         else if(isset($_SESSION['IP'])){
           $ip=false;
           unset($_SESSION);
           $logout=logout();
           $check='Ihre Sitzung wurde durch einen IP-Wechsel beendet, bitte loggen Sie sich erneut ein. <a href="?section=login" class="menu">Einloggen</a><br>';
         } else
           $ip=false;

         if(isset($_SESSION['ID']) && trim($_SESSION['ID'])!=0) {
           if(isset($_SESSION['Time']) && trim($_SESSION['Time'])>=time()) {
             $_SESSION['Time'] = strtotime("+10 minutes");
             $row_chk = mysql_fetch_assoc($res_chk);
             $login=true;
             $sql_upd = "UPDATE
                             user
                         SET
                             LastOn = '".time()."'
                         WHERE
                             ID = '".$user['ID']."';";
             mysql_query($sql_upd) OR die("Fehler beim Aktualisieren des Guthabens!<br>".mysql_error());
           } else {
             $logout=logout();
             $check='Ihre Sitzung ist abgelaufen, bitte loggen Sie sich erneut ein. <a href="?section=login" class="menu">Einloggen</a><br>';
           }
         }
       }
     }
```
ich schau also nach, ob mein cookie zeugs da ist und schau dann, obs den im cookie stehenden user auch gibt. ich logge den quasi über die cookie infos ein. dann schau ich noch, ob die ip stimmt. hat der kerl plötzlich ne andere ip, ausloggen! isses der richtige, wird er sich scho wieder einloggen, isses der falsche, kann er die "sitzung" nicht übernehmen. dann schau ich noch, ob diese 10 mins nich scho überschritten wurden und bei mir hab ich dann noch geupdated, dass der kerl jetzt zuletzt on war. kann man dann ne online anzeige in nem forum zum bsp verwirklichen. war der kerl innerhalb der letzten 5 mins on, wird er als on dargestellt im forum. als bsp. oder eben simpel nen nachweis der aktivität für clans oder what ever.

gut, wie gesagt, das mit dem login is harter tobak und ich hoff ich hab nich allzuviel mist erzählt, aber bei mir funzt das jedenfalls ganz gut >< aber andere können hier gerne auch noch was dazu sagen. berichtigen, ergänzen oder oder ^^


----------



## Craganmore (20. Februar 2013)

XAMPP habe ich zuhause schon, aber in der Firma noch nicht.

Das Sessionbasierte Login werde ich mir mal anschauen. Also die Firma hat schon eine riesige Datenbank darauf kann ich aber net zugreifen.


----------



## Craganmore (20. Februar 2013)

Wow, echt klasse Arbeit @DarkMo

Das wird jz erstmal dauern, bis ich das gelesen und verstanden habe  

Und wird mir bestimmt ganz gut weiterhelfen 

EDIT: Ahh verdammt, jz habe ich nen Doppelpost, sry


----------



## kühlprofi (20. Februar 2013)

Sehr gut beschrieben DarkMo,(finde das immer so schwer sowas zu beschreiben )! Finde auch toll, dass du die MD5 Funktion erklärt hast . Einiges könnte man natürlich auch abgespeckter verwenden, z.B. die Cookie-Geschichte wäre ja nicht unbedingt ein "Muss", da die Seite ja sowieso nur Firmenintern aufgerufen werden kann/sollte. 
Tablets haben ja oft die Einstellung Cookies "nicht annehmen" aktiviert, das könnte zu Problemen führen. 
Craganmore, sind die Tablets denn Firmenzubehört und können nach deinem Geschmack frei konfiguriert werden?
Eine Seite für x verschiedene Tablets zu schreiben ist nicht ganz einfach, schon nur vom Layout her. (Verschiedene Auflösungen, Bildschirmgrössen, Browser! etc.)
Da ihr ja bereits Datenbanken habt, habt ihr auch einen oder mehrere Datenbank-Server. Du solltest dich mal schlau machen um was für Datenbanken es sich dort handelt und ob du auf einem Server eine Datenbank anlegen darfst. Ebenfalls müsstest du in Erfahrung bringen in wiefern das Wireless eurer Firma mit der restlichen Infrastruktur kommunizieren kann. Evtl. habt ihr ja nur ein Wifi an ein simples DSL Modem und du kannst die Server gar nicht erreichen?

Wenn das so wäre müsstest du sehr wahrscheinlich einen externen Hoster mieten, diese bieten in der Regel auch gleich einen MySQL-Server mit einem Administratorinterface, PHP etc.an Für ganz Simple Datenbankstrukturen könnte eventuell auch die eine Flat File Database was für dich sein. Da schreibst du alle Daten in ein z.B. Textfile und liest dies wiederum aus und kannst es formatieren etc. Nachteil ist, dass dir tolle Funktionen eines SQL-Servers fehlen und du diese quasi selbst implementieren musst. Vorteil ist, dass du dazu keinen SQL-Server benötigst und Mutationen ggf. direkt in einem Textfile vornehmen kannst...


----------



## Craganmore (20. Februar 2013)

@kühlprofi welche Tablets 

EDIT: Wie fügst du deine Codeschnipsel ein @DarkMo ??


----------



## Anubis12334 (21. Februar 2013)

Noch ein kleiner aber wichtiger Tipp:
Ich empfehle dir hier eine sorgfältige Programmplanung. 
Die Anbindung an die Datenbank, welche Daten sollen gespeichert werden, die Anbindung an ein externes Netzwerk ... bevor du nicht weist, das du den Webserver in deiner Firma und Datenbank XY verwendest solltest du nicht anfangen zu programmieren. Diese ganzen äußeren Umstände deines Projekts solltest du abklären bevor du die erste Klasse schreibst, denn was bringt es dir wenn du alles auf MYSQL am funktionieren hat aber am Schluss der Server nur MSSQL hat? Auch beim Programmieren an sich solltest du natürlich einen Plan haben, welche Methoden du brauchst, welche Funktionen du bereitstellen willst, statisches/dynamisches Layout ... gerade bei Php besteht z.b. die Gefahr als Anfänger einfach mal alles in 1-2 Dateien zu packen.

tl,dr;plane das Projekt bevor du programmierst.


----------



## Craganmore (21. Februar 2013)

Jaa da hast du Recht Anubis, meine Arbeitskollegen haben mir auch gesgat, ich sollte mir erst eine Übersicht machen. Womit will ich anfangen, was brauch ich dafür. welche Methoden + Funktionen usw.
Bin auch grad dabei sowas anzufertigen.


----------



## DarkMo (21. Februar 2013)

ich geh da immer ganz simpel vor. ich fang mit nem projekt meist so an, dass ich die einzelschritte, die ich machen will, als kommentar hinschreib. also zum bsp fang ich ganz grob an mit:


```
// db verbindungsdaten anlegen
// mit db verbinden
// eine startseite basteln
// eine registrieren seite basteln
// eine login seite basteln
...
```

dann mach mich mir nähere gedanken und konkretisiere das ganze:

```
// db verbindungsdaten anlegen
// mit db verbinden
// eine startseite basteln
  // ein menü bauen
// eine registrieren seite basteln
  // formular mit den registrations daten name, vorname, personalnummer, passwort... bauen
// eine login seite basteln
  // ein formular mit den login infos personalnummer und passwort bauen
...
```

geht jetz in dem fall natürlich noch simpel. hier würd ich als nächstes schon glatt unter die einzelnen kommentare den code einfügen. bei schwierigeren algorythmen (irgendwas berechnen oder was weis ich) fang ich auch immer mit grundgedanken an und konkretisiere die stück für stück. bei diesen überlegungen findet man auch ganz gut lücken in der eigenen vorstellung. wo hängts, wie kann ich das umschiffen usw. und wenn man dann der meinung ist, man hat alle probleme soweit komentarisch durchdacht, "ersetzt" man die kommentare durch code. also weniger ersetzen, man schreibt einfach unter den kommentar den code. vorteil für später: eine dokumentation des codes durch kommentare in den grundzügen ist schon gemacht ^^


----------



## Craganmore (28. Februar 2013)

Soo, ich bin jz eig. soweit fertig mit meinem Layout der Seite. 
Ich muss halt noch meinen Bildern per Javascript die richtige größe geben, den bei jedem ist ja der Browser anders von der größe her. 
Hat da einer ne Idee wie das geht?? Müsste ja mit .Innerwidth() gehen aber ich versteh noch net wie ich dem dann per Css sage, das er die Bildgröße immer anpassen soll.


----------



## milesdavis (3. März 2013)

Machs am besten mit jQuery, da gibts eine resize funktion. Das geht damit easy:
Du bindest jquery zuerst ein und dann schreibst du eine neue js-Datei:

$(document).ready(function(){

var neue_hoehe = $(window).outerHeight() / 2;
var neue_breite = $(window).outerWidth() / 2;
$("#id_deines_bildes").css("width",neue_breite+"px").css("height",neue_hoehe+"px");

$(window).resize(function(){
var neue_hoehe = $(window).outerHeight() / 2;
var neue_breite = $(window).outerWidth() / 2;
$("#id_deines_bildes").css("width",neue_breite+"px").css("height",neue_hoehe+"px");
});

});

Das müsste so klappen.


----------



## Craganmore (4. April 2013)

Ich bräuchte nochmal eure Hilfe, auf meiner Register.php möchte ich, dass wenn das Formular nicht vollständig ausgefüllt ist , eine error Message kommt. 
Sowie Passwörter stimmen nicht überein usw. Problem ist halt, ich bekomm alles angezeigt bis auf "Das Formular wurde nicht vollständiig ausgefüllt. 
Wo ist mein Denkfehler in meinem code??


<?php

    function checkRegister () {
        $data['message'] = "Das Formular wurde nicht vollständig ausgefüllt";
        $data['class'] = 'error';

        $user = htmlspecialchars($_POST['username']);
        $pass = $_POST['password'];
        $email = $_POST['email'];

        if(isset($_POST['username'])
            && $_POST['username']
            && isset($_POST['password'])
            && $_POST['password']
            && isset($_POST['email'])
            && $_POST['email']
        ) {
        }
            if($_POST['pass'][0] != $_POST['pass'][1]) {
                $data['message']=utf8_decode("Die Passwörter stimmen nicht überein");
                return $data;
            }
            if(strlen($_POST['username']) > 20) {
                $data['message']="Der Benutzername ist zu lang";
                return $data;
            }

            if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
            $data['message']=utf8_decode("Die E-mail Adresse ist ungültig");
            return $data;
            }

            $pass= md5($_POST['pass'][0]);
            $_POST['username'] = trim($_POST['username']);

            if(!$verbindung = mysql_connect("localhost", "root", "hygi")) {
                $data['message'] = "Verbindung mit dem Datenbankserver konnte nicht hergestellt werden";
                return $data;
            }
            if(!mysql_select_db("holyday")) {
                $data['message'] = "Verbindung mit der Datenbank nicht vorhanden";
                return $data;

            }
            $sql = "SELECT user FROM user WHERE user ='". $user . "'";
            if($ergebnis = mysql_fetch_object(mysql_query($sql))) {
                $data['message'] = "Der Benutzername ist bereits vergeben";
                return $data;
            } else {
                $sql = "INSERT INTO user (user, pass, mail)
                      VALUES ('". $user ."', '". $pass ."', '". $email ."')";

                if(mysql_query($sql)) {
                    $data['message'] = utf8_decode('Das Benutzerkonto <span class="newUser">'.$user.'</span> wurde erfolgreich angelegt');
                    $data['class'] = "";
                }   return $data;
            }

}

?>


----------



## DarkMo (4. April 2013)

pack sowas mal bitte in nen php-block ^^


```
<?php
 
    function checkRegister () {
        $data['message'] = "Das Formular wurde nicht vollständig ausgefüllt";
        $data['class'] = 'error';
 
        $user = htmlspecialchars($_POST['username']);
        $pass = $_POST['password'];
        $email = $_POST['email'];
 
        if(isset($_POST['username'])
            && $_POST['username']
            && isset($_POST['password'])
            && $_POST['password']
            && isset($_POST['email'])
            && $_POST['email']
        ) {
        }
            if($_POST['pass'][0] != $_POST['pass'][1]) {
                $data['message']=utf8_decode("Die Passwörter stimmen nicht überein");
                return $data;
            }
            if(strlen($_POST['username']) > 20) {
                $data['message']="Der Benutzername ist zu lang";
                return $data;
            }
 
            if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
            $data['message']=utf8_decode("Die E-mail Adresse ist ungültig");
            return $data;
            }
 
            $pass= md5($_POST['pass'][0]);
            $_POST['username'] = trim($_POST['username']);
 
            if(!$verbindung = mysql_connect("localhost", "root", "hygi")) {
                $data['message'] = "Verbindung mit dem Datenbankserver konnte nicht hergestellt werden";
                return $data;
            }
            if(!mysql_select_db("holyday")) {
                $data['message'] = "Verbindung mit der Datenbank nicht vorhanden";
                return $data;
 
            }
            $sql = "SELECT user FROM user WHERE user ='". $user . "'";
            if($ergebnis = mysql_fetch_object(mysql_query($sql))) {
                $data['message'] = "Der Benutzername ist bereits vergeben";
                return $data;
            } else {
                $sql = "INSERT INTO user (user, pass, mail)
                      VALUES ('". $user ."', '". $pass ."', '". $email ."')";
 
                if(mysql_query($sql)) {
                    $data['message'] = utf8_decode('Das Benutzerkonto  <span class="newUser">'.$user.'</span> wurde erfolgreich  angelegt');
                    $data['class'] = "";
                }   return $data;
            }
 
}
 
?>
```

hmm, hier kommt mir schonmal was seltsam vor:

```
if(isset($_POST['username'])
            && $_POST['username']
            && isset($_POST['password'])
            && $_POST['password']
            && isset($_POST['email'])
            && $_POST['email']
        ) {
        }
```
du öffnest den block und schließt ihn gleich wieder? mit isset() kannst du auch mehrere gleichzeitig prüfen: isset($_POST['username'], $_POST['password'], $_POST['email']) - da sparste die paar && ^^ zudem ist $_POST['username'] usw auch nich grad zielführend. wenn musst du sowas fragen: $_POST['password'] <> ''; (also nicht leer). wenn das erfüllt ist, arbeitest du weiter, andernfalls (else) kommt eben die ausgabe, das nicht alles ausgefüllt wurde. du solltest eventuell auch weniger $_POST['password'] <> ''; prüfen, sondern eher trim($_POST['password']) <> ''; - da werden dann überflüssige leerzeichen gelöscht. eingaben wie "   " werden somit auch gefiltert.


----------



## Craganmore (4. April 2013)

Jaa, das ich den block sofort wieder schließe fand ich auch komisch, nur wenn ich das net mache kommt überhaupt keine Meldung


----------



## Craganmore (26. April 2013)

Bin grade am Rechtesystem dran. kennt sich hier einer mit Zend-Acl aus?


----------



## Craganmore (24. Mai 2013)

Da bin ich nochmal. Bin im mom dabei meine Anträge Verwalten Seite fertigzustellen. Habe eine Db mit User, start/endDatum, und created als spalten. Diese gebe ich dann in einer Tabelle auf der Seite aus, sodass der Admin halt die Anträge sieht, die gestellt worden sind. Nun bräuchte ich noch ne Funktion, das der Admin diese Anträge annehmen/ablehnen kann, weiß aber noch net wie ich das machen soll. Brauch ich da in meiner Tabelle noch 2 Spalten mit den sogennanten Buttons? Und der Member der den Antrag gestellt hat, der muss ja auch irgendwie benachrichtigt werden?


----------



## DarkMo (24. Mai 2013)

is die frage, was damit geschehen soll. wenn die anträge aufgehoben werden sollen, brauchst du an und für sich nur ne "flag variable". also hängst der tabelle noch die spalte "angenommen" (oder wie auch immer du sie bennen magst) an und gibst dem ding beim antrag erstellen den wert 0. nimmt der admin das dingen nun an, wird der wert auf 1 gesetzt, lehnt ers ab, wird der auf 2 gesetzt - jetz nur als bsp. am ende kannste dem user alle anträge ausgeben lassen, die von ihm sind und anhand des wertes hier den status ausgeben. 0 eben offen, 1 angenommen und 2 abgelehnt.

oder du "verschiebst" alle akzeptierten in ne extra tabelle, ginge auch ^^


----------

