Jump to content


Photo

Fazer Diferença De Horas Que Estão No Mysql, Mas...


  • Faça o login para participar
40 replies to this topic

#16 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 27/01/2009, 13:21

sim do tipo TIME.

agora aparece assim:

nome || entra || sai
-------------------------------------
kaka || 13:14:00 || 00:00:00

parece que ainda n é desta?
puxa uma cena tão simples tá virar complex...
:wacko:

#17 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 27/01/2009, 13:51

O Crab esqueceu do POST...

$sql = "UPDATE persons SET sai = '".$_POST[sai]."' WHERE personID = '".$_SESSION[id]."'";

Ae Crab,

Depois de atualizar a tabela com o campo sai, você tem que apagar a $_SESSION[id], não? :ponder:
att,
Muller Dias
ex-administrador Fórum WMO

#18 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 27/01/2009, 14:01

" sem.Ponto,


entao como ficaria?

#19 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 27/01/2009, 16:50

é sem.ponto... esqueci... mas puts... bastava ele dar uma olhada nisso...
é o mínimo que se espera... heheheheh

Sim.... seria interessante destruir a session sem.ponto.... bem lembrado

Poderia fazer assim então Wallace

<?php

if (!isset($_SESSION[id])){

   $sql="INSERT INTO persons 
			   (nome, semana, dia, mes, ano, turno, entra) 

			VALUES 
			   ('".$_POST[nome]."', '".$_POST[semana]."','".$_POST[dia]."', '".$_POST[mes]."', '".$_POST[ano]."', '".$_POST[turno]."', '".$_POST[entra]."')";

   $query = mysql_query($sql) or die(mysql_error());

   $_SESSION[id] = mysql_insert_id();

}
else {

   $sql = "UPDATE persons SET sai = '".$_POST['sai']."' WHERE personID = '".$_SESSION[id]."'";

   $query = mysql_query($sql) or die(mysql_error());

   session_destroy();

}

?>

ve se agora vai

(y)Até mais

#20 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 27/01/2009, 17:07

é o q digo, esta cena simples tá pra durar...puxa!!! :unsure:

agora acontece algo curioso...qd clico no botao sai e depois vou pra o index.php ... (deve ser por causa da session) sai da conta!!!!!!

o cod está assim:
(n querem testar aí pra ver o resultado??)

<?php
session_start();

//$id = $_SESSION['username']

$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("my", $con);

if (!isset($_SESSION[id])){

$sql="INSERT INTO persons (nome, semana, dia, mes, ano, turno, entra) VALUES ('".$_POST[nome]."', '".$_POST[semana]."','".$_POST[dia]."', '".$_POST[mes]."', '".$_POST[ano]."', '".$_POST[turno]."', '".$_POST[entra]."')";

$query = mysql_query($sql) or die(mysql_error());

$_SESSION[id] = mysql_insert_id();

}
else {

$sql = "UPDATE persons SET sai = '".$_POST['sai']."' WHERE personID = '".$_SESSION[id]."'";
$query = mysql_query($sql) or die(mysql_error());
session_destroy();

}

echo "<p class='alert'>Pica efectuado! Tenha um bom dia! Nao se esqueca fazer logout! </p>";
echo "<center><a href='index.php'>voltar</a></center>";

mysql_close($con)

?>



#21 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 27/01/2009, 17:33

Está saindo da conta porque session_destroy() destroi toda a sessão, e nessa sessão tem os dados do login.

O jeito é apagar só o id... :ponder:

Tente:

unset($_SESSION[id]);

Crab,

É certo apagar algum valor da sessão dessa forma? :ponder:
att,
Muller Dias
ex-administrador Fórum WMO

#22 CMAC

CMAC

    Normal

  • Usuários
  • 93 posts
  • Sexo:Masculino

Posted 27/01/2009, 18:42

Interessante este sistema.

Se o usuário digitar uma hora diferente da atual pode simplesmente enganar a empresa. Por exemplo, são 6:50 da manhã e eu estou entrando, se colocar 6:00 vou ganhar 50 minutos do que não fiz.

