PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Projekt - Abfragesystem - PHP


djmoscito
30.05.2006, 20:59:29
Hallo,

ich mache demnächst ein Praktikum und muss dort als Aufgabe ein Projekt auf die Beine Stellen. Leider bin ich nicht so der PHP Könner aber ich habe 2 Wochen um es umzusetzen und das mind 7h pro Tag und daher denke ich ist es möglich...

Das System soll dem Kartenleser ein Firma ähneln. Jemand kommt zur Arbeit und checkt sich ein ( das gerät speichert das, man geht nach Hause und zieht wieder die akrte durch und das wird vermerkt.
Das soll ich per PHP umsetzten und zwar mit der aktivität am Rechner. (In der Raum egstellt ob das schlau ist oder nicht, viel würden es anders machen)

Jetzt wollte ich mich schon mal noch in paar Dingen informieren und vll. Auch helfen lassen.

Projekt:

1.Tag System

1. Der Server pingt einen Arbeits-PC an -> erkennt das er online ist oder offline
2. Online -> schreibt es in eine Datenbank ( Tabelle „online“)
3. Offline -> passiert nichts, oder sollte man eine Tabelle „offline“ anlegen
4. Auslesen der Tabelle online -> wie viele Stunden -> ausgaben HTML

Sagen wir der Server pingt den Rechner aller 5min an, wie halte ich fest das der Rechner an oder aus ist, und er davon den Zeitraum ermittelt und das er es in einem Tag der 24h festhält.
Am besten mit Zeitraum wo der Rechner an war.
So meine Frage ist. Was für Tabellen legt man an? Wie bekommt man es hin das 364Tage genutzt werden? Wie mache ich das am besten mit mehrer Benutzern, legt man da an Tabellen-„Kategorie“ mit der entsprechende IP ab für jeden Benutzer an und schickt dann jeweilig die Daten in die entsprechende Tabelle?

Beispiel in HTML-Ausgabe

Benutzer X – Rechner1 – IP: 192.168.0.1

1.Woche:

01.06.06| 12:30 – 15:03 | 02:33 Stunden
02.06.06| 12:30 – 15:03 |(h:min)
03.06.06| 12:30 – 15:03 |(h:min)
04.06.06| 12:30 – 15:03 |(h:min)
05.06.06| 12:30 – 15:03 |(h:min)
06.06.06| 12:30 – 15:03 |(h:min)
07.06.06| 12:30 – 15:03 |(h:min)
----------------------------------------
Gesamt | X:YY Stunden


Benutzer Y – Rechner2 – IP: 192.168.0.2

…..

Wäre toll wenn mir jemand die fragen oder gar helfen könnte.


Danke die Stechmücke

mischka11
31.05.2006, 13:41:25
Hallo,

ich glaube PHP ist hier keine gute Idee.
Mit Java (nicht Javascript) sollte sich soetwas eher realisieren lassen.
Handelt es sich bei allen Rechnern (inkl. Server) um Windows-Rechner, ist eine Lösung in Delphi oder Visual Basic recht einfach zu gestalten.
Als Grundkonzept solltest Du Dir dazu mal die Funktionsweisen eines Chatsystems anschauen.

djmoscito
31.05.2006, 19:32:29
Das System soll dem Kartenleser ein Firma ähneln. Jemand kommt zur Arbeit und checkt sich ein ( das gerät speichert das, man geht nach Hause und zieht wieder die akrte durch und das wird vermerkt.
Das soll ich per PHP umsetzten und zwar mit der aktivität am Rechner. (In der Raum egstellt ob das schlau ist oder nicht, viel würden es anders machen)


...

Wenn ich es anders machen sollte dann würde ich es auch anders machen oder probieren.

mischka11
01.06.2006, 08:20:11
ööhm, ok, die Tücke steckt im Detail.

Also die Idee mit dem Ping ist ja nicht schlecht, da gibt es z. B. Pear, das liefert schon fertige Klassen. Damit kannst Du aber nur testen ob der Rechner hochgefahren ist oder nicht.
Um noch den Benutzer zu der IP zu bekommen solltest Du evtl. ein Login schreiben, wo sich der Benutzer mit seinem Namen einloggt, anschließend wird der Loginname + IP des Rechners in einer Tabelle gespeichert. Die Tabelle liest Du nun z. B. per Cronjob aus und Pings die IP's nacheinander durch. die Resultate schreibst Du mit einem Timestamp in eine weitere Tabelle.

Das wäre erstmal ein einfacher Lösungsansatz. Ohne Beachtung sonstiger Details.

djmoscito
01.06.2006, 18:58:13
hmm, aber dann kann man ja gleich ein Login/Logout system machen oder was sagst du?

Was da der unterschied bei dir logt man sich ein per loginame...dann werden die rechner durchgepingt, und dann? Pingt der solange bis jeder rechner aus ist und dann du dich nächsten tag wieder einlogst oder wie?

mischka11
02.06.2006, 11:51:18
hmm, aber dann kann man ja gleich ein Login/Logout system machen oder was sagst du?

Was da der unterschied bei dir logt man sich ein per loginame...dann werden die rechner durchgepingt, und dann? Pingt der solange bis jeder rechner aus ist und dann du dich nächsten tag wieder einlogst oder wie?


nunja was anders wird wohl dabei nicht rauskommen.
der Ping läuft solange bist die IP des Rechners nicht mehr erreichbar ist, ist dies der Fall wird sie aus der Tabelle entfernt.
Du wirst allerdings irgendeine Aktion des Benutzer benötigen, da Du sonst nicht an den Rechnernamen, Benutzer usw. kommst.

Wie stellst Du Dir das vor, soll sich beim Rechnerstart eine Webseite öffnen oder soll das automatisch passieren?
Wie ich schonmal gesagt hatte nur PHP für soetwas ist ein bisschen steif. Schreibe doch wenigstens ein kleines Tool in VB, welches beim Rechnerstart ausgeführt wird und die Daten, Windowsbenutzer und Rechner IP automatisch an den "server" sendet.

diver-network
02.06.2006, 13:09:35
Hi,

ohne daß ich was sinnvolles zur Lösung des Problems beitragen kann nur die Warnung, einen Rechner ständig mit PINGs zu "belästigen".
Wer das im Intranet und dann womöglich noch mit falschen Ping- Parametern und bei vielen Rechnern parallel macht hat sehr sehr schnell seine SysAdmins von der Netzwerkbetreuung gegen sich und womöglich das Netzwerk lahm gelegt.
Passt also auf, daß Ihr nicht aus Versehen eine Denial of Service Attacke startet, nur um festzustellen, ob ein Rechner noch angemeldet ist oder nicht.

Gruß,

Andy

langwebdesign
06.06.2006, 19:46:31
Hi

warum legst du nicht auf jedem rechner einen geplanten task an der dir z.B. alle 5 Minuten einen Batch aufruft der die IP und den benutzernamen auslest und irgendwo als txt speichert. auf der php seite machst dann einen Cron der dir die txts einlest - die daten auswertet und in die DB schreibt.

hier ein paar scriptschnippsel für den Task:

@echo off
set destination=\\pfad
del %destination%\%computername%.txt
nbtstat -a %computername%>>%destination%\%computername%.txt
echo %username%>>%destination%\%computername%.txt
exit

Und das Ergebniss

LAN-Verbindung:
Knoten-IP-Adresse: [192.168.2.1] Bereichskennung: []



NetBIOS-Namentabelle des Remotecomputers



Name Typ Status

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

PC-NAME <00> EINDEUTIG Registriert

DOMAIN <00> GRUPPE Registriert

PC-NAME <20> EINDEUTIG Registriert

DOMAIN <1E> GRUPPE Registriert



MAC Adresse = 00-00-00-00-00-00
Benutzername

Jetzt muss da halt noch die Zeit mit rein und dann die Auswertung ect.

Wenn du Fertig bist, können wir dann deine Lösung sehen?
Helfen auch gern noch weiter.

mfg
Stephan

djmoscito
07.06.2006, 20:46:41
Danke für die Antwort, habe jetzt lange geredet nachgedacht und ein konzept erstellt das sieht so aus:

So nach langer Planung habe ich/wir es geschafft. Erstmal ein system zu entwickeln welches folgendermaßen aussieht:

es gibt 4 Buttons:

Kommen = "k"| PauseAN = "p1" | PauseAUS = "p2" | Gehen = "g"

und 2 Tabellen:

1. Stammdaten

ID, Benutzer, tägl_AZ, tägl_PZ, Urlaub

2. Zeitdaten

ID, MA_ID, Datum, Zeit, KZ (siehe Buttons)


MA_ID= Mitarbeiter ID (ergibt sich aus ID von Benutzer, und Loginsystem)
AZ= Arbeitszeiten
PZ=Pasuezeiten
KZ=Kennzeichnung von Buttons (k, p1, p2, g)


Bsp:

<1>Kommen: klick auf "K"

<neue ID>, <MA_ID>, <Datum>, <06-07-2006 8:00>, 'k'

<2>Pause1: klick auf "P1"

<neue ID>, <MA_ID>, <Datum>, <06-07-2006 10:00>, 'p1'

<3>Pause2: klick auf "P2"

<neue ID>, <MA_ID>, <Datum>, <06-07-2006 10:30>, 'p2'

<4>Gehen: klick auf "G"

<neue ID>, <MA_ID>, <Datum>, <06-07-2006 18:00>, 'g'

Arbeitszeit= <4>-<1> - (<3>-<2>)
Pausenzeit= <3>-<2>

So habe mit meinem Chef geredet und er meinte Timestamp wäre sogar die einfachere lösung, weil man auch einfach abziehn kann.

So jetzt sollte hoffentlich erstmal eine Grundlage geschaffen sein...

@badphantom

Das mit dem Insert war schon klar =), das habe ich verstanden, nur ich bin bei den Befehlen verwirrt, wie sage ich das er als Timestamp in der Datenbank abspeichert, ich weiß nur wie man Zeichen darin abspeichert. :) // ERLEDIGT

