PHP é à quinta-feira – Sabe popular uma combobox?

32 Comentários

Por Pedro Peixoto para o PPLWARE

Esta semana vamos regredir um pouco o nível de dificuldade do artigo, e para os programadores mais iniciados vamos explicar como popular dinamicamente elementos “select” através de uma tabela da base de dados (MySQL).

php

Antes demais para programarem em PHP necessitam de um servidor, do PHP e de uma Base de dados (caso seja necessária). Felizmente existem “pacotes” que já trazem tudo o que é necessário (Apache, MySQL, PHP), deixo aqui alguns que já usei e que recomento: easyPHP, WAMP, MAMP,XAMPP. Depois de terem o software instalado vamos iniciar:

Em primeiro lugar vamos observar a estrutura de um “select”:

<select>

<option value=”1”>On</option>

<option value=”0”>Off</option>

</select>

clip_image002Como podemos observar, as opções são delimitadas pela tag “select”, e cada uma delas tem um value e um texto, que na maior parte das vezes é igual, no entanto o value é o valor que é enviado e usado na base de dados, não é visível ao utilizador.

No primeiro exercício vamos popular um elemento select usando um array PHP sendo que o value e o texto são iguais:

<?php
$opções=array(‘PPLWARE Blog’,’PPLWARE Forum’,’PPLWARE Videos’);
echo ‘<select>’;
foreach($opções as $opcao)
echo ‘<option value=”‘ . $opcao . ‘”>’ . $opcao . ‘</option>’;
echo ‘</select>’;
?>

Se fosse necessário que o texto e o value fossem diferentes o script seria:

<?php
$opções=array(1=>’PPLWARE Blog’,2=>’PPLWARE Forum’,3=>’PPLWARE Videos’);
echo ‘<select>’;
foreach($opções as $valor=>$texto)
echo ‘<option value=”‘ . $valor . ‘”>’ . $texto . ‘</option>’;
echo ‘</select>’;
?>

clip_image004

Mas aquilo que é mais frequentemente necessário é popular um “select” usando dados da base de dados.

Partindo da seguinte base de dados:

clip_image006

O código seria o seguinte:

<?php
//ligar ao servidor de BD
mysql_connect(‘localhost’,’root’,’root’);

//escolher a base de dados
mysql_select_db(‘pplware’);

//query a executar…a tabela chama-se seccoes
$query=’Select * from secções’;

//execução da query
$resultado=mysql_query($query);
echo ‘<select name=”secção”>’;

//para todas as linhas da tabela
while($linha=mysql_fetch_array($resultado))
{
//escreve o ‘id’ no value e o ‘nome’ no texto.
echo ‘<option value=”‘ . $linha[‘id’] . ‘”>’ . $linha[‘nome’] . ‘</option>’;
}
echo ‘</select>’;
?>

De notar que atribuí um “name” ao select, isto possibilita que após a submissão de um form se possa ir buscar o seu valor.

Ainda no capítulo do select, podíamos ir um pouco mais longe e construir selects que se preenchem à medida que outros são selecionados (por exemplo quando escolhemos os países e de seguida aparecem no select seguinte as cidades desse país ou para o exemplo dos distritos, concelhos), mas para isso teríamos de recorrer ao javascript e isso já fica um pouco fora no âmbito desta rubrica.

Já agora, quem prender as bases de dados dos distritos e concelhos pode fazer download do site dos CTT (ver aqui).

De qualquer forma agradeço opiniões e sugestões? Existem pessoas com interesse em artigos mais fáceis? Gostariam que esta rubrica se alarga

Partilhar:
Tags:

Comentários

