Jump to content
mAiN_iNfEcTiOn

[PHP] Upload de Ficheiros

Recommended Posts

mAiN_iNfEcTiOn

Bem, à falta de melhor sítio, cá vai o tutorial que fiz para o PCode:

Vamos então começar pelo HTML

Ora, nós já sabemos que existem 2 métodos (principais, ou mais utilizados embora existam outros menos usados) de envio de informação por parte de forms (<form>) em HTML - o POST e o GET.

Ora o GET usa o endereço (URL) para enviar os dados... o POST usa os headers do protocolo HTTP para enviar os dados.

Dá-se preferência ao segundo método visto que o URL tem um tamanho limitado (salvo erro) a 4 kB enquanto que o POST pode ser usado à vontade, quer para grandes textos quer para ficheiros.

Além disso o método POST é mais discreto, pois passa os dados em segundo-plano sem que o utilizador (comum) dê por isso e acima de tudo, enquanto os URL's são muitas vezes guardados por servidores proxy e de ISP's, os POST's não o são (pelo menos não é tão comum vê-los registar os POST's).

Ora dessa forma, sabendo isto aconselho vivamente o método POST para forms para envio de ficheiros. Será também o tipo de método que vou utilizar nos exemplos.

Além do atributo method existe outro atributo extremamente essencial para que o ficheiro seja enviado correctamente. E esse atributo é o enctype.

