PHP é à quinta-feira – Sabe popular uma combobox?
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).
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>
Como 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>'; ?>
Mas aquilo que é mais frequentemente necessário é popular um “select” usando dados da base de dados.
Partindo da seguinte base de dados:
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
Este artigo tem mais de um ano
Porreiro, ontem fiz o mesmo mas em C#
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
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.
não é «gato» é «grato» 🙂
esta abalado pelo resultado de ontem
Nada disso o meu clube ficou isento destas competições internas. 🙂
Muito obrigado, será abordado num artigo próximo…
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á).
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.
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
Ai o gajo (ciclo), já o puxo para cima 🙂
viva,
parabens pela rubrica,
tocaste-te num ponto importante, javascipt, era “porreiro” se houvesse “javascript é á quarta” 🙂
Obrigado, o Javascript e PHP andam sempre lado a lado, se calhar até seria mais interessante tudo junto na mesma rúbrica! 🙂
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. 😉
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 😉
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!
😉
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.
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
Nice! 😛
E os tutoriais para Visual Basic? Acabaram? :O
Esqueci-me disto
php:
// 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’)”);
}
espectacular era explicarem como fazer 2 select option para distritos e concelhos com jquery :p
Boa tarde, foi o que expliquei, isso já ficava um pouco fora do âmbito do PHP, mas quem sabe possamos alargar a rúbrica… 🙂
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.
malta obrigado mas já consegui resolver a minha questao
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
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!
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 😉
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
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?
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’];