PHP Anwesenheitsliste mit KW-Auswahl

Gnörl

Lt. Junior Grade
Registriert
Mai 2009
Beiträge
450
Hallo Community,

ich weiß gerade nicht mehr so richtig weiter...

Ich habe die Aufgabe eine "Mitarbeiter Anwesenheitsaufstellung" zu erstellen. Die Daten dazu werden mittels PHP-Script in die Datenbank eingetragen und diese Daten sollen nun am besten "Druck-konform" im Browser ausgegeben und gedruckt werden können.

Der Aufbau der Tabelle wäre folgender:

Nr - Uhrzeit - Name - Montag - Dienstag - Mittwoch - Donnerstag - Freitag - Samstag - Sonntag​

  • Nr: Aufsteigende Nummerierung, bis alle Mitarbeiter gelistet sind
  • Uhrzeit: $Arbeitsbeginn (Tabelle mitarbeiter)
  • Name: $Name (Tabelle mitarbeiter)
  • Montag - Sonntag: Output der jeweiligen Ankunft des Mitarbeiters ($Mitarbeiternummer + $AnfangsID + $Anfangszeit aus Tabelle anfangszeiten)

Außerdem soll hinter Montag - Sonntag jeweils das entsprechende Datum stehen, sowie eine Kalenderwochen-Auswahl vorhanden sein. Unter den jeweiligen Tagen steht dann eben die entsprechende Uhrzeit, zu der die Mitarbeiter erschienen sind.

Mein Problem ist, ich habe bisher PHP-Scripts für meine Zwecke anpassen können, aber musste nie selbst etwas in dem Umfang zusammen schustern. Hierbei habe ich gerade absolut keine Ahnung, wie ich das im Code umsetzen soll.

Zum einen müsste irgendwie eine Kalenderwochenauswahl rein bekommen... Zum anderen werde ich wohl eine Schleife einbauen müssen, die basierend auf den Output der KW-Datumsangaben für die jeweiligen Tage für jeden Mitarbeiter die entsprechende Zeit aus der Datenbank übernimmt ~ Sollte kein Eintrag für einen Tag vorhanden sein, bleibt das Feld einfach leer. - So viel zur Theorie.

Im Zusammenhang mit der ganzen Anforderung habe ich jetzt nichts finden können, was mir effektiv weiterhilft, oder was mir einen "AHA!"-Effekt vermittelt hat.

Wenn also wer Vorschläge/Links oder gar eine Lösung parat hätte, wäre ich echt dankbar..
 
Ich würde als erstes eine Datenbank aufsetzen, dann ein paar Beispieldaten über phpMyAdmin eintragen und dann erst einmal die Übersicht bauen. Sprich: Auslesen mit einer Schleife, wie du schon sagtest und die Tabelle entsprechend aufbauen/generieren lassen.

Als Druckmöglichkeit könnte man, wenn man keine besondere Farbe o.ä. haben will, mit eine print.css die Druckausgabe steuern. Wenn man es ganz fein und sauber haben will, bastelt man sich die Ausgabe mit fpdf oder anderer Systeme zusammen.

Wenn das alles klappt, kannst du noch ein Formular einbauen, worüber die User alles eintragen.
Eine Kalenderwochenauswahl kannst du per MySQL direkt schon im Query benutzen, so dass du direkt die passenden Daten bekommst. In PHP kannst du dies mit date() machen.
 
@knoedeley Die Datenbank steht schon, ein Script zum Eintragen ist ebenfalls schon vorhanden - es geht wirklich nur noch um das pure anzeigen einer Wöchentlichen Zusammenfassung für jeden Mitarbeiter auf einer Liste.

Die Druckmöglichkeit ist aktuell der geringste Punkt, da bei passender Anzeige ja auch einfach die Seite aus der Browseransicht ausgedruckt werden kann. - Mit Druck-konform meinte ich ledigtlich, dass es eine hübsche Tabelle werden soll.