O enctype determina o tipo de codificação que os dados do form devem levar antes de serem enviados para o servidor (mais info ver: http://www.w3schools.com/tags/att_form_enctype.asp). Para o envio de ficheiros ser feito correctamente o atributo enctype deve estar definido como multipart/form-data.

Claro, depois temos os objectos que devemos usar no site. Logicamente que para o envio de ficheiros precisamos de um input do tipo file, como poderão ver já de seguida:

<html>
<head>
   <title>Teste de Envio/Upload de Ficheiros</title>
</head>
<body>
   <form name="frmUpload" method="post" enctype="multipart/form-data" action="upload.php">
   <label for="fileObj">Seleccione um ficheiro</label> <input type="file" name="fileUpload" id="fileObj" value="" /> <input type="submit" name="cmdSend" value="Enviar" />
   </form>
</body>
</html>

Ora pronto, aqui temos um form simples de envio de ficheiros... Este form poderia ainda ter outros campos normais de texto ou checkboxes ou qualquer outro tipo de objecto dos forms. Isto foi um exemplo meramente indicativo.

Como podem analisar, ao pressionar o botão Enviar, ele irá enviar os dados para um ficheiro chamado upload.php para processar o envio do ficheiro. Podíamos colocar o processo do upload todo no mesmo script (ou seja o form e o processamento do envio) mas para simplificar, vamos separar as águas, quem quiser junta depois.

Já temos o HTML... Bora para o PHP?

Até agora pouco ou nada de novo têm aprendido, e durante esta parte inicial vão ficar praticamente iguais pois vou passar a explicar os conceitos necessários em PHP para percebermos o código.

Primeiro, sabendo que estamos a usar o enctype="multipart/form-data", ao fazer o POST do form, o protocolo HTTP (que é o protocolo de comunicação usado para processar as páginas e enviar e receber pedidos de HTML e o próprio HTML) vai fazer o upload do ficheiro para uma pasta temporária do servidor, normalmente em contas de alojamento existe uma pasta chamada tmp na raiz da vossa conta. É para lá que eles vão (normalmente).

Segundo, mais uma vez, sabendo que estamos a usar o enctype="multipart/form-data", ao fazer o POST do form para o upload.php o PHP vai fazer o seguinte:

  1. 'Pegar' nos objectos que não são do tipo file e defini-los na variável superglobal $_POST (para quem não sabe o que são variáveis superglobais, ver http://www.nusphere.com/php/php_superglobals.htm)
  2. 'Pegar' nos objectos que são do tipo file e defini-los na variável superglobal $_FILES (para quem não conhece esta variável superglobal, ver http://www.php.net/manual/pt_BR/features.file-upload.post-method.php)

De referir que o servidor apaga os ficheiros da pasta temporária após o final do processamento do script para onde é enviado o POST.

Sabendo isto, vamos agora começar a estipular algumas regras, tais como:

  1. Os ficheiros enviados para o servidor, são para guardar numa pasta específica? Se sim, qual? Se não, então irá ser para lê-lo e efectuar uma operação específica (que não é o nosso caso).
  2. Que tipos de ficheiro vamos aceitar? Só imagens? Ficheiros de texto, ficheiros pdf, documentos do word, executáveis, zips? Todos excepto alguns específicos? Vocês é que sabem.
  3. Os dados do ficheiro são para guardar na base de dados, guardar noutro local ou simplesmente ignorar?
  4. Os ficheiros terão os nomes originais ou ficarão com nomes dados por mim?
  5. Os ficheiros terão alguma restrição além da extensão?

Ora as minhas definições face a estas perguntas, para o nosso exemplo, são:

  1. Os ficheiros serão enviados para uma pasta específica, neste caso uma pasta que está no mesmo directório que o script upload.php e que terá o nome de ficheiros.
  2. De modo a coincidir com alguns pedidos, vou colocar as seguintes extensões: .doc, .zip, .pdf, .txt, .jpg, .png, .odt.
  3. Eu, preferencialmente, uso a base de dados, porque normalmente até preciso de mostrar só um e não vou a andar a procurar na pasta um específico, prefiro ir directo pelos dados guardados na base de dados. Portanto, sim, vamos usar a base de dados.
  4. Podem usar os nomes originais, mas eu não recomendo, pois podem resultar problemas daí tais como substituição de ficheiros e/ou erros de upload porque o ficheiro está a ser usado, etc. Eu prefiro dar-lhes um nome único gerado dinamicamente e registado na base de dados.
  5. Vou restringir o tamanho a um máximo de 2MB. Porque o php.ini pode estar com um valor superior e um documento de texto maior que 2MB para mim, não me faz jeito (podem alterar depois).

Bem, feito isto, resta-me dar-vos uns links para o php.net de algumas funções que vou usar no exemplo e depois.

Links das funções:

Exemplo Prático

/**
  * Só para não esquecerem:
  * SCRIPT:                                     upload.php
  * METHOD:                                   post
  * ENCTYPE:                                  multipart/form-data
  * SUPERGLOBALS:                        $_FILES,$_POST
  * EXTENSOES PERMITIDAS:          .doc,.zip,.pdf,.txt,.jpg,.png,.odt
  * PASTA FINAL:                            ./ficheiros
  * TAMANHO MÁXIMO:                   2MB
  * TAMANHO MÍNIMO:                    >0 MB
**/

define("MAX_SIZE",(2*1024*1024)); # VALOR EM bytes DE 2MB
define("UPLOAD_PATH","./ficheiros/");

# PRIMEIRO CONFIRMAMOS SE FOI POSTADO ALGUMA COISA E SE FOI CARREGADO O BOTÃO ENVIAR
if((count($_POST)>0) && isset($_POST['cmdSend']))
{
   # SEGUNDO VERIFICAMOS SE FOI ENVIADO ALGUM FICHEIRO E SE FOI ATRAVÉS DO NOSSO OBJECTO 'fileUpload' E SE O NOME DO FICHEIRO NÃO É "" (ou seja nenhum)
   if((count($_FILES)>0) && isset($_FILES['fileUpload']) && (trim($_FILES['fileUpload']['name'])!=""))
   {
       # TERCEIRO, INICIALIZO UM ARRAY QUE VAI CONTAR AS EXTENSÕES PERMITIDAS...
       $extensoesPermitidas=array("doc","zip","pdf","txt","jpg","png","odt");

       # CRIO UMA VARIÁVEL PARA TRABALHAR DIRECTAMENTE COM OS DADOS DO UPLOAD DO FICHEIRO
       $ficheiro=$_FILES['fileUpload'];

       # ... DEPOIS OBTENHO AS INFORMAÇÕES DO FICHEIRO ENVIADO...
       $file_info=pathinfo($ficheiro['name']); # ISTO VAI-ME RETORNAR UM ARRAY COM OS DADOS DO FICHEIRO

       # ... E AGORA VALIDO SE A EXTENSÃO É UMA EXTENSÃO VÁLIDA...
       if(in_array($file_info['extension'],$extensoesPermitidas))
       {
           # A EXTENSÃO É VÁLIDA... E O TAMANHO?
           $file_size=filesize($ficheiro['tmp_name']);
           if(($file_size<=MAX_SIZE) && ($file_size>0))
           {
               # QUARTO :: O TAMANHO É O IDEAL... VAMOS FAZER O UPLOAD?
               $filename=uniqid(time()) . "." . $file_info['extension']; # NOME DO FICHEIRO GERADO
               if(move_uploaded_file($ficheiro['tmp_name'],UPLOAD_PATH . $filename))
               {
                   # O UPLOAD FOI FEITO COM SUCESSO, AGORA JÁ PODEMOS GUARDAR NA BASE DE DADOS
                   if(!mysql_connect('localhost','user','password') || !mysql_select_db('basededados'))
                   {
                       # UPS... NAO CONSEGUI LIGAR-ME AO SERVIDOR DA BD OU À BASE DE DADOS...
                       # ENTAO O FICHEIRO NAO PODE FICAR CÁ....
                       unlink(UPLOAD_PATH . $filename);

                       # E DAMOS O ERRO AO USER
                       die("O UPLOAD FALHOU :: CONTACTE O SUPORTE TÉCNICO :: ERRO 1");
                   }
                   else
                   {
                       # ESTÁ TUDO BEM, VAMOS ENTÃO GUARDAR OS DADOS...
                       # VOU GUARDAR NUMA TABELA CHAMADA ficheiros COM OS SEGUINTES CAMPOS:
                       # ID,nome,tamanho,mime,dataregisto,width,height (os 2 ultimos campos sao preenchidos com valores>0 caso seja uma imagem)
                       $tamanhoImg=array(0,0);
                       $extensaoImagens=array("jpg","png");
                       if(in_array($file_info['extension'],$extensaoImagens))
                           $tamanhoImg=getimagesize(UPLOAD_PATH . $filename);

                       mysql_query("INSERT INTO ficheiros (nome,tamanho,mime,dataregisto,width,height) VALUES ('$filename',$file_size,'{$ficheiro['type']}',NOW(),{$tamanhoImg[0]},{$tamanhoImg[1]})");
                       die("UPLOAD FEITO COM SUCESSO");
                   }
               }
               else
                   die("O UPLOAD FALHOU :: CONTACTE O SUPORTE TÉCNICO :: ERRO 2"); # PROVAVELMENTE OU SÃO FALTA DE PERMISSÕES DE ESCRITA NA PASTA ./ficheiros/ OU ALGO SE PASSOU COM O FICHEIRO AO FAZER MOVE_UPLOAD...

           }
           elseif($file_size>MAX_SIZE)
               die("O FICHEIRO É SUPERIOR A 2 MB!");
           else
               die("FICHEIRO INVÁLIDO OU TEM 0 MB");
       }
       else
           die("EXTENSÃO INVÁLIDA. APENAS SÃO SUPORTADAS AS SEGUINTES EXTENSÕES: ." . implode(",.",$extensoesPermitidas));

   }
   else
       die("SELECCIONE UM FICHEIRO");
}
else
   die("USE O NOSSO FORMULÁRIO DE ENVIO DE FICHEIROS");

Ora bem, eu testei minimamente isto, mas estejam à vontade para testar e colocar dúvidas e/ou darem as vossas sugestões para melhorar o código.

[Artigo no Wiki]

Share this post


Link to post
Share on other sites
XsTeAl

de momento nao preciso de fazer nada no genero, mas e um bom tutorial!!

OBS: podiam por um botao tipo FB para pormos "Like" nos posts

Share this post


Link to post
Share on other sites
softklin

Bem, à falta de melhor sítio, cá vai o tutorial que fiz para o PCode:

Podias ter colocado na wiki

http://wiki.portugal-a-programar.pt/

depois era colocar o link num sticky que há por aí. Antigamente havia uma secção de tutoriais, mas grande parte dos  deles está agora a ser movida para a Wiki.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Bom trabalho @mAiN_iNfEcTiOn !!

Eu vou dar umas dicas, ou se não achares que tenho "razão" (não era esta palavra que queria usar, mas não me lembro da correcta lool) diz-me porquê, porque estou realmente curioso da razão de usares algumas coisas.

if((count($_POST)) && ...)

Porque usas os parêntesis adicionais ?

if((count($_POST)>0) && isset($_POST['cmdSend']))

Porque usas a função count() em vez de simplesmente...

if( $_POST )

Sendo que a função count é cerca de 6 vezes mais lenta que o que sugeri?

Se o array $_POST tiver mais que um elemento, isso não significa automaticamente que o utilizador submeteu o formulário clicando no botão submit? Ou há maneiras de nos enganarem nesse aspecto? Se não houverem maneiras de o fazer, penso que essa verificação é desnecessária, se houver e a fizeres por isso, penso que não é uma solução eficaz... Normalmente para ter a certeza que um formulário não foi alterado, crio um array com os campos todos do formulário e depois comparo com as chaves do $_POST...

Essas são as minha observações, mas que gostava imenso que me desses o teu feedback, porque tenho a certeza que me vais surpreender e que as minhas "dicas" afinal são todas inúteis, ahaha ! Já agora, aproveitar para agradecer a tua participação, sendo que sou um auto-didacta e estando sempre a aprender, tenho aprendido bastante contigo ;)

Share this post


Link to post
Share on other sites
asworm

Boas,

Bom trabalho @mAiN_iNfEcTiOn !!

Eu vou dar umas dicas, ou se não achares que tenho "razão" (não era esta palavra que queria usar, mas não me lembro da correcta lool) diz-me porquê, porque estou realmente curioso da razão de usares algumas coisas.

if((count($_POST)) && ...)

Porque usas os parêntesis adicionais ?

if((count($_POST)>0) && isset($_POST['cmdSend']))

Porque usas a função count() em vez de simplesmente...

if( $_POST )

Sendo que a função count é cerca de 6 vezes mais lenta que o que sugeri?

Se o array $_POST tiver mais que um elemento, isso não significa automaticamente que o utilizador submeteu o formulário clicando no botão submit? Ou há maneiras de nos enganarem nesse aspecto? Se não houverem maneiras de o fazer, penso que essa verificação é desnecessária, se houver e a fizeres por isso, penso que não é uma solução eficaz... Normalmente para ter a certeza que um formulário não foi alterado, crio um array com os campos todos do formulário e depois comparo com as chaves do $_POST...

Essas são as minha observações, mas que gostava imenso que me desses o teu feedback, porque tenho a certeza que me vais surpreender e que as minhas "dicas" afinal são todas inúteis, ahaha ! Já agora, aproveitar para agradecer a tua participação, sendo que sou um auto-didacta e estando sempre a aprender, tenho aprendido bastante contigo :)

Por vezes é dificil de visualizar logo há primeira o que é que se está a fazer... eu por mim a minha solução passa sempre pelo isset(), é o que uso sempre... e até que me digam o contrário é o que vou continuar a usar...


Got it?

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Boas,

Bom trabalho @mAiN_iNfEcTiOn !!

Eu vou dar umas dicas, ou se não achares que tenho "razão" (não era esta palavra que queria usar, mas não me lembro da correcta lool) diz-me porquê, porque estou realmente curioso da razão de usares algumas coisas.

if((count($_POST)) && ...)

Porque usas os parêntesis adicionais ?

Ora bem, os parêntesis adicionais são vício de separação de dados :D , mas eu não faço

if( (count($_POST)) && ...)

Mas sim...

if( (count($_POST)>0) && ...)

.. senão ficaria melhor fora dos ()'s claro

No entanto, dependendo do que estás a fazer dentro do if, é sempre preciso ter atenção às precedências (daí o meu exagero nos ()'s ser uma maneira de salvo-conduto)

if((count($_POST)>0) && isset($_POST['cmdSend']))

Porque usas a função count() em vez de simplesmente...

if( $_POST )

Sendo que a função count é cerca de 6 vezes mais lenta que o que sugeri?

Quanto a isto, não tenho maneira de contrapor... De facto a tua maneira é a melhor, faz uma comparação lógica :)

Se o array $_POST tiver mais que um elemento, isso não significa automaticamente que o utilizador submeteu o formulário clicando no botão submit? Ou há maneiras de nos enganarem nesse aspecto? Se não houverem maneiras de o fazer, penso que essa verificação é desnecessária, se houver e a fizeres por isso, penso que não é uma solução eficaz... Normalmente para ter a certeza que um formulário não foi alterado, crio um array com os campos todos do formulário e depois comparo com as chaves do $_POST...

Ora bem a validação do $_POST, como disse acima, é melhor da tua maneira. No entanto, e embora o isset($_POST['cmdSend']) não tenha nenhuma função de validação e garantia de que o form não foi adulterado, a verdade é que num formulário podes ter 2 botões submit, ex: "Adicionar Imagem" e "Gravar na base de dados".

Como é lógico, o "Adicionar Imagem" não vai gravar na base de dados (que é o processo final) apenas vai fazer o upload de uma imagem...

... já o "Gravar na base de dados" grava os dados no final....

Neste caso não acontece isso, mas posso desde já admitir que este código tem algum tempo e alguma da experiência que tenho, na altura não tinha :P

Claro que a tua maneira é interessante de validar se o form foi adulterado... Embora não te previna que eu gere um script e, usando um formulário exactamente igual possa enviar dados para o teu script de processamento infinitamente, por ex: num formulário de login.

Eu actualmente, e por usar frameworks e analisá-las aprendi - e continuo a aprender - que para prevenir envio de dados por via externa, uso uma validação de CSRF:

Chamemos este script de form.php

<?php
session_start();
define("SALT_KEY","1234**1234**@");

if( $_POST ) # Já a aplicar a técnica 
{
    # Validar a token...
    if( !isset($_POST['csrf_token']) || ( $_POST['csrf_token']!=$_SESSION['csrf_token'] ) )
    {
        header('location: form.php');
        exit();
    }

    # Já foi validado, não é mais preciso...
    unset($_SESSION['csrf_token']);
    /*
        Aqui prossigo o processamento dos dados...
    */
}

$_SESSION['csrf_token'] = sha1(uniqid() . SALT_KEY); # Gerar um ID único...

?>
<form method="post" action="">
    <input type="hidden" value="<?php echo $_SESSION['csrf_token'];?>" name="csrf_token" />
    <label for="username">USERNAME:</label> <input type="text" name="username" id="username" value="" /><br/>
    <label for="password">PASSWORD:</label> <input type="password" name="password" id="password" value="" /><br/><br/>
    <input type="submit" value="Log-In" name="login" />
</form>

Essas são as minha observações, mas que gostava imenso que me desses o teu feedback, porque tenho a certeza que me vais surpreender e que as minhas "dicas" afinal são todas inúteis, ahaha ! Já agora, aproveitar para agradecer a tua participação, sendo que sou um auto-didacta e estando sempre a aprender, tenho aprendido bastante contigo ;)