O ideal seria usar a hora do servidor, assim ficava só com o botão de entra e sai. E na query, era só usar NOW().

É claro que é o meu ponto de vista, posso estar enganado nisso...

Edição feita por: CMAC, 27/01/2009, 18:43.


#23 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 27/01/2009, 19:22

unset($_SESSION[id]);

Crab,

É certo apagar algum valor da sessão dessa forma? :ponder:


Olha... não sou o cara e não costumo usar assim, mas é dele tentar para aprender... acho que vai funcionar :assobio:

Uma outra forma é na verificação lá no if... é verificar se $_SESSION[id] é != de NULL
E ao sair em em vez de destroy e unset podesse definir um novo valor no caso NULL

Cabe dar uma olhadinha no manual sobre unset() tem vários exemplos dos colaboradores inclusive sobre sessions tbm

Eu viajei em sugestionar o destroy.... não me liguei que ele poderia estar usando sessions para outras situações do sistema dele.

WALLACE, cabe a vc tbm verificar se as variáveis que estamos criando aqui como exemplo para não entrar em conflito com variáveis que podem já existir no teu sistema
Percebi que comentou lá no topo do teu cod a variável $id referente a $_SESSION['username'] do teu sistema

Se perceber que exemplificamos variáveis iguais as que já usa então modifique no nome das variáveis que exemplificamos... te ajudaria muito esta atenção.

Interessante este sistema.

Se o usuário digitar uma hora diferente da atual pode simplesmente enganar a empresa. Por exemplo, são 6:50 da manhã e eu estou entrando, se colocar 6:00 vou ganhar 50 minutos do que não fiz.

O ideal seria usar a hora do servidor, assim ficava só com o botão de entra e sai. E na query, era só usar NOW().

É claro que é o meu ponto de vista, posso estar enganado nisso...


Essa é a letra ;)Até mais

#24 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 27/01/2009, 21:32

caro CMAC,
bem pensado, nao tinha reparado nesse pormenor. tem toda a razão!

nesse caso, poderia fazer doutro modo...tirava os inputs e só fica os botoes: "entra" e "sai"...e assim dará para evitar a empresa.
que diz?