Kommen:

$sql = "INSERT INTO time(
MaID
Datum
Zeit
KZ
)
VALUES
'$user',
NOW(),
NOW(),
'k',";

ich frag mich momentan nur wie ich dem Sage das er die ID vom der Eingeloggten Person übernehmen soll beim Speichern. :rolleyes:
und obe ich einfach beim einschreiben der funktion "k" sagen soll oder ob ich was falsch verstehe, oder sollte man das anders machen?

Nur was mir momentan wichtig ist wie Koppel ich die UserID mit der MA_ID

hab folgendes Login-Script:

index.php:
<form method="post" action="login.php">
<strong>Benutzername:</strong>
<br />
<input name="username" type="text">
<br>
<strong>Passwort:</strong>
<br />
<input name="" type="password" id="userpass">
<br />
<br />
<input name="login" type="submit" id="login" value="Einloggen">
</form>

login.php:

<?php
session_start(); //Session starten, auf alle Seiten !!!
include 'sessionhelpers.inc.php'; //Informationen zum aus und einloggen
if (isset($_POST['login'])) // Abfrage ob Login abgeschickt wurde
{
$userid=check_user($_POST['username'], $_POST['userpass']); // Name und Pass checken
if(!empty($userid)) // 2möglichkeiten, true ->login, false -> Meldung
login($userid); // login
else
echo 'Ihre Anmeldedaten waren nicht korrekt!'; // ansonsten -> Falsche Daten
}
if (!logged_in()) // wenn nicht eingeloggt oder nicht geht -> Loginformular
echo '
<form method="post" action="login.php">
<label><strong>Benutzername:</strong></label>
<br />
<input name="username" type="text">
<br>
<label><strong>Passwort:</strong> </label>
<br />
<input name="" type="password" id="userpass">
<br />
<br />
<input name="login" type="submit" id="login" value="Einloggen">
</form>';