;) É sempre bom saber que a nossa opinião importa... No entanto discordo, na sua essência tens razão e as tuas dicas fazem todo o sentido, apenas num ou noutro ponto temos métodos diferentes mas não estamos errados.

Obrigado pela atenção e mesmo eu, quando auxilio também testo coisas e aprendo :) Numa comunidade, os "problemas" dos outros também são os nossos :) Tal como se eu tiver dúvidas, também virei aqui recorrer ;)

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

@mAiN_iNfEcTiOn

Já está na Wiki? ;)

Vou tratar disso agora mesmo :);)

Share this post


Link to post
Share on other sites
softklin

eu por mim a minha solução passa sempre pelo isset(), é o que uso sempre...

Também existe o empty(). A diferença entre os dois é que o isset verifica se a variável está definida, e o empty verifica isso, e ainda se a variável vem a um valor "vazio" (string vazia, array vazio, NULL, etc). Nalguns casos, pode tornar-se vantajoso fazeres a verificação que para além de teres a variável definida, ainda tens a garantia que ela também contém um valor.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Também existe o empty(). A diferença entre os dois é que o isset verifica se a variável está definida, e o empty verifica isso, e ainda se a variável vem a um valor "vazio" (string vazia, array vazio, NULL, etc). Nalguns casos, pode tornar-se vantajoso fazeres a verificação que para além de teres a variável definida, ainda tens a garantia que ela também contém um valor.

