Système de pointage (entrée/sortie) en PHP

Nouveau WRInaute
Bonjour,

J'aimerais un petit coup de main concernant un script que je souhaite mettre en place.

J'ai un lecteur de code barre (douchette) qui pioche des données dans la BDD et qui implémente l'heure de check.

Actuellement, le script fonctionne correctement mais renseigne plusieurs ligne pour la même personne.

J'aimerais définir une heure d'entrée et une heure de sortie en fonction du nombre de check par jour.

Exemple : 1er check de la journée, l'heure renseigne la colonne entrée, et 2 eme check de la journée l'heure renseigne la colonne sortie.

Mais je bloque un peu sur la logique que je peux apporter à ce script.

Voici mon bout de code :

Code:
<?php
									try{
								$db = new PDO('mysql:host=localhost;dbname=personnel','name','pass');
								$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
								}
								catch(PDOException $e){
								echo 'Erreur SQL';
								}
								$i=0;
								while($i=1){
								if(isset($_POST['id'])){
								$pointage = "INSERT INTO pointage (heure, jour, id, nom, prenom, service) SELECT '".$_POST['date']."', '".$_POST['jour']."', id, nom, prenom, service FROM salaries  WHERE id='".$_POST['id']."'";
								$pointage = $db->query($pointage);
								$i++;
								echo "<div class=\"validation\">Votre pointage à bien ok enregistré</div>";
								}
							}		
								while($i=2){
								if(isset($_POST['id'])){
								$pointage = "INSERT INTO pointage (heure, jour, id, nom, prenom, service) SELECT '".$_POST['date']."', '".$_POST['jour']."', id, nom, prenom, service FROM salaries  WHERE id='".$_POST['id']."'";
								$pointage = $db->query($pointage);
								$i++;
								echo "<div class=\"validation\">Votre pointage à bien bib enregistré</div>";
								}
							}	
							?>

Merci
 
WRInaute passionné
Il fonctionne ce code ?? Parce que tu as deux boucles dont la condition ne semble jamais pouvoir être vraie vu que $i est défini à 0 juste avant.

Et pour ton système, tu penses à gérer aussi les doubles pointages ("J'ai pointé ce matin ou pas ? Hop, j'en remets un coup !") et les oublis si tu veux que l'outil soit un minimum intelligent et ne t'impose pas de corriger les pointages sur plusieurs jours en cas d'erreur ?
 
Nouveau WRInaute
Non justement il ne fonctionne pas...

Pour le moment il recueil les informations c'est une bonne chose de faite, mais c'est vrai que j'envisageais par la suite de définir des conditions.
Pour le double pointage je voulais définir une tranche horaire minimum entre 2 pointages par exemple.

Pour le moment, aurais tu une solution a la logique que je voudrais apporter à ce script ?

Voici le script de base qui fonctionne correctement :

Code:
<?php
									try{
								$db = new PDO('mysql:host=localhost;dbname=personnel','login','pass');
								$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
								}
								catch(PDOException $e){
								echo 'Erreur SQL';
								}
								if(isset($_POST['id'])){
								$pointage = "INSERT INTO pointage (heure, jour, id, nom, prenom, service) SELECT '".$_POST['date']."', '".$_POST['jour']."', id, nom, prenom, service FROM salaries  WHERE id='".$_POST['id']."'";
								$pointage = $db->query($pointage);
								echo "<div class=\"validation\">Votre pointage à bien été enregistré</div>";
								}		
							?>
 
WRInaute impliqué
tu commences par faire un select pour savoir si tu as des données pour cet id et ce jour.
si non :
- c'est avant une certaine heure -> ajout d'une entrée
- c'est après une certaine heure -> cas bizarre à gérer comme tu veux
si oui :
- c'est avant une certaine heure -> un doublon ou quelqu'un qui part super tot
- c'est après une certaine heure -> ajout d'une sortie
 
Nouveau WRInaute
J'ai essayé de m'en sortir mais j'ai une erreur qui me turlupine !

Voici mon code :

