Ir para conteúdo

POWERED BY:

Arquivado

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

Alberto Leôncio

if (while == 0) {

Recommended Posts

$select = mysql_query("SELECT * FROM minicursos");
echo '<select name="minicurso" style="width: auto;">';
while ($nfo2 = mysql_fetch_object($select)) {
	$id = $nfo2->id;
	$vagas = $nfo2->vagas;
	$count = mysql_query("SELECT count(*) FROM inscricoes WHERE minicurso = '$id'");
	$resto = ($vagas - mysql_result($count, 0));
	if ($resto > '0') {
		echo '<option value="'.$id.'">'.$nfo2->nome.'. '.$resto.' vaga(s)</option>';
	} else {
	}
}
echo '</select>';

 

Bom, tenho esse código para fazer uma contagem de vagas. Toda vez que alguém se inscreve, subtrai uma vaga no minicurso, e quando acabar as vagas, o <option> some.

 

O problema é: E quando não tiver mais nenhuma vaga em minicurso nenhum, como fazer para que o <select> inteiro suma e só aparecer um "não temos vagas"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes disto tudo você vai ter que saber qual o total de vagas e quantos já foram inscritos, se o número de inscritos for igual ou superior ao de vagas "não temos vagas", senão exibe o que você já está fazendo...

 

Acredito que neste seu caso daria para montar uma unica query para tudo, assim você já verificaria direto se ela retornou alguma linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, tenta fazendo assim:

 

<?php
$select = "SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicurso AS m 
	WHERE resto > 0";
$select = mysql_query($select);
$nfo2 = mysql_fetch_object($select);

if (count($nfo2)) {
	echo '<select name="minicurso" style="width: auto;">';
	
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	
	echo '</select>';
}
?>

 

Eu não testei, apenas montei.

Não sei se minha consulta esta precisamente correta.

 

Se não der certo, me avise que monto tabelas no banco de dados simulando as suas e testo o código.

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites


$select = mysql_query("SELECT * FROM minicursos");

echo '<select name="minicurso" style="width: auto;">';

while ($nfo2 = mysql_fetch_object($select)) {

$id = $nfo2->id;

$vagas = $nfo2->vagas;

$count = mysql_query("SELECT count(*) FROM inscricoes WHERE minicurso = '$id'");

$resto = ($vagas - mysql_result($count, 0));

if ($resto > '0') {

echo '<option value="'.$id.'">'.$nfo2->nome.'. '.$resto.' vaga(s)</option>';

} else {

echo '<option value="">Não há vagas.</option>';

exit();

}

}

echo '</select>';

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esqueci de colocar o "não temos vagas":

 

<?php
$select = "SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicurso AS m 
	WHERE resto > 0";
$select = mysql_query($select);
$nfo2 = mysql_fetch_object($select);
 
if (count($nfo2)) {
	echo '<select name="minicurso" style="width: auto;">';
	
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}
?>

 

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes disto tudo você vai ter que saber qual o total de vagas e quantos já foram inscritos, se o número de inscritos for igual ou superior ao de vagas "não temos vagas", senão exibe o que você já está fazendo...

 

Acredito que neste seu caso daria para montar uma unica query para tudo, assim você já verificaria direto se ela retornou alguma linha.

 

A quantidade de vagas eu coloco na própria tabela:

INSERT INTO `minicursos` (`id`, `nome`, `vagas`) VALUES
(1,	'mincurso1',	'9'),
(2,	'minicurso2',	'7'),
(3,	'mincurso3',	'15');

 

 

 

A quantidade de inscritos eu consigo fazendo a contagem na tabela de inscritos:

SELECT count(*) FROM inscricoes WHERE minicurso = '$id'

 

 

 

Em um minicurso, quando a quantidade de vagas iguala a de inscritos, o <option> some, até aí tudo bem. O caso é quanto todos os minicursos estiverem lotados, queria fazer o campo <select> sumir e aparecer a mensagem "não temos vagas".

 

__________________________________________________________________________________________________________

 

 

 

$select = mysql_query("SELECT * FROM minicursos");
echo '<select name="minicurso" style="width: auto;">';
while ($nfo2 = mysql_fetch_object($select)) {
	$id = $nfo2->id;
	$vagas = $nfo2->vagas;
	$count = mysql_query("SELECT count(*) FROM inscricoes WHERE minicurso = '$id'");
	$resto = ($vagas - mysql_result($count, 0));
	if ($resto > '0') {
	    echo '<option value="'.$id.'">'.$nfo2->nome.'. '.$resto.' vaga(s)</option>';
	} else {
            echo '<option value="">Não há vagas.</option>';
            exit();
	}
}
echo '</select>';

Quando a quantidade de vagas de um minicurso acaba, o <option> some, como deveria.

O caso é fazer o <select> inteiro sumir quanto todas as vagas de todos os minicursos acabarem.

 

__________________________________________________________________________________________________________

 

Esqueci de colocar o "não temos vagas":

 

<?php
$select = "SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicurso AS m 
	WHERE resto > 0";
$select = mysql_query($select);
$nfo2 = mysql_fetch_object($select);
 
if (count($nfo2)) {
	echo '<select name="minicurso" style="width: auto;">';
	
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}
?>

 

 

Att,

Eu testei a consulta e voltou esse erro:

Erro na consulta (1054): Unknown column 'i.minicursos' in 'where clause'

 

Queria entender essa consulta sua... Ficou tão complexo que não entendi! :-)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu vou explicar amigo. Enquanto isso testa com esta consulta por favor:

 