date() werde ich mir auf jeden Fall mal genauer ansehen.

Wie gesagt, mein Hauptproblem liegt in der Programmier-Praxis - in der Theorie weiß ich halbwegs wie ich es programmieren muss :D Nur Theorie und Praxis sind ja 2 paar Schuhe :/ Bin eben kein Programmierer.

Aber Danke schon mal für die Antwort! :)
 
<?PHP
<table>
mysql abfrage - schleife
{
echo ("<tr><td>$Mitarbeiter</td></tr><tr><td>$Zeit</td></tr>");
}
</table>
?>

Solltest du im Echo noch Anführungszeichen brauchen, so kannst du diese escapen mit \
Sprich \" , dann zählt das " nicht als Ende vom Echo. :)

Aber andere werden dir sicher noch bessere Scriptzeilen zuwerfen, ich kann erst später Zuhause mal schauen.
 
@Umbel: Ich bin halt leider Gottes seit kurzem der einzige IT'ler (Admin) hier in der Firma und muss zukünftig auch diverse Programmier-Arbeiten übernehmen. Entsprechend muss ich mir das Zeug nun (bereitwillig) selbst beibringen. Ist halt ein ziemlicher Start von 0 auf 100 (mehr oder weniger).

@Dome87: Nichts! :D

@Suxxess: Die Tabelle selber habe ich mir schon formen können - der Umgang mit HTML ist mir ja zumindest nicht neu. :D Die Tabelle aber jetzt mit den entsprechenden Daten (durch entsprechender Auswahl) zu füllen, ist mein Problem...
 
wie ist den die datenbanktabelle aufgebaut? ca so:
id(aufsteigend), MA-Name, Ankunftszeitpunkt(welches format?)

als beispiel würde dann in der db stehen:
1,bob,04.05.2014 05:30
2,bob,05.05.2014 06:30
3,helga,05.05.2014 06:35

ist die dbtabelle unendlich weiterlaufend, oder wird sie jede woche zurückgesetzt?

das ist für die erstellung eines sinnvollen querys bzw. sql-abfrage wichtig.

sobald der steht ist der rest relativ simple und kann ca so aufgebaut werden:

PHP:
$count=0;
echo "<table>";

while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
  echo "<tr><td>"+$count+"</td><td>"+$row["name"]+"</td><td>"+$row["montag"]+"</td><td>"+$row["dienstag"]...+"</tr>");
 $count++;
}
echo "</table";
mysql_free_result($result);
?>

bei der $uhrzeit bin ich mir nicht sicher was gemeint ist. ist das eine soll-beginns arbeitszeit?
 
Es sind am Ende 2 Datenbanken

mitarbeiter
  • Mitarbeiternummer (Personal Nr.)
  • Arbeitsbeginn (Uhrzeit, wann der Mitarbeiter regulär anfängt)
  • Name
  • noch ein paar andere Datensätze die aber uninteressant für die Anwendung sind

Aufbau

Mitarbeiternummer, Name, Arbeitsbeginn
1, shadow, 09:00:00