Code:
<?php
									try{
								$db = new PDO('mysql:host=localhost;dbname=personnel','login','pass');
								$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
								}
								catch(PDOException $e){
								echo 'Erreur SQL';
								}
								$id_Exist = $db->prepare("SELECT id, jour FROM pointage WHERE id='".$_POST['id']."', jour='".$_POST['jour']."'");
								//On recupère les pseudo de t'as base ou les pseudo son egal au pseudo passer par le formulaire
								$id_Exist->bindValue('id', $_POST['id'], PDO::PARAM_STR);
								$id_Exist->execute();
								//on exécute la requête
								 
								$pseudoINbdd = $id_Exist->rowCount();
								//Rowcount permet de sortir le nombre de valeur que t'as requête renvoi, que l'on rentre dans la variable pseudoINbdd (ou autre )
								 
								if($pseudoINbdd == 0){
								//Si la requête renvoi 0, le pseudo n'existe pas dans la base, sinon le pseudo existe.
									if($_POST['id']){
										$arrive = "INSERT INTO pointage (arrive, jour, id, nom, prenom, service) SELECT '".$_POST['heure']."', '".$_POST['jour']."', id, nom, prenom, service FROM salaries WHERE id='".$_POST['id']."'";
										$controle = $arrive;
										echo "<div class=\"validation\">Votre arrivee à bien été enregistré</div>";
									}
									}
									if($pseudoINbdd == 1){
										$sortie = "UPDATE pointage SET sortie='".$_POST['heure']."' WHERE id='".$_POST['id']."'";
										$controle = $sortie;
										echo "<div class=\"validation\">Votre sortie à bien été enregistré</div>";
										}
										$controle = $db->query($controle);
							?>

et voici l'erreur :

Code:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 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 ' jour=''' at line 1' in /home/fabrice/sd/intranet/www/pointage.php:57 Stack trace: #0 /home/fabrice/sd/intranet/www/pointage.php(57): PDOStatement->execute() #1 {main} thrown in /home/fabrice/sd/intranet/www/pointage.php on line 57

Merci
 
Nouveau WRInaute
J'ai résolu mon problème, pour ceux qui souhaiteraient faire une manip de ce style voici mon code commenté :

Code:
<?php
									try{
								$db = new PDO('mysql:host=localhost;dbname=personnel','login','pass');
								$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
								}
								catch(PDOException $e){
								echo 'Erreur SQL';
								}
								$id_Exist = $db->prepare("SELECT id FROM pointage WHERE id='".$_POST['id']."'");
								//On recupère les pseudo de t'as base ou les pseudo son egal au pseudo passer par le formulaire
								$id_Exist->bindValue('id', $_POST['id'], PDO::PARAM_STR);
								$id_Exist->execute();
								//on exécute la requête
								 
								$pseudoINbdd = $id_Exist->rowCount();
								//Rowcount permet de sortir le nombre de valeur que t'as requête renvoi, que l'on rentre dans la variable pseudoINbdd (ou autre )
								 
								if($_POST['id']){
								//Si la requête renvoi 0, le pseudo n'existe pas dans la base, sinon le pseudo existe.
									if($pseudoINbdd == 0){
										$arrive = "INSERT INTO pointage (arrive, jour, id, nom, prenom, service) SELECT '".$_POST['heure']."', '".$_POST['jour']."', id, nom, prenom, service FROM salaries WHERE id='".$_POST['id']."'";
										$controle = $arrive;
										echo "<div class=\"validation\">Votre arrivee à bien été enregistré</div>";
									}
									if($pseudoINbdd == 1){
										$sortie = "UPDATE pointage SET sortie='".$_POST['heure']."' WHERE id='".$_POST['id']."'";
										$controle = $sortie;
										echo "<div class=\"validation\">Votre sortie à bien été enregistré</div>";
										}
										$controle = $db->query($controle);
								}
							?>
 
Nouveau WRInaute
Bonjour,

Comme vous l'avez constaté sur mon post précédent, j'ai apporté une logique booléenne à mon script.
Mais je n'avais pas prévu un détail, les salariés doivent pointer 4 fois dans une journée, donc pas de booléen.
De plus, j'ai une contrainte au niveau de l'horaire, je ne peux pas me baser dessus car ils varient tout au long de la journée en fonction de chaque personne.

Je pense que le plus adapté serait de dire que :
-1er pointage de la journée ==> Entrée
-2ème pointage de la journée ==> Sortie déjeuner
-3ème pointage de la journée ==> Revient du déjeuner
-4ème pointage de la journée ==> Sortie du travail.

En mettant une condition de 20 minutes entre chaque pointage.

Je n'ai aucun idée de comment coder le faite que ce soit le 1er, 2eme, 3eme etc...

Si vous pouviez de transmettre un bout de code, ou un lien qui serait susceptible de m'aider pour apporter cette logique à mon script je vous en serais très reconnaissant.

Merci
 
Discussions similaires
Réponses
3
Affichages
3K
mathieukassovitz
M
Haut