32

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Rfas
    Rfas

    Porreiro, ontem fiz o mesmo mas em C#

  2. Avatar de Charly

    espectaculo 😀 … eu ando a criar um jogo, e na secção de registo tive de fazer o mesmo, com a diferença é que nao vai buscar à base de dados mas sim guarda na base de dados, parabens

  3. Avatar de jesus
    jesus

    Deixo a seguinte sugestão:
    Uma análise detalhada em termos de segurança de ligações a bases de dados, nomeadamente se submissão de login’s, e pesquisas, de modo a evitar possiveis quebras de segurança. Não é uma questão fácil de abordar, mas penso que quem se inicia no b-a-bá do php, deve ter sempre, mas sempre, este assunto em mente.
    Agradeço desde já a atenção dispensada e continuação do bom trabalho.
    P.S. – tenho seguido com atenção os seus tutoriais, gato pelo seu trabalho.

    1. Avatar de jesus
      jesus

      não é «gato» é «grato» 🙂

      1. Avatar de nuno
        nuno

        esta abalado pelo resultado de ontem

        1. Avatar de jesus
          jesus

          Nada disso o meu clube ficou isento destas competições internas. 🙂

    2. Avatar de Pedro Peixoto
      Pedro Peixoto

      Muito obrigado, será abordado num artigo próximo…

    3. Avatar de Eduardo Conceição
      Eduardo Conceição

      Apesar de ser verdade o que dizes no que toca a preocupações de segurança, não é fácil para quem tem poucos conhecimentos ter esses cuidados. Até porque, não é só saber fazer mas sim saber o que se está a fazer.

      Quanto à segurança dos login’s, por exemplo, muita gente o que faz é em vez de enviar uma password, enviar um código hash da password (tipicamente MD5 ou SHA-1) que será comparado com o hash que está guardado na base de dados. No entanto, isto não protege de nada a não ser o facto do administrador da base de dados não conseguir ver as passwords pois, o que está lá registado são os hash’s das mesmas.

      Para se autenticarem de maneira segura o ideal é usar um protocolo SSL. Mas lá está, teria que se configurar o servidor apache para aceitar ligações HTTPS, eventualmente o acesso à base de também podia ser feito através de SSL.

      Seria sem dúvida interessante, mas penso que não neste tutorial (ou pelo menos para já).

      1. Avatar de jesus
        jesus

        Ok. Deixo isso à consideração do autor dos tutoriais. sim eu sei que é um tema mais avançado, no entanto (um dia destes) penso que deveria de ser abordado. Obg pelo ponto de vista.

  4. Avatar de BAPT
    BAPT

    Bom artigo, mais um com a qualidade PPLWare.

    No entanto alerto, que o ciclo While ficou na linha do comentário.

    Boa pascoa a todos

    1. Avatar de Pedro Pinto

      Ai o gajo (ciclo), já o puxo para cima 🙂

  5. Avatar de digitalanarchy
    digitalanarchy

    viva,
    parabens pela rubrica,
    tocaste-te num ponto importante, javascipt, era “porreiro” se houvesse “javascript é á quarta” 🙂

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      Obrigado, o Javascript e PHP andam sempre lado a lado, se calhar até seria mais interessante tudo junto na mesma rúbrica! 🙂

  6. Avatar de jedi
    jedi

    muito bem explicado, na altura que estava a a fazer um trabalho em php tive que utilizar para o utilizar fazer uma selecção dinâmica. 😉

  7. Avatar de Luis Leonardo

    Sendo o artigo destinado a quem tem poucos ou nenhuns conhecimentos de programação, a indentação do código devia estar mais cuidada.

    No exemplo dos arrays, o echo do devia estar na linha abaixo e o echo anterior com um avanço à direita.
    Dessa forma a leitura fica muito mais facilitada para quem ainda tem dificuldades em compreender código.

    PS: O reparo não é feito com o sentido destrutivo, mas sim sugestivo 😉

    1. Avatar de Pedro Peixoto

      Boa noite, tem razão. Quando enviei o artigo ao Pedro Pinto desformatou, mas quando li aqui reparei logo e já pedi ao Pedro para rectificar! 🙂 assim que ele ler, tudo deve ser resolvido! 😀 obrigado!

  8. Avatar de Eduardo
    Eduardo

    Bom artigo!

    Só uma dúvida: popular? de populamento?
    Penso que a maneira correcta seria povoar de povoamento.
    Penso ser um erro de tradução de populate/population.

  9. Avatar de tiago_crkj
    tiago_crkj

    boa tarde!!! Necessito de ajuda urgente.

    Estou a fazer um projecto academico e quero ligar o flash(as3) a um ficheiro php, já tentei de diversas maneiras e nada.

    Vou deixar aqui o meu código para me poderem ajudar

    php:

    as3:

    // Assign a variable name for our URLVariables object
    var logform_variables:URLVariables = new URLVariables();

    // Build the varSend variable
    var logform_varSend:URLRequest = new URLRequest(“/php_services.php”);
    logform_varSend.method = URLRequestMethod.POST;
    logform_varSend.data = logform_variables;

    // Build the varLoader variable
    var logform_varLoader:URLLoader = new URLLoader;
    logform_varLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
    logform_varLoader.addEventListener(Event.COMPLETE, completeLoginHandler);

    // Handler for PHP script completion and return
    function completeLoginHandler(event:Event):void{

    status_txt.text =””;

    if (event.target.data.return_msg == “no_good”) {

    status_txt.text = “Errado, Tente outra vez”;

    } else if (event.target.data.return_msg == “all_good”) {

    status_txt.text = “Errado, Tente outra vez”;

    }

    }
    // Add an event listener for the submit button and what function to run
    btnentrar.addEventListener(MouseEvent.CLICK, ValidateAndSend);

    // Validate form fields and send the variables when submit button is clicked
    function ValidateAndSend(event:MouseEvent):void{

    status_txt.text =””;
    //validate form fields
    if(!user_txt.length) {

    status_txt.text = “Digite nome de utilizador.”;

    } else if(!pass_txt.length) {

    status_txt.text = “Digita a plavra-passe.”;

    } else {

    // Ready the variables for sending
    logform_variables.sendRequest = “log_user_in”;
    logform_variables.username = user_txt.text;
    logform_variables.pass = pass_txt.text;
    // Send the data to the php file
    logform_varLoader.load(logform_varSend);

    status_txt.text = “Processando…”;

    } // close else after form validation

    }

    P.S: Eu estou a usar o wamp, servidor offline, será necessário estar num serve online?

    necessito de algum ficheiro ou software especifico para que isto funcione?

    Desde já agradeço à malta que me possa ajudar.
    Thanks

  10. Avatar de Márcio
    Márcio

    Nice! 😛

    E os tutoriais para Visual Basic? Acabaram? :O

  11. Avatar de tiago_crkj
    tiago_crkj

    Esqueci-me disto

    php:

  12. Avatar de tiago_crkj
    tiago_crkj

    // connect to your MySQL database here
    include_once “liga_bd.php”;

    if ( isset($_POST[‘sendRequest’]) == “log_user_in”) {
    $username = $_POST[‘username’];
    $password = $_POST[‘pass’];
    $sql = mysql_query(“INSERT INTO utilizador(NOME_USER,PASSWORD_USER) VALUES (‘$username’,’$password’)”);
    }

  13. Avatar de LF
    LF

    espectacular era explicarem como fazer 2 select option para distritos e concelhos com jquery :p

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      Boa tarde, foi o que expliquei, isso já ficava um pouco fora do âmbito do PHP, mas quem sabe possamos alargar a rúbrica… 🙂

  14. Avatar de Tiago Correia
    Tiago Correia

    Ainda estou no secundário, por isso, como devem imaginar, sou um aprendiz no que toca ao php. Gosto imenso da vossa rubrica e leio todas as semanas a fim de aprender mais um pouco e poder utilizar em projectos futuros (e até alguns actuais propostos por professores).

    Continuem com isso, é sempre bom partilhar conhecimentos.

  15. Avatar de tiago_crkj
    tiago_crkj

    malta obrigado mas já consegui resolver a minha questao

  16. Avatar de Viperz0r
    Viperz0r

    Na minha opinião, acho que no final do artigo deveria remeter para o uso dos Prepared Statements, pela questão da segurança (SQL Injection). Atribuições dentro do while, pode ser um pouco confuso para quem se está a iniciar.

    Keep up

    1. Avatar de Ricardo Elias
      Ricardo Elias

      O uso de ‘Prepared Statements’ (PS) devia ser obrigatorio em qualquer tutorial sobre SQL, seja para PHP, C#, ou qualquer outra linguagem. O melhor servico que estariamos a dar para um “iniciado”, e’ comeca-lo com o pe’ direito. Infelizmente, o que acontece e’ que a “simplicidade” inicial traduz-se muitas vezes em grandes dores de cabeca quando finalmente aprendem que o codigo que escreveram nao so’ tem problemas de SQL Injections mas falhas devido a erros de sintaxe.

      Nunca percebi porque se considera um tutorial sobre SQL como algo para um iniciado ‘a programacao, ou que “Prepared Statements” envolve um grau de complexidade que alguem nao consiga perceber rapidamente.

      Por isso, peco ao Pedro Peixoto, e outros autores, para usarem apenas “P.S.” ou no minimo msqli_real_escape_string(). Ideal seria rever todos os tutorias que usem SQL incorrectamente e corrigi-los, ou substitui-los com versoes correctas…

      PS: Pedro Peixoto, parabens pelo tutorial! A critica nao e’ dirigida directamente a ti, e nao leves a mal.

      Fiquem Bem!

      1. Avatar de Pedro Peixoto
        Pedro Peixoto

        Boas Ricardo, a programação não deve ser uma prática decorada e mecanizada, embora deva obedecer a um conjunto de regras e estrutura. Mas o programador deve ter capacidade para pensar e decidir onde e em que situações deve aplicar determinado método. Não faz sentido alguém fazer uma divisão, sem antes aprender uma subtracção… e saber em que situação deve ou não usar cada uma delas.

        Obrigado, claro que não levo a mal 😉

    2. Avatar de Pedro Peixoto
      Pedro Peixoto

      Obrigado pela sugestão, mas não vejo, nesta situação, em que é que os Prepared Statements vinham melhorar a segurança do sistema uma vez que todo o script é executado no servidor sem qualquer intervenção do utilizador…
      Este artigo não é sobre MySQL, é sobre elementos . De qualquer forma obrigado pelo comentário. 🙂

      Cumprimentos

  17. Avatar de Nuno Ribeiro
    Nuno Ribeiro

    Boas 🙂

    Imagina que tens uma tabela chamada ‘anos’ em que tens valores entre 1900 e 2011. E tens 2 selects, um onde o utilizador escolhe o ano inicial e no outro o ano final. Como é que ponho no 2º select a aparecerem apenas anos superiores ao escolhido no 1º select?

  18. Avatar de Ivan
    Ivan

    Boa noite, tenho uma duvida, tenho uma combobox que é preenchida com valores de uma BD, mas quero guardar o valor selecionado numa nova BD mas nao sei pk nao funciona com o POST.

    Funcionario:

    <?mysql_connect('localhost','root','root');
    mysql_select_db('crescer_especial');
    $query="select * from funcionarios";
    $resultado=mysql_query($query);
    while($linha=mysql_fetch_array($resultado)){
    echo '’ . $linha[‘nome’].”;
    }
    ?>

    $funcionario=$_POST[‘funcionario’];