Jump to content
cheires

[resolvido] Comparação de valores vindos da BD

Recommended Posts

cheires

Olá a todos.

Até estou com um pouco de vergonha de postar esta duvida aqui...  😳 mas cá vai.

é o seguinte:

estou a ler da base de dados dois valores inteiros. Um refere-se ao nimero máximo de inscritos permitidos em determinada actividade, e outro ao numero de inscritos nessa actividade.

O problema é o seguinte.

Estou a usar o seguinte código:

$result = mysql_query("select count(cod_inscricao) from pessoa where cod_actividade =".$cod_actividade);
            while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
            {
                $numero_inscritos = $row[count(cod_inscricao)];
            }
            $result = mysql_query("select max from actividade where cod_actividade = ".$cod_actividade);
            while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
            {
                $max = $row[max];
            }

            if ($numero_inscritos >= $max)
            {
                header('Location:fechado.php');
                exit;
            }

onde no primeiro while vou buscar o numero de inscrições existentes, no 2º vou buscar o numero maximo de inscrições permitidas

No if testo para verificar se o numero de inscritos ultrapassou o máximo, e caso ultrapasse (condição seja verdade) me redirecciona para uma pagina onde comunica que não se pode inscrever.

Caso a condição seja falsa, continua a contstrução do fomulario para efectuar a inscrição.

O problema está que, o IF não está a funcionar.

Ora me deixa inscrever, quando já estão inscritas o maximo das pessoas, ora não me deixa inscrever quando ainda não foi atingido o máximo das inscrições.

Alguém consegue vislumbrar algum problema com esse código?

É que eu estou mesmo a desesperar com isso, já perdi umas horas com uma coisa tão simples como isto.

Agradeço a todos.

Share this post


Link to post
Share on other sites
mjamado

Duas coisas:

1. Para que são os while? As queries não devolvem apenas um valor cada uma?

2. A primeira query parece-me engatada; podes mostrar a estrutura dessa tabela e duas ou três linhas de dados de exemplo?


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
cheires

Sim as querys devolvem apenas um valor, os while são apenas para, caso isso não aconteça, devolve o ultimo valor.

A tabela pessoa;

cod_inscricao  | int(11)      | NO   | PRI | NULL    | auto_increment |
| cod_actividade | int(11)      | NO   |     | NULL    |                |
| nome           | varchar(50)  | NO   |     | NULL    |      

....

as linhas de dados

     9 |              1 | um     |       | masculino |              |        |            |          |      |                          |           |            |           |
|            10 |              1 | dois   |       | masculino |              |        |            |          |      |                          |           |            |           |
|            11 |              1 | três   |       | masculino |              

Onde tem um, dois, e três, é o campo nome.

Share this post


Link to post
Share on other sites
mjamado

Ok, então vamos lá:

1. Evita os while - usa antes if para confirmar se são válidos e pronto;

2. Na primeira query usa antes um COUNT(*), que o motor MySQL está optimizado para isso, e dá um alias ao campo;

3. Ao aceder às propriedades dos arrays, usa aspas ou plicas no nome dos campos - da forma que tens, pode funcionar nalguns servidores e noutros não;

4. Tens que plicar (com backticks) o campo max da tabela actividade, porque max também é uma palavra reservada do MySQL e sabe-se lá o que pode acontecer.

Resumindo, e vê lá se isto funciona:

$result = mysql_query("SELECT COUNT(*) AS num_pessoas FROM pessoa WHERE cod_actividade = " . $cod_actividade);
$q1 = mysql_fetch_array($result,MYSQL_ASSOC)

$result = mysql_query("SELECT `max` FROM actividade WHERE cod_actividade = " . $cod_actividade);
$q2 = mysql_fetch_array($result,MYSQL_ASSOC))

if(!empty($q1) && !empty($q2))
{
    if($q1['num_pessoas'] >= $q2['max'])
    {
        header('Location: fechado.php');
        exit();
    }
    else
    {
        // tudo ok, continuar com a execução normal
    }
}
else
{
    // as queries estão engatadas - fazer alguma coisa
}


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