$select = "SELECT m.id, m.nome, (SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto FROM minicursos AS m WHERE resto > 0";

 

 

 

Certifique-se que tá copiando, pois o erro disse "i.minicursos" e na consulta é "i.minicurso" (sem plural). Mas de toda forma o nome da tabela de minicursos tava errada, por isso passei de novo.

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Eu vou explicar amigo. Enquanto isso testa com esta consulta por favor:

 

$select = "SELECT m.id, m.nome, (SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto FROM minicursos AS m WHERE resto > 0";

 

 

 

Certifique-se que tá copiando, pois o erro disse "i.minicursos" e na consulta é "i.minicurso" (sem plural). Mas de toda forma o nome da tabela de minicursos tava errada, por isso passei de novo.

 

Abs.

 

Vi que o nome estava no singular e troquei para o plural, imaginei ser acidental. Retornou esse erro:Erro na consulta (1054): Unknown column 'resto' in 'where clause'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora melhorou.

 

Estou explicando a consulta, mas vai tenta mais uma vez, assim agora:

 

$select = "SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicursos AS m 
	WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";

 

 

Vlw.



Vamos a explicação do que tentei fazer...

 

Primeiro é importante vc entender que nessa consulta, eu defini que a tabela "minicursos" chama "m" e a "inscricoes" chama "i". Isso está na consulta, só olhar nela que vc vai identificar essas duas partes que significam exatamente isso que falei:

 

minicursos AS m
inscricoes AS i

 

 

Ok, o começo da consulta é os dados que queremos trazer do banco de dados, então começamos com os simples:

 

 

SELECT m.id, m.nome,

 

 

Isso significa que eu tô pedindo para puxar os campos "id" e "nome" da tabela "m" (o banco de dados entende o que é a tabela "m" mesmo que eu ainda vá definir ela na consulta só mais pra frente).

 

Depois queremos trazer o valor "resto", que é exatamente o número já calculado de quantas vagas é disponível.

Sempre é melhor calcular tudo possível no banco de dados e trazer as informações o mais pronto possível, tá? Pois o SGBD é muito mais rápido que o PH.

 

Mas pra ter o valor resto, eu preciso saber como eu faço pra pegar o número de inscrições naquele minicurso. E é assim:

 

 

SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id

 

O COUNT(*) está contando quantas inscrições tem na tabela "inscricoes" que chamei de "i", onde valor do campo "minicurso" da tabela "i" é igual o valor do campo "id" da tabela "m".

 

Agora, se eu quero saber o valor resto, eu preciso pegar o número de vagas e subtrair o número de inscrições. Ficaria assim:

 

m.vagas - COUNT(*)

Então eu pego essa minha nova consulta e ela vai ser uma SUBCONSULTA para definir o valor resto. Isso funciona fazendo assim:

 

