Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
MadPatryk

Como Fazer Um Item Ser Selected

Question

Galera, eu to fazendo um sistema de alunos interessados a fazer um curso de Pós Graduação aqui na minha facul...

mas to um pouco sem ideia, de como eu vou fazer o seguinte:

A lista de cursos é muito grande, são 60 cursos...

e tipo, eu queria fazer o seguinte...

eu tenho o cadastro.php, onde a atendente cadastra o aluno, e tudo mais... beleza...

e também tenho o dados.php, que ve a lista de alunos cadastrados...

nesse dados.php, já que os dados são muitos, eu fiz um link pra cada aluno, pra ver detalhes do aluno tal...

nesse detalhes, eu tenho o update.php, onde tenho um form que atualiza os dados do usuário...

nele eu tenho assim:

update.php:

<form blablabla...>
  <table blablabla>
    <tr>
        <td>Nome:</td>
        <td><input type="text" name="nome" value="<?=$x["nome"]?>">
        </td>
    </tr>
    <tr>
        <td>Curso:</td>
        <td>
            <select name="cursos" size="1">
                  <? include ('verifica_curso.php'); ?>
            </select>
        </td>
    </tr>
    <outras trs....>
    <outras trs....>
    <outras trs....>
    <outras trs....>
  </table>
</form>
bom, esse verifica_curso.php que é meu problema!!! prq, nele eu faço o seguinte... de acordo com o curso que está gravado no cadastro do user na table, eu faço ele aparecer como selecionado... mas eu to fazendo de um modo muito porco(na minha opniao), e muito grande... e queria saber se dava pra facilitar meu codigo... eu to fazendo da seguinte forma: verifica_curso.php:
<?
    if ($curso == "Anatomia")
    {
        echo "<option value=\"Anatomia\" selected>Anatomia</option>";
        echo "<option value=\"Pedagogia\">Pedagogia</option>";
        echo "<option value=\"Fisioterapia\">Fisioterapia</option>";
        echo "<option value=\"Farmacia\">Farmacia</option>";
        echo "<option value=\"Engenharia\">Engenharia</option>";
        echo "...";
    }

    if ($curso == "Pedagogia")
    {
        echo "<option value=\"Anatomia\">Anatomia</option>";
        echo "<option value=\"Pedagogia\" selected>Pedagogia</option>";
        echo "<option value=\"Fisioterapia\">Fisioterapia</option>";
        echo "<option value=\"Farmacia\">Farmacia</option>";
        echo "<option value=\"Engenharia\">Engenharia</option>";
        echo "...";
    }

    if ($curso == "Fisioterapia")
    {
        echo "<option value=\"Anatomia\">Anatomia</option>";
        echo "<option value=\"Pedagogia\">Pedagogia</option>";
        echo "<option value=\"Fisioterapia\" selected>Fisioterapia</option>";
        echo "<option value=\"Farmacia\">Farmacia</option>";
        echo "<option value=\"Engenharia\">Engenharia</option>";
        echo "...";
    }
?>

[b]e por ai vai...[/b]

intao, eu to fazendo desse jeito... mas pra mais de 60 cursos (que estao registrados no banco também), alem de ser um modo muito porco, vai causar muita lentidao na hora de rodar...

como eu posso fazer de um jeito mais leve?

valeus galera!

abração!

Share this post


Link to post
Share on other sites

15 answers to this question

Recommended Posts

  • 0

ah galera, só tem um problema, que esqueci de comentar...

é que, os registros dos cursos, fica em uma tabela separada...

na t_Cursos... e o registro dos alunos ficam em t_Alunos...

dai eu queria fazer o seguinte...

comparar as duas tables, ver o curso do aluno com o da t_Cursos, e colocar como selected na option, e logo abaixo os outros cursos...

como eu posso fazer isso?!

ajudem ai galera!!!

por favor!!!

Valeus!

Share this post


Link to post
Share on other sites
  • 0

Ow mad... facil po! =)

Primeiro vamos considerar que você tenha um retorno do DB como:

Area | Selecionado

Fisiotera | 0

Farmacia | 0

