Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jdesantos

[Resolvido] Comparador ">" não está funcionando

Recommended Posts

Bom dia pessoal!

 

Sou bem iniciante em Php estou tentando desenvolver um cadastro de alunos a título de apredizagem.

Porém estou quebrando a cabeça com o seguinte:

 

Estou fazendo uma comparação de um valor digitado em um form com um campo na tabela mysql.

Nesse campo há varios valores repetidos. O que eu quero é que se o valor passado for maior, me retorne

um alerta, mas não está funcionando para o comparador ">" - maior que. Porém funciona para "<" - menor que

e "==" - igual.

 

Eis um trecho do código:

$verifica = "SELECT * FROM turmas WHERE num='$num' AND codturma='$id'";
$result = mysql_query($verifica,$con);
While ($linha = mysql_fetch_array($result)){
$mxvag = $linha["vagas"];
if ($num > $mxvag){
	//print "<script>alert('".$linha["vagas"]."');history.back(-1);</script>";
	print "<script>alert('Esta turma já atingiu Nº máximo de vagas!');history.back(-1);</script>";
exit;
}
if ($linha["nome"]!= "") {
	print "<script>alert('Já existe matrícula para essa vaga!');history.back(-1);</script>";
}else{
	$query = "UPDATE turmas SET num='$num',nome='$nome',rm='$rm',rarg='$rarg',dnasc='$dnasc',ue='$ue',serie='$serie',tel='$tel' WHERE num='$num' AND codturma='$id'";
	mysql_query($query) or die("Erro ao cadastrar :" .mysql_error());
	print "<script>alert('Cadastro efetuado com sucesso!');history.back(-1);</script>";
}
}

Grato por qq ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente usar echo no lugar do print.

 

ps. eu n consegui usar o history.back hoje mesmo no meu sistema. Tipo normal ele funfa, mas no meio da validação em php dentro do if ele n responde.

 

cara eu n sei a resposta, mas acho que sua lógica tah de um jeito que n cai na condição > (maior que) nunk.

 

Qual a idéia do seu programa, o objetivo?

ai fica mais facil d`gente entender o codigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, acredito que o simples fato de você indentar seu código já te ajudaria a enxergar o problema.

 

Dauma olhada na condição que você tá fazendo:

 

if( $num > $mxvag ) {

   // Faz alguma coisa
   exit;
}

if( $linha["nome"] != "" ) {
   // Faz outra coisa
}

Atente para o fato de que eu apaguei o seu código mas mantive oe exit.

 

Essa sua condição só vai executar alguma coisa quando um dos dois testes retornar TRUE.

 

Se $num for, de fato, maior que $mxvag vai executar o JavaScript e abortar todo restante do código

 

Se o teste falhar vai, seu segundo teste será executado.

 

Se não houver um nome, que é o que eu imagino que seja (campo do BD referente ao nome estar vazio), vai disparar o outro JavaScript.

 

Se for qualquer outra coisa, até mesmo um espaço em branco, vai exeutar o bloco do else.

 

Veja se com essa explicação já te ajuda. Se não, poste o que ajudou e o que não ajudou e continuamos daí. :thumbsup:

 

tente usar echo no lugar do print.

Que que isso tem a ver?

 

Qual a idéia do seu programa, o objetivo?

Ele já disse que é para aprendizado ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite, Bruno!

 

Primeiramente, muito obrigado por você ter analizado o meu tópico!

Bem, o meu script está devidamente indentado. Quando eu copiei e colei, perdeu a indentação.

Como mencionei no post, se eu trocar o > por < ou mesmo ==, o código faz o que deveria fazer:

se eu colocar em $num um número menor ou igual a $linha['vagas'], ele executa o 1º javascript.

Quando a expressão está com > e eu coloco um número menor ou igual, ele executa o 2º javascritp.

Se eu coloco um número maior, ele siplesmente fecha o form e não acusa erro nenhum, mas

também não executa nada.

 

Onde estou errando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, vamos ver passo-a-passo, com dois valores hipotéticos para $num e $mxvag:

 

$num = 6;
$mxvag = 10;
if( $num > $mxvag ) {

   // Faz alguma coisa
   exit;
}

if( $linha["nome"] != "" ) {
   // Faz outra coisa
}

Da forma como suas condições estão, apenas o segundo IF será executado, isso se $linha['nome'] tiver algum valor, qualquer que seja, até mesmo um espaço em branco.

 

Pelo que oude compreender o que você quer énão permitir que o nº de alunos exceda o número de vagas E, se não atingir verifique se dado aluno já está matriculado e se estiver, não permita sua re-inscrição.

 

Supondo que seja isso mesmo, a estrutura correta dos blocos seria:

 

if( $num > $mxvag ) {

   // Bloqueia por excesso de contingente :P

} else {

   if( empty( $linha['nome'] ) ) {

       // Bloqueia por falsidade ideológica xD

   } else {

       // Libera geral, uhuuuuu ^^
   }
}

Mas agora qual a diferença?

 

Veja que cada bloco tem apenas duas possibilidades de resultado SIM e NÃO, VERDADEIRO e FALSO. Ou seja, se o primeiro for certo, cai nele. Se não, cai no outro.

 

Se ainda puderem haver candidatos para tal curso, vai cair no primeiro else, já que o primeiro if retornou FALSE (internamente).

 

Se puderem haver candidatos e o candidato atual ada iteração ainda não estiver cadastrado, ele assim o poderá, por cair no segundo else, já que o primeiro if também retornou FALSE.

 

Quando cair no IF, já vai abortar e nenhum dos outros else's serão sequer testados.

 

Atente para a alteração que fiz no seu código original, sanando o problema de um candidato sem nome.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O do echo é só por costume, que é pra aprendizado é óbvio, queria saber o que define as variáveis que estão no IF para ver se estão "batendo".

E de qualquer forma eu perguntei para ele, n se preoculpe :huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

O do echo é só por costume, que é pra aprendizado é óbvio, queria saber o que define as variáveis que estão no IF para ver se estão "batendo".

E de qualquer forma eu perguntei para ele, n se preoculpe :huh:

Calma cara, não precisa "mostrar as garras". Não notou o smiley textual após a frase?

 

Estamos todos aqui para debater livre e humildemente qualquer assunto. Eventualmente você vai se deparar com comentários que salientem os lapsos de atenção que todo ser humano tem.

 

É isso que amansa o stress de um tópico. Relaxa :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite, Bruno!

 

Fiz o que você sugeriu, mas não deu certo.

A eu escrevi o código de maneira diferente:

$verifica = "SELECT * FROM turmas WHERE num='$num' AND codturma='$id'";
$result = mysql_query($verifica,$con);
While ($linha = mysql_fetch_array($result)){
$mxvag = $linha["vagas"];
if (($num < $mxvag) || ($linha["nome"] != "")){
print "<script>alert('Já existe matrícula para essa vaga!');history.back(-1);</script>";
}
else{
if (($num < $mxvag) || ($linha["nome"] == "")){
	$query = "UPDATE turmas SET num='$num',nome='$nome',rm='$rm',rarg='$rarg',dnasc='$dnasc',ue='$ue',serie='$serie',tel='$tel' WHERE num='$num' AND codturma='$id'";
	mysql_query($query) or die("Erro ao cadastrar :" .mysql_error());
	print "<script>alert('Cadastro efetuado com sucesso!');history.back(-1);</script>";
}
//print "<script>alert('".$mxvag."');history.back(-1);</script>";
print "<script>alert('Esta turma já atingiu Nº máximo de vagas!');history.back(-1);</script>";
}
}

 

mas não adiantou.

Mesmo que eu atribua diretamente um valor para $mxvag, não executa o commando, que nesse caso agora é o último print, se $num for maior.

Enquanto $num for menor ou igual, funciona direitinho. Se for maior, fecha o form e não exibe nada, mas também não altera nada no BD.

Já estou ficando irritdo!

Não deveria funcionar?

Ah! você interpretou corretamente a idéia dos if's: se na linha do num o campo nome estiver preeenchido, a vaga já está ocupada, se nome

estiver vazio, vaga livre, inclui e se num for maior, não tem mais vaga.

 

Muito obrigado pela sua paciência.

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja, a ausência do segundo else vai fazer o alert do último print aparecer mesmo que a turma não esteja cheia e o novo aluno tenha sido matriculado com sucesso.

 

Evite sempre colocar comandos à deriva, sem nada que os controle, caso contrário alguma coisa pode acontecer de forma inesperada.

 

Veja também que você mudou drásticamente a estrutura dos IF's que eu passei. Primeiro que você está executando DUAS VEZES o mesmo teste lógico.

 

Pensa bem, se o primeiro retornar FALSE fazendo o fluxo do programa se dirigir a primeiro ELSE, porque cargas d'água o segundo teste que é idêntico ao primeiro deveria retornar TRUE?

 

Refaça usando a estrutura que eu te passei antes e veja se funciona. A propósito, não se desfaça do empty(),se não vai haver problemas com usuários "engraçadinhos".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja, a ausência do segundo else vai fazer o alert do último print aparecer mesmo que a turma não esteja cheia e o novo aluno tenha sido matriculado com sucesso.

 

Evite sempre colocar comandos à deriva, sem nada que os controle, caso contrário alguma coisa pode acontecer de forma inesperada.

 

Veja também que você mudou drásticamente a estrutura dos IF's que eu passei. Primeiro que você está executando DUAS VEZES o mesmo teste lógico.

 

Pensa bem, se o primeiro retornar FALSE fazendo o fluxo do programa se dirigir a primeiro ELSE, porque cargas d'água o segundo teste que é idêntico ao primeiro deveria retornar TRUE?

 

Refaça usando a estrutura que eu te passei antes e veja se funciona. A propósito, não se desfaça do empty(),se não vai haver problemas com usuários "engraçadinhos".

 

Olá Bruno!

 

Eu já fiz como você sugeriu, mas não funcionou.

Estou quase arrancando os cabelos!

Bom, vou tentar explicar exatamente o que quero fazer:

 

Tenho uma tabela chamada Turmas e dois forms que alimentam essa tabela.

Um é cad_turmas onde eu cadastro as informações das turmas.

O outro é 'cad_aluno_turma' no qual eu cadastro as informações dos alunos.

Entre os campos referentes a turma tem o 'vagas' e o campo 'num' que é autoincremento. Quando eu cadastro uma turma o bd vai gerar uma quantidade de linhas de acordo com campo 'vagas', incrementando o campo 'num' e repetindo o campo 'vagas'. Só que os campos referentes aos dados dos alunos ficam em branco. Para inserir um aluno, deve ser verificado se na linha do campo 'num' o campo 'nome' está em branco, se estiver cadastra, se não, exibe mensagem de vaga ocupada. Se todas as linha do campo 'num' já tiver um nome cadastrado, deve exibir mensagem de não há vagas.

 

Vê se dá para entender.

 

Ah! É muito interessante como você expõe suas idéias, dando inclusive, outras sugetões!

 

Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, agora tenho um servidor para testar. Agora vamos fazer as coisas com certeza, testando.

 

Usei este código:

 

$num = 2;
$mxvag = 10;
$linha['nome'] = 'Bruno';

if( $num > $mxvag ) {

   print '<script type="text/javascript">alert( "Bloqueado por excesso de contingente :P" );</script>';

} else {

   if( empty( $linha['nome'] ) ) {

       print '<script type="text/javascript">alert( "Bloqueado por falsidade ideológica xD" );</script>';

   } else {

       print '<script type="text/javascript">alert( "Libera geral, uhuuuuu ^^" );</script>';
   }
}

Simulei três valores para as variáveis envolvidas.

 

E deu tudo certo. Exatamente desse jeito, vejo o terceiro alert().

 

Se anulo a variável do nome, vejo o segundo. E se forço,sei lá, um onze no lugar do dois, vejo o primeiro.

 

Com isso fica a pergunta? O que tem nessas variáveis afinal de contas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, agora tenho um servidor para testar. Agora vamos fazer as coisas com certeza, testando.

 

Usei este código:

 

$num = 2;
$mxvag = 10;
$linha['nome'] = 'Bruno';

if( $num > $mxvag ) {

   print '<script type="text/javascript">alert( "Bloqueado por excesso de contingente :P" );</script>';

} else {

   if( empty( $linha['nome'] ) ) {

       print '<script type="text/javascript">alert( "Bloqueado por falsidade ideológica xD" );</script>';

   } else {

       print '<script type="text/javascript">alert( "Libera geral, uhuuuuu ^^" );</script>';
   }
}

Simulei três valores para as variáveis envolvidas.

 

E deu tudo certo. Exatamente desse jeito, vejo o terceiro alert().

 

Se anulo a variável do nome, vejo o segundo. E se forço,sei lá, um onze no lugar do dois, vejo o primeiro.

 

Com isso fica a pergunta? O que tem nessas variáveis afinal de contas?

 

 

Olá, Bruno!

 

Consegui resolver o meu problema.

Fora as questões de segurança, que você percebeu, não há nada de errado no código.

Era a versão do mysql: 5.0. Não sei se isso procede, mas instalei a 5.5 e o script está funcionando.

Talvez alguma configuração, não sei. Ou quem sabe o php, pois eu instalei o WampServer e está ok.

 

Muito grato pelos seus esforços para me ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmmmmm.... Sei não hein

 

Se trocando a versão do MySQL o problema, então, poderia estar na query. Alguma aspa mal-fechada ou não aberta...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.