caro Crab,
se imaginasse as voltas que já dei a esta xxxxxx de programa, tão simples...e o fim dele não o vejo...que cena... :(
mas deixo aqui a sugestão do seguinte: poderei enviar pra vc ou até tb pra CMAC o programa q fiz todo e verem onde posso melhorar...?
ideia boa ou má?


sem.Ponto,

com unset($_SESSION[id]); nao destroi a sessao, mas ao fazer o habitual picar no ponto...entra clica no entra...faz logout e dpois qd for para sair clica no sai...e o que aparece é isto:

nome || entra || sai
-------------------------------------
kaka || 13:14:00 ||
kaka || 00:00:00 ||

como uma coisa simples me ta-se tornando complicado... :shit:

#25 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 27/01/2009, 22:39

Crab, dei uma olhada no manual e fiz uns testes. Não é errado apagar variáveis globais com unset(), só estava com dúvida nisso.

Com NULL também funcionaria. É só escolher uma das formas e mandar brasa.

com unset($_SESSION[id]); nao destroi a sessao, mas ao fazer o habitual picar no ponto...entra clica no entra...faz logout e dpois qd for para sair clica no sai...e o que aparece é isto

Espera aí...

Funciona assim:

1 - O usuário loga no sistema, pega a hora e clica no "entra".
2 - O usuário desconecta.
3 - Quando acaba o expediente o usuário loga novamente no sistema, pega a hora e clica no "sai".

É assim que funciona o seu sistema?

Porque se for assim, está explicado então porque não está funcionando...
att,
Muller Dias
ex-administrador Fórum WMO

#26 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 28/01/2009, 00:23

caro, sem.Ponto,
é isso mesmo. como sao varias usuarios...é preciso cada um fazer o logout. entra um autentica-se e pica no entra e faz logout, vem outro faz o mesmo...Na hora de sair autenticam-se e clicam no sair! Os inputs realmente ficavam mal...agora só tem dois botoes entrar e sair!
(creio q assim o usuario ja nao engana o sistema lol)
Só falta mesmo como por no mesmo registo as horas de entrada e saida...(já q pra calcular a diferença de horas ja consegui).
entao como funcionaria pra este tipo de funcionamento? onde falha?

Espera aí...

Funciona assim:

1 - O usuário loga no sistema, pega a hora e clica no "entra".
2 - O usuário desconecta.
3 - Quando acaba o expediente o usuário loga novamente no sistema, pega a hora e clica no "sai".

É assim que funciona o seu sistema?

Porque se for assim, está explicado então porque não está funcionando...



#27 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 28/01/2009, 00:37

Digamos que não é por acaso que está tendo problemas, digamos eu esse sistema está um rolo só...

Porque não faz com que ao usuário logar já pega a hora que logou ficando 'logado' enquanto estiver trabalhando... e só da logout do sistema quando realmente fechar o expediente...

Isso inclusive seria interessante para quem está acima destes funcionários, pois este que está acima poderia monitorar quantos estão trabalhando naquele exato momento, verificando quantos estão logados.

Acho que era isso...

Boa sorte Até mais

#28 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 28/01/2009, 00:47

Crab, creio que não viu os ultimos topicos entre mim e o sem.Ponto.
sao vários usuarios e como só há um computador, terá de ser com "autenticação-clica no bota entrar e logout" ...!
entendeu?

sei q podia ser mt melhor o codigo, mas a maneira de fazer...n poderia ser diferente com "logar-picar-deslogar" pois há apenas um computador para vários usuarios picarem o ponto.

sem.Ponto, falei bem?


pensei q tinha conseguido...mas não! :(
claro q funciona estando logado!!!

mas sendo q cada usuario tem de deslogar... oohhhhhhhhhhhhhhhhh

#29 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 28/01/2009, 02:58

Entendi Wallace... pensarei em alguma solução e assim que eu tiver alguma idéia volto à postar, não havia percebido que era um só computador.

Mas não fique esperando, procure descobrir uma forma tbm

(y)

---------------------------------------------------------------------------
Já pensei algo hehehehe
Mas terá que trabalhar... leia com muita atenção... se me convencer que entendeu a lógica eu tento fazer algum código

Veja bem...

Julgo que tenha uma tabela de cadastro dos trabalhadores certo?

Sendo assim quando o trabalhador logar no sistema para bater o ponto ele digita senha e entra
Ao logar, o sistema tem leitura de um identificador único do cadastro deste trabalhador (se não tem faça ter essa na consulta de verificação do login dele) onde imagino que esse identificador seria o id do cadastro, Adquirido automaticamente através de um campo autoincrement... ou seja, quando o usuário for bater o ponto de entrada você irá registrar, além dos dados que já sabemos pelos posts anteriores, também o id do trabalhador, aquele que está lá na tabela do trabalhador.

Observação:
terá e também que criar um campo na tabela 'Bate Ponto', esse campo será como um interruptor de luz que por padrão já terá o valor que você definirá igual a '1'. Pode ser um campo do tipo ENUM e se estiver usando o phpmyadmin, ali onde diz 'Tamanho/Definir*' você deverá colocar '0','1' ( exatamente assim ).

Continuando... se este campo estiver como "1" é porque o trabalhador está trabalhando se estiver como "0" é porque já saiu ( ao sair este campo será atualizado para '0' ... veremos mais adiante isso).

Enfim... sendo assim fica mais fácil você fazer verificações sem precisar de sessions

Exemplo/Resumo Lógico

Jonas chegou para o trabalho e Jonas tem em seu cadastro como trabalhador 'id' número '3'
Jonas efetuou login e bateu ponto
Ao bater o ponto será gerado uma inserção na tabela Bate Ponto
Nessa inserção será registrado o 'id' do Jonas, pois sabe-se qual é já que Jonas fez Login no sistema.
O Interruptor não precisa inserir um valor nele, pois se fizer como falei, ao ser gerado essa linha de registro de entrada o campo do interruptor automaticamente já terá como valor o "1"
Pronto... após bater o ponto, os dados foram devidamente registrados e Jonas pode efetuar um logout do sistema e ir trabalhar.
Se algum monitor quiser saber onde Jonas está é só ver o interruptor se tiver uma linha de entrada no nome e id de Jopnas registrada na tabela Bate Ponto e estiver "1" é porque Jonas tem que estar trabalhando, se não estiver rola uma justa causa kkkkkkkkkkk

Tá mas até aí acredito que não teria problemas, mas na hora da SAÍDA :closedeyes: ... eu tenho a solução lógica para o problema :D eu acho :ponder:

Vamos ao Exemplo Lógico 2 para ajudar o cara bater o ponto de saída sem se complicar.

Jonas novamente faz login e sendo assim novamente o sistema tem acesso ao id do cadastro dele
Então basta fazer o UPDATE gravando em 'sai' a hora exata da PICA dele kkkkkkkkkkkkkkkkk maus aí ...
continuando... mas como gravar a hora exata da saída dele exatamente na mesma linha de entrada dele??

Aí que está o segredo que deixará de ser segredo

Temos o ID dele e já que ele está saindo, então é obvio que existe uma linha de entrada dele e o 'interruptor' dele está '1', sendo assim temos duas referências para utilizar na cláusula WHERE

Sacou???
UPDATE tabela SET sai = NOW(), interruptor = 0 WHERE id_trabalhador = id_do_jonas AND interrutor = 1

essa do interruptor é multifuncional hehehehe

Serve para impedir o Jonas de entrar sem ter saído e sair sem ter entrado

Diz que entendeu diz hehehehehe

(y)Até mais

#30 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 28/01/2009, 04:11

Bom, vou te dar o caminho, o resto é com você.

Estrutura da tabela:

Attached File  tabela.gif   4.2KB   8 downloads

Código:

$id_usuario = 20;

$sql = mysql_query("SELECT * FROM tabela WHERE id_usuario='$id_usuario' ORDER BY id_ponto DESC LIMIT 1");
$ultimo_ponto = mysql_fetch_array($sql);

if ($ultimo_ponto['id_ponto'] && $ultimo_ponto['sai'] == NULL) {

	if ($_GET['acao'] == 'sair') {
		$sai = mysql_query("UPDATE tabela SET sai=CURTIME() WHERE id_usuario='$id_usuario'");
	}
	echo $sai ? '<a href="?acao=entrar">Entrar</a>' : '<a href="?acao=sair">Sair</a>';

} else {

	if ($_GET['acao'] == 'entrar') {
		$entra = mysql_query("INSERT INTO tabela (id_usuario, entra) VALUES ('$id_usuario', CURTIME())");
	}
	echo $entra ? '<a href="?acao=sair">Sair</a>' : '<a href="?acao=entrar">Entrar</a>';
	
}

Primeira coisa que você vai perceber é que eu não coloquei o campo NOME na tabela, simplesmente porque não precisa, o nome pode ser colocado em outra tabela. Isso vai poupar muitos bytes. ^_^

Invés de colocar o nome, eu coloquei o ID do usuário para identificar ele. Logo no início do código o ID do usuário deve entrar dinamicamente na variável $id_usuario.

Como o código acima vai funcionar?

Quando o usuário entrar, vai ser feita uma verificação na tabela para saber se ele está "trabalhando", se estiver vai aparecer somente o botão "SAIR", caso contrário vai aparecer somente o botão "ENTRAR".

O Crab postou enquanto eu estava digitando, parece que ele falou sobre o mesmo assunto que vou falar agora. As condicionais do código vão impedir que o usuário tente entrar duas vezes ou sair duas vezes. Ele só consegue entrar e sair, e só consegue sair se entrar.

Uma coisa importante... usei o método GET para o código não ficar grande, você pode adaptar para POST assim como pode também acrescentar novos campos.

(ok2)
att,
Muller Dias
ex-administrador Fórum WMO




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq