Para arquivar o log em um arquivo especifico ou um local remoto, existe a funcao error_log(). Saiba mais.ExcecoesUma excecao muda o fluxo da execucao do script quando um erro e levantado. Quando uma excecao e desencadeada, o estado do script e salvo, o programa ira executar o exception handler e depois, dependendo, o handler pode retornar ao ponto salvo do script, ou terminar a execucao, ou retomar o script de um ponto diferente. Saiba mais. Os passos para se manipular uma excecao e:1o: TRY - bloco que contem um codigo que pode desencadear uma excecao. Se a excecao nao for ativada, a execucao do script continuara normalmente, se nao, a excecao sera thrown.2o: THROW - desencadeia uma excecao, e deve ter pelo menos um metodo catch.3o: CATCH - um bloco que tratara a excecao, recebendo as informacoes referentes a excecao.E possivel definir uma funcao para manusear excecoes que nao tem catch, pela funcao set_exception_handler(<funcao>).FormulariosSeguranca: MetodoE importante processar os dados de formularios com seguranca, de forma a proteger os dados de seus usuarios de hackers e spammers. Portanto, saiba quando usar $_GET e $_POST.Informacoes passadas pelo metodo GET e visivel a todos (na URL), e a quantidade de informacao passada por esse metodo e limitada (2000 caracteres). Contudo ele permite que a pagina seja marcada (bookmark).Ja informacoes passadas por POST e inacessivel para outros (valores sao passados incorporados na solicitacao da pagina), e o numero de informacoes passadas e ilimitado. Alem disso, o metodo suporta funcionalidades avancadas que podem aumentar ainda mais a seguranca no envio de dados. Contudo, o metodo nao possibilita a marcacao (bookmark) da pagina. O metodo POST e o mais aconselhavel para o envio de dados por formulario.ValidacaoA pagina sobre validacao de formularios da varias dicas de seguranca, e vale a pena dar uma relida. Citarei apenas os mais comuns ou importantes.A funcao htmlspecialchars() converte caracteres especiais para o formato HTML. Isso ajuda a prevenir que hackers explorem o codigo, injetando codigos (cross-site scripting attacks) a formularios. Portanto, e crucial passar todas as variaveis atraves dessa funcao.Outra coisa importante a se fazer com os dados submetidos e remover espacos em branco desnecessarios (com a funcao trim()) e remover barras invertidas (com a funcao stripslashes()).Erros e Campos obrigatoriosPode-se verificar se um campo do formulario foi enviado vazio com a funcao empty().Para se verificar se o campo possui apenas letras ou algum determinado conjunto de caracteres, pode-se usar a funcao preg_match(), que verifica se uma string (segundo parametro) segue um padrao (passado no primeiro parametro). Ex.: para verificar se um campo contem um e-mail valido (padrao de e-mail): preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email).UploadingE possivel que um usuario carregue um arquivo atraves de um formulario. Neste caso, utiliza-se o atributo enctype na tag form para definir a o "content-type" dos dados submetidos pelo formulario. No caso de arquivos, recomenda-se usar dados binarios, portanto, o valor do atributo seria "multipart/form-data". Ja a entrada para se selecionar o arquivo e o <input type="file">, que ja apresenta um botao "browse" para se selecionar um arquivo do computador ao lado do campo.Para se acessar o arquivo uploaded usa-se a superglobal