O projeto original trabalhava com quatro campos, manhãHoraEntrada, manhãHoraSaída, TardeHoraEntrada, TardeHoraSaída, eu simplifiquei em apenas dois campos, e assim consegui registrar várias entradas no mesmo dia e até saída no dia seguinte (o relatório ficou péssimo, mas dá para entender mais ou menos o movimento do colaborador ao longo do dia). O projeto original tinha rotina de login, CSS, e o meu projeto não tem nada disso. Aqui o meu foco é o banco de dados e como o PHP é bastante útil dentro do HTML.
arquivo /Polo/Controles/ControlePortaria.php
<?php
$projeto="/Polo";
require_once $_SERVER['DOCUMENT_ROOT']."$projeto/Modelos/Config.php";classControlePortaria{private $Conexao;publicfunction __construct(){
$this->Conexao=newConexao;}publicfunction cadastroNovo(){if(isset($_POST['nome'])){
$nome=$_POST['nome'];
$verificar=$this->Conexao->select("nome from cadastros where nome='$nome'")[0]->nome;if($verificar){
$mensagem="Já existe $verificar no cadastro";return view('Mensagem',['mensagem'=>$mensagem]);}
$id=$_POST['id'];
$imagem=file_get_contents($_FILES['foto']['tmp_name']);
$extensao = pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION);
$arquivo="Fotos/$id.$extensao";
file_put_contents($arquivo,$imagem);
$this->Conexao->insert("cadastros (nome,foto) values ('$nome','$arquivo')");return header("location:index.php");}
$id=$this->Conexao->select("max(id) as maximo from cadastros")[0]->maximo+1;return view('CadastroNovo',['id'=>$id]);}publicfunction entrada($id){
$agora=date('Y-m-d H:i');
$this->Conexao->update("movimentos set horaentrada='$agora'
where id=$id");return header("location:index.php");}publicfunction inicio(){
$hoje=date('d/m/y');
$verifica=$this->Conexao->select("* from cadastros");foreach($verifica as $ver){
$teste=$this->Conexao->select("* from movimentos
where idCadastro=$ver->id and horasaida is null");if(!$teste){
$this->Conexao->insert("movimentos (idCadastro) values ($ver->id)");}}
$cadastros=$this->Conexao->select("cadastros.id, nome, foto, movimentos.id as iid,
idCadastro, horaentrada, horasaida from cadastros
join movimentos on cadastros.id = movimentos.idCadastro
where horasaida is null order by cadastros.nome");
$mensagem="";if(count($cadastros)==0){
$mensagem="Ninguém foi cadastrado, ainda!";}return view('Movimento',['cadastros'=>$cadastros,'mensagem'=>$mensagem,'hoje'=>$hoje]);}publicfunction relatorio($dia =null){
$dia=($dia)? $dia : date('Y-m-d');
$movimentos=$this->Conexao->select("* from movimentos join cadastros
on movimentos.idCadastro = cadastros.id where
date(horaentrada)='$dia' order by cadastros.nome");
$mensagem="";if(count($movimentos)==0){
$mensagem="Não houve movimento nesse dia.";}return view('Relatorio',['dia'=>$dia,'movimentos'=>$movimentos,'mensagem'=>$mensagem]);}publicfunction saida($id){
$agora=date('Y-m-d H:i');
$this->Conexao->update("movimentos set horasaida='$agora' where id=$id");
$this->inicio();}}
arquivo /Polo/Fotos/1.png
arquivo /Polo/Fotos/2.jpeg
arquivo /Polo/Fotos/padrão.jpg
arquivo /Polo/Modelos/Conexao.php
<?php
classConexao{privatestatic $pdo;publicstaticfunction instancia(){if(!self::$pdo){// Veririca se o banco de dados existe
$dbName = DBNAME;
$checkDbExistsQuery ="SELECT * FROM sys.schema_table_statistics WHERE table_schema = '$dbName'";try{
$tempPdo =new PDO("mysql:host=". HOST, USER, PASSWORD);
$result = $tempPdo->query($checkDbExistsQuery);
$dbExists = $result->fetchColumn()=== $dbName;
$tempPdo =null;// fecha a conexão temporária do PDO}catch(PDOException $e){die("Erro ao procurar o banco de dados: ". $e->getMessage());}// Criar o banco de dados se ele não existeif(!$dbExists){
$createDbQuery ="CREATE DATABASE $dbName";try{
$pdo =new PDO("mysql:host=". HOST, USER, PASSWORD);
$pdo->exec($createDbQuery);
$pdo->exec("USE ". DBNAME);
$pdo->exec("CREATE TABLE `cadastros` (`id` int NOT NULL AUTO_INCREMENT,
`nome` varchar(45) NOT NULL,`foto` varchar(45) NOT NULL,PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci");
$pdo->exec("CREATE TABLE `movimentos` (`id` int NOT NULL AUTO_INCREMENT,
`idCadastro` int NOT NULL,`horaentrada` varchar(20) DEFAULT NULL,
`horasaida` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci");}catch(PDOException $e){die("Erro ao criar o banco de dados: ". $e->getMessage());}}// fazer a conexão com o banco de dadosself::$pdo =new PDO("mysql:host=". HOST .";dbname=". DBNAME, USER, PASSWORD);}returnself::$pdo;}publicfunctiondelete($sql){return $this->instancia()->query("delete from $sql");}publicfunctionexec($sql){return $this->instancia()->query($sql);}publicfunction insert($sql){return $this->instancia()->query("insert into $sql");}publicfunctionselect($sql){
$stmt=$this->instancia()->query("select $sql");return $stmt->fetchAll(PDO::FETCH_OBJ);}publicfunction update($sql){return $this->instancia()->query("update $sql");}}
arquivo /Polo/Modelos/Config.php
<?php
date_default_timezone_set('America/Sao_Paulo');
$baseDir = $_SERVER['DOCUMENT_ROOT'].'/Polo/';
define('PROJETO', $baseDir);
define('CONTROLES', PROJETO.'/Controles/');
define('FOTOS',PROJETO.'/Fotos/');
define('MODELOS', PROJETO.'/Modelos/');
define('VISOES', PROJETO.'/Visoes/');
define('HOST','localhost');
define('DBNAME','polo');
define('USER','root');
define('PASSWORD','');
spl_autoload_register(function($classe){
$diretorios =['Controles','Modelos','Visoes'];foreach($diretorios as $diretorio){
$arquivo = PROJETO . DIRECTORY_SEPARATOR . $diretorio . DIRECTORY_SEPARATOR . $classe .'.php';if(file_exists($arquivo)){
require_once $arquivo;return;}}thrownewException("Erro ao carregar a classe '{$classe}'. Arquivo não encontrado.");});function view($arquivo, $array =null){if(!is_null($array)){foreach($array as $var => $value){
${$var}= $value;}}
include VISOES . $arquivo .".php";}
arquivo /Polo/Visoes/CadastroNovo.php
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Formulário de Cadastro</title><script>function atualizarImagem(){
file = document.getElementById('foto').files[0]
reader =newFileReader()
reader.onload =function(event){
imageURL =event.target.result;
document.getElementById('imagemPreview').src = imageURL;}
reader.readAsDataURL(file);}</script></head><body style="width:500px;margin:0 auto"><fieldset><legend><h3>Formulário de Cadastros id=<?=$id?></h3></legend><divstyle=float:left;width:190px><imgsrc="Fotos/padrão.jpg"height="190"width="150"id=imagemPreview></div><divstyle=float:left;width:250px><formaction="?ControlePortaria.cadastroNovo"method="post"enctype='multipart/form-data'><table><tr><td><labelfor=fotostyle=display:block>Selecione uma foto</label><tr><td><inputtype="file"name="foto"id="foto"onchange="atualizarImagem()"><trstyle=height:20px><tr><td>Nome:
<tr><td><inputname="nome"placeholder="Informe o Nome"size=30required>
<input type=hidden name=id value=<?=$id?>>
<tr><td><inputtype=submitvalue=Gravar><tr><td><ahref='?ControlePortaria.inicio'>Cancelar</a></table></form></div></fieldset>
arquivo /Polo/Visoes/Mensagem.php
<!DOCTYPE html><html><head><metacharset="utf-8"><title>Mensagem</title></head><bodystyle="width:500px;margin:0 auto"><fieldset><legend><h3>Mensagem</h3></legend><h4><?=$mensagem?></h4><h4><ahref=index.php>Voltar</a></h4></fieldset>
arquivo /Polo/Visoes/Movimento.php
<!DOCTYPE html><html><head><metacharset="utf-8"><title>Movimento na Portaria</title><script>function altera(imagem){if(imagem.height ===10){
imagem.height =190;}else{
imagem.height =10;}}</script></head><bodystyle="width:500px;margin:0 auto"><fieldset><legend><h3>Movimento na Portaria em <?=$hoje?></h3></legend><form><inputname=nomeplaceholder="Busca por nome"onchange=submit()><ahref='?ControlePortaria.cadastroNovo'>Cadastrar Pessoas</a><ahref='?ControlePortaria.relatorio'> Relatório</a></form><h4><?=$mensagem?></h4><table><tr><th>id<th>Pessoa<th>Entrada<th>Saída<th>Foto
<?php foreach($cadastros as $c):?><tr><td><?=$c->id?><td><?=$c->nome?><?php if(is_null($c->horaentrada)):
$entrada="<input type=submit value='Confirmar'
onclick=location.replace('?ControlePortaria.entrada.$c->iid')>";
$saida=null;else:
$entrada=date('H:i',strtotime($c->horaentrada));
$saida="<input type=submit value='Confirmar'
onclick=location.replace('?ControlePortaria.saida.$c->iid')>";
endif;?><tdstyle=text-align:center><?=$entrada?><td><?=$saida?><td><img src=<?=$c->foto?> height="10" width="150" id=imagem onclick=altera(imagem)>
<?php endforeach;?></fieldset>
arquivo /Polo/Visoes/Relatorio.php
<!DOCTYPE html><html><head><metacharset="utf-8"><title>Relatorio</title></head><bodystyle="width:500px;margin:0 auto"><fieldset><legend><h3>
Relatorio de
<input type=date value=<?=$dia?>
onchange='location.replace("?ControlePortaria.relatorio."+this.value)'>
<ahref=index.php> Voltar</a></h3></legend><h3><?=$mensagem?></h3><table><th>Nome, Entrada => Saída
<?php
foreach($movimentos as $m):if(!isset($controle)): $controle=$m->nome; $controle2=0;?><tr><td><?=$m->nome?><?php endif;if($controle!==$m->nome): $controle=$m->nome; $controle2=0;?><tr><td><?=$m->nome?><?php endif;
$he=date('H:i',strtotime($m->horaentrada));
$hs=($m->horasaida)? date('H:i',strtotime($m->horasaida)):null;
$de=date('Y-m-d',strtotime($m->horaentrada));
$ds=($m->horasaida)?date('Y-m-d',strtotime($m->horasaida)):null;if($de!==$ds): $hs=($m->horasaida)?date('d/m H:i',strtotime($m->horasaida)):null; endif;
$controle2++;if($controle2>2): $controle2=0;?><tr><td><?php endif;?>
, <?=$he." => ".$hs?><?php endforeach;?></fieldset>
arquivo /Polo/index.php
<?php
ini_set('display_errors',1);require __DIR__ .'/Modelos/Config.php';
$rota='ControlePortaria_inicio';if($_GET){if(strpos(key($_GET),"_")==0){exit;}
$rota=isset($_GET)? key($_GET): $rota;}
$segmentos=explode('_',$rota);
$nomeControle=$segmentos[0]??'ControlePortaria';
$metodo=$segmentos[1]??'inicio';
$parametro=$segmentos[2]??null;
$controle=new $nomeControle();
$controle->$metodo($parametro);
Pergunta
Frank K Hosaka
O projeto original trabalhava com quatro campos, manhãHoraEntrada, manhãHoraSaída, TardeHoraEntrada, TardeHoraSaída, eu simplifiquei em apenas dois campos, e assim consegui registrar várias entradas no mesmo dia e até saída no dia seguinte (o relatório ficou péssimo, mas dá para entender mais ou menos o movimento do colaborador ao longo do dia). O projeto original tinha rotina de login, CSS, e o meu projeto não tem nada disso. Aqui o meu foco é o banco de dados e como o PHP é bastante útil dentro do HTML.
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.