Engenharia | 1

Medicina | 0

(onde esse 0 e 1 é o que ta selecionado, 1 = sim, 0 = não)

monta um loop simples:

while ($row = mysql_fetch_assoc($re)) {
    $selected = "";
    if ($row["selecionado"] == 1)
        $selected = "selected='selected' ";

     echo "<option value='" . $row["area"] . "' $selected>" . $row["area"] . "</option>";

}

e voilá...

Pra retornar os dados desse jeito, um join simples deve resolver..

[]'s

Share this post


Link to post
Share on other sites
  • 0

po, pode cre cara...

moh burrao eu!!!

tipow, ve si meu left join ta certo... eu acho que ta, eu testei no EMS postgre e funfo...

	$c_Sql = "";
	$c_Sql .= "Select c.nome , c.descr, a.curso, a.nome" . chr(13);
	$c_Sql .= "From t_Alunos a, t_Cursos c" . chr(13);
	$c_Sql .= "Where a.nome = '$nome' c.nome = a.curso" . chr(13);

	$q_Verifica = pg_query($c_Sql);

ah, tipo, tu sabe de postgres? como é que eu posso fazer o as no postgres???

eu tentei select t.blablabla as Bla01 from blabla t... mas não funfou...

ele me retorna que o Bla01 não foi encontrado...

prq?

valeus!

Share this post


Link to post
Share on other sites
  • 0

droga cara... não to conseguindo fazer...

tipo, eu to fazendo desse jeito abaixo:

	$c_Sql = "Select c.link, c.descr,
a.curso, a.nome
From t_Alunos a, t_Cursos c
Where a.nome = 'Patryk Moura' AND c.nome = a.curso";


	$q_Verifica = pg_query($c_Sql);

	while ($show = pg_fetch_assoc($q_Verifica))
	{
  $selected = "";
  if ($x["curso"] == $show["link"])
  {
  	$selected = "selected='selected'";
  }
  echo "<option value=\"{$show["link"]}\" $selected>{$show["descr"]}</option>\n";
	}
ah, e já tentei por 2 whiles também... mas não deu em nada... quer dizer, deu na mesma... mesma coisa
	while ($show = pg_fetch_assoc($q_Verifica))
	{
  $selected = "";
  if ($x["curso"] == $show["link"])
  {
  	$selected = "selected='selected'";
  }
  echo "<option value=\"{$show["link"]}\" $selected>{$show["descr"]}</option>\n";
	}
	while ($show02 = pg_fetch_array($cursos_Select))
	{
  echo "<option value=\"{$show02["link"]}\">{$show02["descr"]}</option>\n";
	}

só que só ta me mostrando a primeira linha... selecionada... beleza...

mas não ta mostrando as outras...

como eu faço pra mostrar as outras?

to perdidao!!!

ah sim, esse $x[] é um select que eu faço com o where do user...

tipo select * from t_Alunos where nome = '$nome'

valeus!

Share this post


Link to post
Share on other sites
  • 0

Opa. Sobre o postgres, aqui funciona normal..

"select b.id_book_ref as id from book_ref as b"

me retorna só a coluna com o nome "id". To usando o postgres 8 no win.

Sobre seu problema no SQL, eu não sei como está modelada o seu DB, mas a lógica do que eu te passei ta certo. Crie a consulta no pgAdmin na mão sei la, e veja se o resultado que você quer ta vindo certo primeiro.

Se o retorno do select estiver certo, o codigo tem que funcionar.

Select c.link, c.descr,

a.curso, a.nome

From t_Alunos a, t_Cursos c

Where a.nome = 'Patryk Moura' AND c.nome = a.curso";

eu particularmente prefiro usar os joins explicitos. tipo...

select c.link, c.descr, a.curso, a.nome from t_alunos as a

inner join t_cursos as c on a.nome = 'Patryk Moura' and c.nome = a.curso;

Mas acho que não tem diferença na saida (internamente tem).

Só não entendi uma coisa. Pelo seu select, como você sabe o que você tem que selecionar?

Share this post


Link to post
Share on other sites
  • 0

como assim?