else
echo '<a href="logout.php">Ausloggen</a>'; // Logout
?>


sessionhelpers.inc.php:

<?php
function connect()
{
$con= mysql_connect('localhost','root','') or die(mysql_error());
mysql_select_db('cte',$con) or die(mysql_error());
}

function check_user($name, $pass)
{
$sql="SELECT UserID
FROM users
WHERE UserName='".$name."' AND UserPass=MD5('".$pass."')
LIMIT 1";
$result= mysql_query($sql) or die(mysql_error());
if ( mysql_num_rows($result)==1)
{
$user=mysql_fetch_assoc($result);
return $user['UserID'];
}
else
return false;
}

function login($userid) /* Diese Funktion loggt einen Benutzer in das System ein. Welcher Benutzer eingeloggt werden soll, wird über den Parameter $userid angegeben
die Session-ID (die eindeutig ist) in die Spalte UserSession des Benutzers geschrieben wird */
{
$sql="UPDATE users
SET UserSession='".session_id()."'
WHERE UserID=".$userid;
mysql_query($sql);
}

function logged_in() /* Diese Funktion prüft, ob der Benutzer eingeloggt ist. Zu diesem Zweck wird abgefragt, wie viele Einträge in der Benutzertabelle
mit der aktuellen Session-ID in der Spalte UserSession vorhanden sind. Wird ein Eintrag gefunden, ist der Benutzer eingeloggt. */
{
$sql="SELECT UserID
FROM users
WHERE UserSession='".session_id()."'
LIMIT 1";
$result= mysql_query($sql);
return ( mysql_num_rows($result)==1);
}

