0

Problema com SQL utilizando datas e while.

criado por Leonardo em 19/04/2010 12:03am
boa noite a todos,

sou iniciante no mysql e como era de se esperar, estou tomando uma surra dele... rsrs

gostaria que me dessem uma dica com relação ao PHP abaixo usando SQL, pois não está funcionando.

tenho duas tabelas, conforme abaixo, que estão com esses registros:

tb_cliente
id chave_atual
1 123456789

tb_licenca
id data_inicial data_final chave
1 2010-04-01 2010-04-30 123456789

O que eu quero na verdade é que de acordo com a data de hoje eu encontre um registro na tabela tb_licenca. Também preciso localizar um registro na tabela tb_cliente que tem o id = 1. Com esses dois selects e o while, eu obtenho da tabela tb_cliente, um valor do campo "chave_atual", e na tabela tb_licenca, um valor do campo "chave".
Após isso, comparo os valores com o IF, que se eles forem diferentes aparecerá a mensagem do script abaixo, e se forem igual vem um ELSE executando o que preciso.


$data = date("Y-m-d");

$select_chave = mysql_query("SELECT * FROM tb_licenca WHERE data_inicial >= '$data' AND data_final <= '$data'");

$select_chave_atual = mysql_query("SELECT * FROM tb_cliente WHERE id == '1'");

while($registro = mysql_fetch_array($select_chave)){
$chave_db = $registro['chave'];
}

while($registro2 = mysql_fetch_array($select_chave_atual)){
$chave_atual_db = $registro2['chave_atual'];
}

if($chave_db != $chave_atual_db){
echo"
<META HTTP-EQUIV=REFRESH CONTENT='0; URL=pga_login.php'>
<script type=\"text/javascript\">
alert(\"Licença de uso inválida. Favor atualizar.\");
</script>>";
}

Lista de Respostas:

0
19/04/2010 3:30pm
(~14 anos atrás)
Marcos Regis respondeu:
Cara, ficou confuso. Não entendi nada da sua explicação.
Olhando seu código fica a impressão que vc não percebeu que a primeira consulta trará todos os registros do banco que atendam a condição da data e irá pegar somente a última da lista.
O mesmo acontecerá com a consulta "SELECT * FROM tb_cliente WHERE id == '1'".
O que vc precisa é tentar trazer tudo em um único SQL, utilizando alguma informação de ligação.

0
19/04/2010 9:37pm
(~14 anos atrás)
Leonardo respondeu:
Valeu a atenção, Marcos,

Na verdade não trará todos os registros do banco que atendam a condição de data, porque só existirá um registro por mês, entendeu??? Com isso, não terá mais de uma linha selecionada.

Vou tentar explicar novamente. É o seguinte, estou tentando criar um SQL de validação, como se fosse um licenciamento de uso mensal.
Por exemplo, o primeiro passo é conseguir a data de hoje. Com a data de hoje, procuro uma linha na tabela tb_licenca em que a data de hoje esteja dentro do período de data inicial e final da mesma tabela. Achando essa linha, obtenho o campo "chave". Este foi o primeiro SQL.

O segundo SQL, eu busco o campo "chave_atual" da tabela tb_cliente. Esta tabela só possuirá uma única linha sempre.

Com esses dois campos de chave em mãos, comparo um com o outro. Se forem diferentes, aparecerá a mensagem de "Licença inválida". Caso sejam iguais, terá um else informando o que fazer.

Desculpem se não fui claro. O SQL ainda tá um pouco confuso para mim... rsrs.

0
21/04/2010 12:06pm
(~14 anos atrás)
Marcos Regis respondeu:
É possível deixar a lógica em um único SQL.

Poste suas tabelas para que eu verifique como deveria ser o SQL.

0
21/04/2010 9:00pm
(~14 anos atrás)
Leonardo respondeu:
Fala Marcos,

Segue aí abaixo:

Tabela "tb_cliente"

id empresa chave_atual
------------------------------------
1 Empresa Ltda. 123456789



Tabela "tb_licenca"

id data_inicial data_final chave
------------------------------------------------
1 2010-04-01 2010-04-30 123456789
2 2010-05-01 2010-05-31 101010101
3 2010-06-01 2010-06-30 202020202


Acho que é isso que vc quer, né???

0
22/04/2010 12:21am
(~14 anos atrás)
Marcos Regis respondeu:
Cara, como vc sabe qual licença é de tal empresa?
Uma licenca vale pra qualquer empresa?
A ligação é a chave da licença?

0
22/04/2010 10:56pm
(~14 anos atrás)
Leonardo respondeu:
Só terei uma empresa cadastrada na tabela "tb_cliente".

Na verdade, eu acho que terá que ser dois SQL. Porque não há ligação entre as tabelas. Tenho que extrair a chave de cada tabela e compará-las, se forem iguais sigo uma ação, e se forem diferentes sigo outra ação.

0
23/04/2010 3:01pm
(~14 anos atrás)
Marcos Regis respondeu:
O sistema está no começo? Se sim, porque não refaz a modelagem já prevendo utilizar mais de uma empresa?

Do jeito que está da pra fazer assim

$sql = 'SELECT count(*) as qt 
FROM tbl_cliente
INNER JOIN tbl_licenca ON (tbl_cliente.chave_atual = tbl_licenca.chave)
WHERE CURDATE() BETWEEN data_inicial AND data_final
AND tbl_cliente.id = 1
GROUP BY tbl_cliente.id';
$res = mysql_query($sql) or trigger_error(mysql_error());
$dados = mysql_fetch_assoc($res) or trigger_error(mysql_error());
if($dados['qt']<1)
echo"
<META HTTP-EQUIV=REFRESH CONTENT='0; URL=pga_login.php'>
<script type=\"text/javascript\">
alert(\"Licença de uso inválida. Favor atualizar.\");
</script>>";

0
24/04/2010 4:18pm
(~14 anos atrás)
Leonardo respondeu:
Marcos,

Criei um arquivo PHP com o SQL que enviou e dei um include desse arquivo na página de validação de login, porém mesmo com as chaves iguais nas tabelas está apresentando o alerta de "Licença de uso inválida".

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)