anfangszeiten
  • Mitarbeiternummer (wird zur Mitarbeiterzuweisung per Script aus "mitarbeiter" mit entsprechenden Daten eingetragen
  • AnfangsID (unendlich aufsteigende "Index-Nr." um für jeden Zeiteintrag eine eindeutige ID zu haben
  • Anfangszeit (YYYY-MM-TT HH:MM:SS)

Aufbau

Mitarbeiternummer, AnfangsID,Anfangszeit
1,10,2014-04-10 16:19:20

Die Ausgabetabelle sieht dann meinetwegen so aus:

Nr - Uhrzeit - Name - Montag - Dienstag - Mittwoch - Donnerstag - Freitag - Samstag - Sonntag
1 - 9:00 - Shadow - 08:45 - 08:50 - 08:59 - 07:00 - 09:09 - LEER - LEER
2 - 8:00 - Hans - 07:45 - 07:50 - 06:59 - 07:00 - 09:00 - LEER - LEER

So, bin erstmal nicht mehr im Thread - schaue in ner Stunde ca. wieder rein. Danke noch mal für die Antworten :)
 
PHP:
<?PHP
$dbname="";
$dbhost="localhost";
$dbuser="";
$dbpass="";
mysql_connect($dbhost,$dbuser,$dbpass) or die ("Keine Verbindung moeglich");
mysql_select_db($dbname) or die ("Die Datenbank existiert nicht.");

if (!isset($_GET['mitarbeiter'])){ $mitarbeiter =  1; }
else { $mitarbeiter = $_GET['mitarbeiter']; }

$query = "SELECT * FROM table WHERE id = $mitarbeiter";
?>
<form action="index.php" method="get">
  <p>Ihre Mitarbeiterauswahl:</p>
  <p>
    <select name="mitarbeiter" size="1">
      <option value="Hans">Hans</option>
      <option value="Peter">Peter</option>
      <option value="Kim">Kim</option>
    </select>
  </p>
<input type="submit" value=" Absenden ">
<input type="reset" value=" Abbrechen">
</form>

 <table>
    <tr>Nr.</tr>
    <tr>Uhrzeit</tr>
    <tr>Name</tr>
 <?PHP
$result = mysql_query($query);
while ($line = mysql_fetch_array($result))
{
$nr=$line[nr];
$uhrzeit=$line[uhrzeit];

echo("<tr><td>$nr</td></tr><tr><td>$uhrzeit</td></tr><tr><td>$name</td></tr>");
}
?>
</table>
</div>
</div>
?>

So ich habe dir das Wichtigste mal rausgekramt. Keine Garantie auf Korrektheit, habe es nicht getestet. Da sind mit Sicherheit ein paar Fehler drin. Aber der grundlegende Aufbau sollte zu erkennen sein.
 
Zuletzt bearbeitet:
Alles, was mit mysql_ anfängt, ist ein Fehler. Außerdem fehlen bei deinen Arrays (Zeile 35, 36) die Anführungszeichen bei den Schlüsseln.
 
Guten Morgen,

danke für den ausführlichen Code, auch wenn da Fehler drin sein sollten. Ich kann mir den Code im Grundlegenden interpretieren und es entsprechend in meinem Script umsetzen - wollte ja auch nicht, dass mir hier jemand das komplette Script vorkaut -will ja selbst etwas dabei lernen.

Ich weiß allerdings nicht ob ich heute dazu komme... werde mir die Arbeit wohl fürs Wochenende mit nach Hause nehmen.
 
Nase schrieb:
Alles, was mit mysql_ anfängt, ist ein Fehler. Außerdem fehlen bei deinen Arrays (Zeile 35, 36) die Anführungszeichen bei den Schlüsseln.
Stehst wohl eher auf Maria, der jüngeren Schwester mit den gewissen Optimierungen? Der man nachsagt, dass sie noch viel geiler sei als die alte Schwester? Und alle wollen mit ihr zusammen sein wie Facebook, Google und Wikipedia. :D

P.S.
MariaDB ist eine kompatible Datenbank und eine Alternative zu Mysql. :P
 
Das hat nicht mit Maria zu tun... Entweder mysqli_ oder noch besser pdo...

mysql_ ist veraltet
 
also so wie ich es sehe war der code von Suxxess darauf ausgelegt, dass man den jeweiligen mitarbeiter davor auswählt und dann die zeiten des einzelnen mitarbeiters angezeigt bekommt.
hier anbei noch eine variante, die alle mitarbeiter untereinander anzeigt (analog deinem beispiel) und deren zeiten in der aktuellen kalenderwoche.
hab als basis den code von Suxxess genommmen und umgebaut. genau wie bei ihm: alles ungetestet und fehlerbehaftet^^

PHP:
<?PHP
$dbname="";
$dbhost="localhost";
$dbuser="";
$dbpass="";
mysql_connect($dbhost,$dbuser,$dbpass) or die ("Keine Verbindung moeglich");
mysql_select_db($dbname) or die ("Die Datenbank existiert nicht.");
 

$KW_aktuell = date('W');
$query = "SELECT
    Mitarbeiternummer, Name, Arbeitsbeginn 
    Anfangszeit  = STUFF((
        SELECT ', ' + Anfangszeit  FROM anfangszeiten WHERE anfangszeiten.Mitarbeiternummer  = mitarbeiter.Mitarbeiternummer 
        FOR XML PATH ('')),1,2,'') where DATE_FORMAT(Anfangszeit,'%u') = " + $KW_aktuell + "
FROM mitarbeiter"; 

echo 'Kalenderwoche: '  + $KW_aktuell;
?>
 
 <table>
 <tr>
    <th>Nr.</th>
    <th>Uhrzeit</th>
    <th>Name</th>
	<th>Montag</th>
	<th>Dienstag</th>
	<th>Mittwoch</th>
	<th>Donnerstag</th>
	<th>Freitag</th>
	<th>Samstag</th>
	<th>Sonntag</th>
</tr>
 <?PHP
 $count = 1;
$result = mysql_query($query);
while ($line = mysql_fetch_array($result))
{
	$dArray = explode(',',$line['Anfangszeit']);

	foreach ($dArray as $value)
	  {
		$wArray[date('l',$value)] = date('H:i',$value);
	  }

	echo "<tr>";
	echo "<td>"+$count +"</td>";
    echo "<td>"+$line['Arbeitsbeginn']+"</td>";
    echo "<td>"+$line['Name']+"</td>";
	echo "<td>"+$wArray['Monday']+"</td>";
	echo "<td>"+$wArray['Tuesday']+"</td>";
	echo "<td>"+$wArray['Wensday']+"</td>";
	echo "<td>"+$wArray['Thursday']+"</td>";
	echo "<td>"+$wArray['Friday']+"</td>";
	echo "<td>"+$wArray['Saturday']+"</td>";
	echo "<td>"+$wArray['Sunday']+"</td>";
	echo "</tr>";
$count++;
unset($dArray);
unset($wArray);


}
?>
</table>
 
Zuletzt bearbeitet:
thecain schrieb:
Das hat nicht mit Maria zu tun... Entweder mysqli_ oder noch besser pdo...
Da gebe ich dir natürlich Recht, aber für eine interne Mitarbeiterliste sollte es reichen. Der mögliche Gewinn durch eine SQL-Injection sollte dabei recht gering sein...
 
Bin gerade mal drüber geflogen, das sieht ganz genau so aus, wie ich mir das vorgestellt habe! :D Falls Fehler drin sein sollten, werde ich schon fähig sein, diese zu korrigieren.

Wie gesagt, heute komme ich hier auf Arbeit nicht unbedingt dazu, das umzusetzen - werde ja nicht nur C&P machen. ;-) Sobald ich aber ein zufrieden stellendes Script zusammen gebaut habe, werde ich das auch entsprechend hier rein setzen. Zum einen zur Korrektur und zum Anderen... vllt. muss ja irgendwann mal jemand etwas ähnliches machen. ^^

Ich bin jedenfalls sehr dankbar für die ausführliche Hilfe hier. Ich hätte eher mit endlosen SELFHTML-Links o.Ä. gerechnet, mit denen ich schon versucht habe etwas anzufangen.

PS: Wegen der mysqli, mysql usw Diskussion - es geht nur ums Intranet - das ist von außen nicht erreichbar und es soll einfach funktionieren :D Hier sind bisher sämtliche Scripte (nicht von mir geschrieben) auf einfacher mysql-Basis. Aber danke für den Hinweis. ^^ Ich werde da vllt. zukünftig mal etwas daran drehen, des guten Stils wegen.
 
Zuletzt bearbeitet:
Zurück
Oben