tipo, no meu select(query)?

eu seleciono, o link(onde fica a coluna que registra tipo uma sigla da palavra... fiz isso, prq tem cursos que tem palavras grandes, dai eu pus link, pra ser tipo um sigla, mas ta como nome "link", prq eu também uso como um link - que é outro caso...) - na table t_Cursos

o descr(que é a descrição, o nome completo do curso...) na table t_Cursos

nome(que é o nome do curso) na table t_Cursos

e nome(que é o nome do aluno) na table t_Alunos

tipo, ta funcionando cara, a instrução sql ta ok... ta funfando...

mas só ta me retornando 1 linha...

que eu não quero... eu quero que retorne essa linha (selecionada - que já consegui fazer), e também as outras linhas com os outros registros!

intendeu?

valeus!

Abraço!

Share this post


Link to post
Share on other sites
  • 0

Calma.. ceis tão complicando :-p

O que eu quis dizer MadPatryk é que a logica do programa tava certa. Aquele while la você não mexe nele, não precisa de 2...

O que você tem que trabalhar é o seu select. Você primeiro pensa como você quer os dados, depois você dá um jeito do select mandar eles do jeito que você precisa.

O seu caso é simples... um select com um case ai resolveria. Mas pra esse loop funcionar o que você precisa é uma consulta que te retorne somente uma lista de ID, Area e se ela esta selecionada ou não, afinal é só isso que você precisa exibir