SELECT m.id, m.nome, SELECT (m.vagas - COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto

Mas aqui ainda falta eu definir de onde estou puxando o id, nome e vagas. Então eu defino a tabela "m" e apelido ela através de:

 

FROM minicursos AS m

Sendo assim, temos:

 

SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicursos AS m 

Beleza. Tenho uma consulta que funciona já. Mas essa está me retornando inclusive os cursos que tem zero vagas. Ou seja, eu não preciso que me retorne os cursos que já tem o número inscrições preenchido. Então fazendo uma condição que conta o número de inscrições (a consulta que fizemos antes) no curso e vê ainda é menor que o número de vagas:

WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas

Note que a consulta fica entre parênteses. Isso que defini que ela é uma subconsulta.

 

Por final, temos nosso resultado:

SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicursos AS m 
	WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas

 

Ainda tem como melhorar essa consulta. Poderíamos contar as inscrições apenas uma vez e salvar em uma variável para usar durante a consulta. Mas dessa forma já está bem melhor do que fazer várias consultas e calcular tudo através do PHP.

 

No PHP, essa condição:

if (count($nfo2))

É a que vai saber se retornou resultados ou não. Ela conta o número de resultados. Se tiver retornado, ele deixa imprimir o select na tela. Caso não, imprime a mensagem de que não há mais vagas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Agora melhorou.

 

Estou explicando a consulta, mas vai tenta mais uma vez, assim agora:

 

$select = "SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicursos AS m 
	WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";

 

Vlw.

 

 

Vamos a explicação do que tentei fazer...

 

Primeiro é importante vc entender que nessa consulta, eu defini que a tabela "minicursos" chama "m" e a "inscricoes" chama "i". Isso está na consulta, só olhar nela que vc vai identificar essas duas partes que significam exatamente isso que falei:

minicursos AS m
inscricoes AS i

 

Ok, o começo da consulta é os dados que queremos trazer do banco de dados, então começamos com os simples:

 

SELECT m.id, m.nome,

 

Isso significa que eu tô pedindo para puxar os campos "id" e "nome" da tabela "m" (o banco de dados entende o que é a tabela "m" mesmo que eu ainda vá definir ela na consulta só mais pra frente).

 

Depois queremos trazer o valor "resto", que é exatamente o número já calculado de quantas vagas é disponível.

Sempre é melhor calcular tudo possível no banco de dados e trazer as informações o mais pronto possível, tá? Pois o SGBD é muito mais rápido que o PH.

 

Mas pra ter o valor resto, eu preciso saber como eu faço pra pegar o número de inscrições naquele minicurso. E é assim:

 

SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id

O COUNT(*) está contando quantas inscrições tem na tabela "inscricoes" que chamei de "i", onde valor do campo "minicurso" da tabela "i" é igual o valor do campo "id" da tabela "m".

 

Agora, se eu quero saber o valor resto, eu preciso pegar o número de vagas e subtrair o número de inscrições. Ficaria assim:

m.vagas - COUNT(*)
Então eu pego essa minha nova consulta e ela vai ser uma SUBCONSULTA para definir o valor resto. Isso funciona fazendo assim:

SELECT m.id, m.nome, SELECT (m.vagas - COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
Mas aqui ainda falta eu definir de onde estou puxando o id, nome e vagas. Então eu defino a tabela "m" e apelido ela através de:

FROM minicursos AS m
Sendo assim, temos:

SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicursos AS m 
Beleza. Tenho uma consulta que funciona já. Mas essa está me retornando inclusive os cursos que tem zero vagas. Ou seja, eu não preciso que me retorne os cursos que já tem o número inscrições preenchido. Então fazendo uma condição que conta o número de inscrições (a consulta que fizemos antes) no curso e vê ainda é menor que o número de vagas:
WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas
Note que a consulta fica entre parênteses. Isso que defini que ela é uma subconsulta.

 

Por final, temos nosso resultado:

SELECT m.id, m.nome,
	(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
	FROM minicursos AS m 
	WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas

Ainda tem como melhorar essa consulta. Poderíamos contar as inscrições apenas uma vez e salvar em uma variável para usar durante a consulta. Mas dessa forma já está bem melhor do que fazer várias consultas e calcular tudo através do PHP.

 

No PHP, essa condição:

if (count($nfo2))
É a que vai saber se retornou resultados ou não. Ela conta o número de resultados. Se tiver retornado, ele deixa imprimir o select na tela. Caso não, imprime a mensagem de que não há mais vagas.

:clap: :clap: :clap:

Você é bom viu!

 

 

Então agora a consulta tá funcionando certinho, verifiquei no phpMyAdmin.

 

Mas na página tá dando outro erro. Não está imprimindo os dados ($values->id por exemplo).

 

Eu usei o código abaixo. Nunca usei o foreach, então não sei como proceder agora.

$select = "SELECT m.id, m.nome,
		(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
		FROM minicursos AS m 
		WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";
$select = mysql_query($select);
$nfo2 = mysql_fetch_object($select);
if (count($nfo2)) {
	echo '<select name="minicurso" style="width: auto;">';
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}

 

O HTML está saindo assim:

<select name="minicurso" style="width: auto;">
 <option value="">.  vaga(s)</option>
 <option value="">.  vaga(s)</option>
 <option value="">.  vaga(s)</option>
</select>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vish amigo, o código PHP eu fiz errado. Desculpe, acho que eu estava com sono quando fiz. O fato de não ter como testar o código aqui também atrapalha, mas a gente chega lá:

$select = "SELECT m.id, m.nome,
		(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
		FROM minicursos AS m 
		WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";
		
while ($nfo2 = mysql_fetch_object($select))
	$row[] = $nfo2;
	
if (count($row)) {
	echo '<select name="minicurso" style="width: auto;">';
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}

 

Tente assim por favor!

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Vish amigo, o código PHP eu fiz errado. Desculpe, acho que eu estava com sono quando fiz. O fato de não ter como testar o código aqui também atrapalha, mas a gente chega lá:

$select = "SELECT m.id, m.nome,
		(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
		FROM minicursos AS m 
		WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";
		
while ($nfo2 = mysql_fetch_object($select))
	$row[] = $nfo2;
	
if (count($row)) {
	echo '<select name="minicurso" style="width: auto;">';
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}

Tente assim por favor!

Abs.

 

Voltou agora um:

 

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in/home/hugomene/biouesb.com/semana2013/inscricoes/minicurso.php on line 45

 

Hum... Depois do while ( ) não vem um { } ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa do {} amigo, pois quando não colocamos, ele insere no WHILE apenas o primeiro comando que vem depois. Mas se fica mais fácil pra vc entender com as chaves, eu as coloco. Desculpe que dessa vez o erro foi porque eu comi a linha do mysql_query. Não funcionaria mesmo haha:

 

<?php
$select = "SELECT m.id, m.nome,
		(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
		FROM minicursos AS m 
		WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";
		
$select = mysql_query($select);
		
while ($nfo2 = mysql_fetch_object($select)) {
	$row[] = $nfo2;
}
	
if (count($row)) {
	echo '<select name="minicurso" style="width: auto;">';
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}

 

Agora espero que funcione.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa do {} amigo, pois quando não colocamos, ele insere no WHILE apenas o primeiro comando que vem depois. Mas se fica mais fácil pra vc entender com as chaves, eu as coloco. Desculpe que dessa vez o erro foi porque eu comi a linha do mysql_query. Não funcionaria mesmo haha:

 

<?php
$select = "SELECT m.id, m.nome,
		(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
		FROM minicursos AS m 
		WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";
		
$select = mysql_query($select);
		
while ($nfo2 = mysql_fetch_object($select)) {
	$row[] = $nfo2;
}
	
if (count($row)) {
	echo '<select name="minicurso" style="width: auto;">';
	foreach ($nfo2 as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}

 

Agora espero que funcione.

 

Mais que coisa difícil :huh: :

 

Warning: Invalid argument supplied for foreach() in <b>/home/hugomene/biouesb.com/semana2013/inscricoes/minicurso.php</b> on line 51

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perdão, erro meu de novo (é o problema de não ter como testar o código).

 

Vai lá:

 

<?php
$select = "SELECT m.id, m.nome,
		(SELECT (m.vagas-COUNT(*)) FROM inscricoes AS i WHERE i.minicurso = m.id) AS resto
		FROM minicursos AS m 
		WHERE (SELECT COUNT(*) FROM inscricoes AS i WHERE i.minicurso = m.id) < m.vagas";
		
$select = mysql_query($select);
		
while ($nfo2 = mysql_fetch_object($select))
	$row[] = $nfo2;
	
if (count($row)) {
	echo '<select name="minicurso" style="width: auto;">';
	foreach ($row as $values) {
		echo '<option value="' . $values->id . '">' . $values->nome . '. ' . $values->resto . ' vaga(s)</option>';
	}
	echo '</select>';
} else {
	echo 'Não temos vagas.';
}

 

Tomei vergonha na cara e li todo ele antes de te postar, tá? Agora tem que rolar haha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não sei. Entrei pro fórum faz dois dias só, estou conhecendo ainda.

 

Acho que tem uma forma de vc marcar como resolvido e dar positivo na minha reputação.

 

Dá uma olhada nisso aí, não faço questão da reputação, mas o tópico como resolvido pode ajudar outras pessoas no futuro.

 

Fico feliz que tenha funcionado.

 

Abraços.

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.