Já agora. O que é que é uma query engatada?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mjamado

Já agora. O que é que é uma query engatada?

Fubar, fucked up, lixada, endrominada... em suma, errada.  :D

(esta em concreto, por acaso, não estava)


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
cheires

Antes de mais, obrigado pelas respostas, e pela ajuda.

Quanto ao resultado, ainda não resulta.

if($q1['num_pessoas'] >= $q2['max'])
    {
        header('Location: fechado.php');
        exit();
    }

Neste ponto mais especificamente.

Se comparo as vairáveis directamente, executa sempre o código que está dentro do IF.

Se comparo uma variável com, ou directamente com um valor ou com uma variavel iniciada directamente com o valor, essa comparação não é feita, e não executa o código dentro do IF, apesar de o seu resultado ser verdade.

Será alguma especificação do browser? do PHP?

Share this post


Link to post
Share on other sites
pedrotuga

As variáveis não têm o que teu pensas que têm.

faz um print_r() de $q1 e $q2

echo "<pre>";
print_r($q1);
print_r($q2);
echo "</pre>";

Share this post


Link to post
Share on other sites
mjamado
Quanto ao resultado, ainda não resulta.

if($q1['num_pessoas'] >= $q2['max'])
    {
        header('Location: fechado.php');
        exit();
    }

Neste ponto mais especificamente.

Ah, claro, falta um pormenor...  :( Como não estou habituado às instruções mysql_*, esqueço-me que elas devolvem sempre em linhas, mesmo que só seja devolvida uma linha... O if tem de ser:

if($q1[0]['num_pessoas'] >= $q2[0]['max'])


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
pedrotuga

mjamado,

agora trocaste o tico ao pessoal. Acho que estás a fazer confusão, ou então confundiste-me a mim :(

Esse código acho que não funciona. Um resultset, quando passado a uma função mysql_fetch_* só devolve uma linha, o que acontece é que o ponteiro interno que aponta para a linha corrente, é 'incrementado'. Mas tanto quanto sei só uma linha é que é catada de cada vez.

Share this post


Link to post
Share on other sites
scorch

mjamado,

agora trocaste o tico ao pessoal. Acho que estás a fazer confusão, ou então confundiste-me a mim :(

Esse código acho que não funciona. Um resultset, quando passado a uma função mysql_fetch_* só devolve uma linha, o que acontece é que o ponteiro interno que aponta para a linha corrente, é 'incrementado'. Mas tanto quanto sei só uma linha é que é catada de cada vez.

Só retorna uma linha, razão pela qual eu costumo criar uma função que me gera automaticamente o array quando preciso. :D

Por isso é que se costuma usar a função directamente nos ciclos, como o com o while. :D

while ($row = mysql_fetch_assoc($query))


PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
mjamado

mjamado,

agora trocaste o tico ao pessoal. Acho que estás a fazer confusão, ou então confundiste-me a mim :(

Esse código acho que não funciona. Um resultset, quando passado a uma função mysql_fetch_* só devolve uma linha, o que acontece é que o ponteiro interno que aponta para a linha corrente, é 'incrementado'. Mas tanto quanto sei só uma linha é que é catada de cada vez.

Ya, é isso. Bleargh, funções mysql_* 👎


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

Ya, é isso. Bleargh, funções mysql_* 👎

então quais é que usas (para o mysql)? As mysqli_*?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mjamado

então quais é que usas (para o mysql)? As mysqli_*?

Por magnitude de utilização, e pela ordem em que posso usar (alguns sites e/ou servidores, por várias razões, poderão não usar os primeiros da lista).

1. Com uma grande distância em relação aos restantes, uma ORM minha, feita "lá atrás" com PDO;

2. PDO;

3. O pacote MDB2 do PEAR (sites mais antigos);

4. A extensão MySQLi, mas sempre na versão OOP e nunca pelas funções mysqli_*.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.