Select com array passado como parâmetro (PHP/MySQL)

Olá a todos, mostrarei para vocês como é fácil efetuar um select em uma tabela, passando como parâmetro um array de dados. Eu mesmo em certo momento, em um projeto recente precisei fazer isto, criei um arquivo que recebia via GET um parâmetro que poderia conter vários dados, algo do tipo:

album_view.php?album=5;9;10;13

Como  podem ver, a variável album recebe vários valores separados por ;(ponto e vírgula). Este é só um exemplo, os valores passados poderiam ser os IDS álbuns de uma galeria de fotos. Seria necessário colocar estes valores em um array e fazer o select no banco de dados. 
Agora a pergunta que não quer se calar: Como fazer um select passando um array como parâmetro?
Muito simples, vejam


<?php
#recebe os valores passados via GET
$ab = $_GET['album'];

#Retiramos os ponto e vírgula usando "explode" que retornará um array
$rr = explode(';',$ab);
#Agora temos um array contendo os valores que foram passados

#Usando o comando "foreach" vamos concatenar os dados de cada posição deste array
#afim de criarmos a condição que será passada para o comando SQL
#Variável que guardará a condição
$cond = null;
foreach($rr as $ids){
$cond. = $ids.',';//colocamos um vírgula após cada posição lida
}

#Pegamos o tamanho da variável "$cond"
$size = strlen($cond);

#Retiramos a vírgula que ficou no final da string e teremos a condição completa
$condicao = substr($cond,0,$size-1);


#A partir de agora nós conectaremos ao banco de dados, não vou colocar o código


#O segredo está na cláusula "IN" do SQL

#A query ficaria assim:
$sql=mysql_query("select * from tb_album where id_album in($condicao) order by id_album");
#Traduzindo: selecione tudo da tabela tb_album se id_album estiver na($condição) ordenado pelo id_album 

#O resto do código é com você
?>

Coloquei somente algumas partes do código, é claro que você deverá conectar ao banco de dados, etc,etc...
Só para frisar, o segredo está no modo como você criará a condição e depois utilizar-se da cláusula "IN"  para retornar o que foi passado.

Espero que tenham entendido, caso tiver algum erro favor comentar. 

5 comentários:

  1. Muito bom.. eu gostei bastante..
    seria possível fazer isso no select? no lugar do "*"?
    obrigado

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Muito bom. Eu não conhecia a clausula IN. Isso ajuda bastante.

    ResponderExcluir
  4. Olá,
    Estou desenvolvendo um projeto de uma rede de blogs voltados ao desenvolvimento web, e gostaria de saber se você gostaria de participar. Caso sim, por favor responder ao e-mail natanajunges@gmail.com Site: rededevweb.blogspot.com.br
    Atenciosamente, Natan Junges.

    ResponderExcluir
  5. Muito bom amigo, me polpou um tempao em um filtro. Eu iria usar dois foreach e depois excluir o que nao estava no filtro.

    ResponderExcluir