True... mas em casos (por exemplo) de select's em que tens:

<select name="teste">
    <option value="-1">Escolha uma opção</option>
    <option value="0">Inactivo</option>
    <option value="1">Activo</option>
</select>

Se fizeres POST disto, seleccionando "Inactivo" e validares com empty dá TRUE, ou seja o 0 é considerado empty também :)

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Queria deixar aqui um obrigado ao @Lfscoutinho pela contribuição dele - com as suas dicas - que ajudaram a efectuar algumas alterações ao tutorial original.

E cá vai: Obrigado ;):)

Share this post


Link to post
Share on other sites
softklin

True... mas em casos (por exemplo) de select's em que tens:

<select name="teste">
    <option value="-1">Escolha uma opção</option>
    <option value="0">Inactivo</option>
    <option value="1">Activo</option>
</select>

Se fizeres POST disto, seleccionando "Inactivo" e validares com empty dá TRUE, ou seja o 0 é considerado empty também :)

Tens razão, aliás, isso até está no manual. Nesse caso não ajudava, teria de se colocar um valor diferente de 0. Eu sugeri a função empty em resposta ao asworm, e porque gosto de fazer comparações pelo valor que quero obter (hábitos do C).

Cumps.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
asworm

Também existe o empty(). A diferença entre os dois é que o isset verifica se a variável está definida, e o empty verifica isso, e ainda se a variável vem a um valor "vazio" (string vazia, array vazio, NULL, etc). Nalguns casos, pode tornar-se vantajoso fazeres a verificação que para além de teres a variável definida, ainda tens a garantia que ela também contém um valor.