To julgando que exista uma tabela de "cursos", uma tabela "alunos" e uma juncao com os curso que o aluno esta cadastrado... (acho que seria a forma mais correta de representar isso

CURSOS { id_curso, curso }

ALUNOS { id_aluno, nome }

CURSOS_ALUNOS { id_curso, id_aluno }

Considerando que eu sou o aluno de id 7, eu faria:

select c.id_curso, case when ca.id_curso is null then 0 else 1 end as selecionado from (
	select c.* from curso as c
	inner join curso_aluno as ca on c.id_curso = ca.id_curso
	where ca.id_aluno = 7
) as ca
right join curso as c on ca.id_curso = c.id_curso

Primeiro você entende o que você precisa retornar, depois faz o seu SQL retornar do jeito que você precisa. Não fica tentando mudar a logica toda hora só porque o select não ta certo. Senão você fica mudando aqui e ali e acaba se confundindo mais... uma coisa de cada vez.

Share this post


Link to post
Share on other sites
  • 0

vlw, acho que entendi mais ou menos...

mas tipo, eu não tenho essa terceira tabela...

eu preciso mesmo cria-la??

eu não poderia fazer isso com chaves estrangeiras não?

mas vou tentar aki, ve si dou um jeito...

valeus!

Share this post


Link to post
Share on other sites
  • 0

eu fiz da forma que você disse natan que mudava internamente... mas deu no mesmo... ele só me retorna 1 linha... que corresponde ao curso do cara... mas não retorna as outras linhas... poxa cara, é só com 3 tabelas que eu vou poder fazer isso?

fico assim ó:

	$c_Sql .= "Select c.link, c.descr, a.curso, a.nome" . chr(13);
	$c_Sql .= "From t_alunos as a" . chr(13);
	$c_Sql .= "Inner Join t_cursos as c" . chr(13);
	$c_Sql .= "On a.nome = '$nome' and c.nome = a.curso";


	$q_Verifica = pg_query($c_Sql);

	while ($show = pg_fetch_assoc($q_Verifica))
	{
  $selected = "";
  if ($x["curso"] == $show["link"])
  {
  	$selected = "selected='selected'";
  }
  echo "<option value=\"{$show["link"]}\" $selected>{$show["descr"]}</option>\n";
	}

ah guilherme, eu o aluno vai ver o curso que ele escolheu, num campo "select" de um form html... como mostrado acima...

valeus galera

brigadao pela atenção...

Abraço

Share this post


Link to post
Share on other sites
  • 0

tipo kras, eu consegui fazendo assim ó:

	$c_Sql = "";
/*  $c_Sql .= "Select c.link, c.descr, a.curso, a.nome" . chr(13);
	$c_Sql .= "From t_alunos as a" . chr(13);
	$c_Sql .= "Inner Join t_cursos as c" . chr(13);
	$c_Sql .= "On a.nome = '$nome' and c.nome = a.curso"; */

	$c_Sql .= "Select curso from t_Alunos where nome = '$nome'";


	$q_Verifica = pg_query($c_Sql);

/*	while ($show = pg_fetch_assoc($q_Verifica))
	{
  $selected = "";
  if ($x["curso"] == $show["link"])
  {
  	$selected = "selected='selected'";
  }
  echo "<option value=\"{$show["link"]}\" $selected>{$show["descr"]}</option>\n";
	} */

	$show = pg_fetch_assoc($q_Verifica);
	$query = pg_query($cursos_Select);

	while ($curso = pg_fetch_array($query))
	{
  $selected = "";
  if ($curso["link"] == $show["curso"])
  {
  	$selected = "selected='selected'";
  }
  echo "<option value=\"{$curso["link"]}\" $selected>{$curso["descr"]}</option>\n";
	}

ps.: esse $cursos_Select, ta dentro do config.php, e seleciona todos os cursos pra serem mostrados em um while...

po, ficou do jeito que eu quero, o curso do aluno selecionado e os outros registros abaixo...

mas como podem ver, ficou um lixo de bagunçado....

tipo, eu usei 2 selects, e tem como eu usar um só, como tu fez natan, mas tipo, repito minha pergunta do outro post...

eu preciso mesmo utilizar 3 tabelas???

não poderia ser com uma chave estrangeira, sei la???

qualquer coisa... mas só utilizando essas 2 tables... ???

valeus!

Share this post


Link to post
Share on other sites
  • 0

Patryk, você não tem obrigação de usar 3 tabelas. Foi só uma suposição que eu fiz, já que não conheço direito as suas tabelas.

Se você cada aluno está matriculado em apenas 1 curso, você pode usar uma foreign key na tabela aluno mesmo.

Agora presta atençao, não importa como estão os dados. Você tem na banco de dados a lista de cursos? você tem no banco de dados qual curso o aluno está matriculado?

Então pronto. De alguma forma você tem como trazer numa consulta só a lista de cursos e qual deles o aluno está. Basta brincar um pouco com joins.

No caso eu fiz um select só do curso que o aluno está matriculado, e com o resultado dei um right join na lista de cursos, e aonde o aluno estivese matriculado eu joguei um 1, onde não estivesse eu joguei um zero.

Não tem que fazer 2 whiles. Para um pouco, que o que você tem que resolver é o seu select. A logica daquele primeiro exemplo tá certa.

Quebra um pouco a cabeca, qualquer coisa tira a dúvida de como fazer inner joins, se precisar posta como esta organizado os dados ai, mas resolve numa consulta só que ai fica mais limpo do jeito que você quer. O que você precisa é uma lista assim:

Curso | Selecionado

------------------------

Fisioterapia | 0

Medicina | 0

Ciencia da Computação | 1

Direito | 0

Vai fundo!

[]'s

Share this post


Link to post
Share on other sites
  • 0

sim, eu tenho no banco(t_Cursos) eu tenho a linha(c.nome) da lista de todos os cursos daki...

e no outro banco(t_Alunos) eu tenho a linha(a.curso) que grava o curso que o aluno selecionou...

eu vo tentar aki, do jeito que tu falou, com a chave estrangeira... apesar de não saber muito de chaves estrangeiras(prq antes eu usei muiiito o mysql)...

mas eu vou dar uma olhada na documentação do select no site do postgres...

qualquer coisa eu posto aki!!!

valeu pela força velho!!!

Brigadão!

Share this post


Link to post
Share on other sites
  • 0

hehe então. dá pra fazer com 1...

segue o meu exemplo. 1 select pra pegar os que o cara tá, um left ou right join pra pegar todos e ai é só faze um case no select.

qualquer coisa me adiciona no MSN...

falow

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Cloud Computing


  • Forum Statistics

    • Total Topics
      148448
    • Total Posts
      643906
×
×
  • Create New...