function logout() // Diese Funktion loggt den Benutzer wieder aus, indem in die Spalte UserSession der Wert NULL geschrieben wird.
{
$sql="UPDATE users
SET UserSession=NULL
WHERE UserSession='".session_id()."'";
mysql_query($sql);
}

connect();
?>


logged_in.php:
<?php
session_start(); //Session starten
include 'sessionhelpers.inc.php'; // Datei einladen
echo 'Sie sind '; // Sie sind....
if (!logged_in()) // überprüfung ob man eingeloggt ist -> ! negation
echo 'nicht ';
echo 'eingeloggt.<p />';
echo '<a href="index1.php">Start</a>';
?>

logout:
<?php
session_start();
include 'sessionhelpers.inc.php';
echo 'Sie sind ';
if (!logged_in())
echo 'nicht ';
echo 'eingeloggt.<p />';
logout();
echo 'Sie sind ';
if (!logged_in())
echo 'nicht ';
echo 'eingeloggt.< p/>';
echo '<a href="index1.php">Einloggen</a>';
?>


Hoffe mir kann dadurch jmd helfen wie ich ich die ID´s verkopple... wäre super.
Wichtiger Punkt wäre noch ob das nun stimmt mit den "KZ" oder ob ich da auf was achten sollte? Ich bin noch nicht so Datenbank oder php erprobt und bin über jede Hilfe glücklich.

Danke

n3ox
25.06.2006, 12:06:56
Hi!

ich weiß nicht genau ob ich dich richtig verstanden habe. Wenn du die userID, die sich in einer anderen Tabellle befindet, wie die MA_ID, dann würde ich es mit INNER JOIN machen. Dazu nehmen wir mal zwei Beispieltabellen user und mitarbeiter.


SELECT * FROM user INNER JOIN mitarbeiter on user.user_id = mitarbeiter.ma_id where user.user_id = ' 0001 ';


Habe ich deine Frage beantwortet oder habe ich dich falsch verstanden?^^