Desconhecia essa função...


Got it?

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Por vezes é dificil de visualizar logo há primeira o que é que se está a fazer... eu por mim a minha solução passa sempre pelo isset(), é o que uso sempre... e até que me digam o contrário é o que vou continuar a usar...

Referes-te ao isset( $_POST['botao'] ) !?

Se é isso eu vou explicar a minha sugestão... A estrutura de controle if requer sempre argumentos do tipo boolen (true/false), então se fizeres simplesmente if( $_POST ) ele vai converter o array $_POST para boolean. Não esquecer que quando um array é convertido para boolean, resulta em TRUE se tiver elementos e em FALSE se for um array vazio, ou seja, sem elementos.

@mAiN_iNfEcTiOn Quando ao parêntesis foi o que me pareceu, eu por acaso só os utilizo quando é mesmo necessário, tento sempre evitar usá-los, mas isso são as "manias" e hábitos de cada um...

Quanto à função count(), esqueci-me de referir que em vez de se usar count( $array ) > 0, chegava count( $array )...

Relativamente ao token, sinceramente não percebi qual é a sua utilidade em relação a se proteger de um formulário ser alterado, porque um formulário pode ser alterado directamente no browser, por exemplo utilizando o Firebug, pode-se fácil e rapidamente acrescentar/eliminar campos. Ou seja, o que percebi é que isso é usado por exemplo para evitar que alguém use o formulário através de outro site ou simplesmente faça download da página e depois tente submeter o formulário localmente, alterado ou não.

Como tal, penso que o que eu já sugeri anteriormente juntamente com essa tua sugestão, dá uma agradável protecção ;)

Por último, não tens que agradecer, eu estou aqui para aprender e ajudar - tal como todos, penso eu -  :)

Share this post


Link to post
Share on other sites
brunoais

True... mas em casos (por exemplo) de select's em que tens:

<select name="teste">
    <option value="-1">Escolha uma opção</option>
    <option value="0">Inactivo</option>
    <option value="1">Activo</option>
</select>

Se fizeres POST disto, seleccionando "Inactivo" e validares com empty dá TRUE, ou seja o 0 é considerado empty também :)

Boas,

Referes-te ao isset( $_POST['botao'] ) !?

Se é isso eu vou explicar a minha sugestão... A estrutura de controle if requer sempre argumentos do tipo boolen (true/false), então se fizeres simplesmente if( $_POST ) ele vai converter o array $_POST para boolean. Não esquecer que quando um array é convertido para boolean, resulta em TRUE se tiver elementos e em FALSE se for um array vazio, ou seja, sem elementos.

Eu n encontrei info sobre se o $_POST está definido quando method é GET. Por isso, acho melhor usar o isset para isso.

Para isso tem-se:

<select name="teste">
    <option value="0" selected disabled>Escolha uma opção</option>
    <option value="1">Inactivo</option>
    <option value="2">Activo</option>
</select>

Acho q segue a especificação. Ele valida. Assim já se consegue usar o empty ;)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

se fizeres simplesmente if( $_POST ) ele vai converter o array $_POST para boolean

Errado. Ele vai testar a condição lógica "$_POST != FALSE" ... Se na linha anterior a esse if eu fizesse $_POST = "0"; ele não entrava no if (porque FALSE == 0, mas FALSE !== 0) :)

Resumidamente, ele  não é um valor booleano. É uma verificação se tem valor não nulos ;).

Eu n encontrei info sobre se o $_POST está definido quando method é GET. Por isso, acho melhor usar o isset para isso.

Sim, o $_POST é sempre inicializado. No entanto, o $_POST em método GET é inicializado como array().

(Facilmente verificável com um var_dump()).

Aliás, até mesmo sem ser efectuado um POST ou GET ;).

Para isso tem-se:

<select name="teste">
    <option value="0" selected disabled>Escolha uma opção</option>
    <option value="1">Inactivo</option>
    <option value="2">Activo</option>
</select>

Acho q segue a especificação. Ele valida. Assim já se consegue usar o empty ;)

Por fim, sim, é uma solução... mas e para valores obtidos da base de dados cujo valor da option possa ser o 0 ? Não me parece uma solução viável =/. Para estes casos o isset() é a função ideal. ;-)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.