├── LICENSE
├── README.md
└── v0.1
├── 00-introducao
├── 00-introducao.md
└── img
│ └── image1.jpg
├── 01-capitulo_1
├── 01-capitulo_1.md
└── img
│ ├── image2.jpg
│ ├── image3.jpg
│ └── image4.jpg
├── 02-capitulo_2
└── 02-capitulo_2.md
├── 03-capitulo_3
└── 03-capitulo_3.md
├── 04-capitulo_4
└── 04-capitulo_4.md
├── 05-capitulo_5
└── 05-capitulo_5.md
├── 06-capitulo_6
└── 06-capitulo_6.md
├── 07-capitulo_7
└── 07-capitulo_7.md
├── 08-capitulo_8
└── 08-capitulo_8.md
├── 09-capitulo_9
└── 09-capitulo_9.md
├── 10-capitulo_10
└── 10-capitulo_10.md
└── 11-capitulo_11
├── 11-capitulo_11.md
└── img
├── image10.jpg
├── image11.jpg
├── image12.jpg
├── image13.jpg
├── image14.jpg
├── image15.jpg
├── image16.jpg
├── image17.jpg
├── image18.jpg
├── image19.jpg
├── image20.jpg
├── image5.jpg
├── image6.jpg
├── image7.jpg
├── image8.jpg
└── image9.jpg
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 PHProgramando
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PHProgramando
2 |
3 | ### Livro-curso PHProgramando - PHP do Básico ao Avançado.
4 |
5 | Feito de dev para dev, e inspirado na comunidade PHP, este livro nasce com a proposta de criar um material para o aprendizado de PHP desde o básico ao avançado. Iniciamos este probjeto com um repositório de código aberto, na esperança de que cada vez mais desenvolvedores contribuam para o material, de forma a melhorarmos cada vez mais este conteúdo.
6 |
7 | Inicialmente construído a partir da apostila _PHP Básico do Jeito Certo_ do nosso amigo [Marcelo Menezes](https://menezes-portfolio.com), a.k.a [Calcio](https://github.com/Calcio), o conteúdo deste livro pretende ir além do PHP, apresentando ao leitor o conhecimento necessário a um profissional de Desenvolvimento Web. Abordaremos PHP,
8 | HTML, CSS e JavaScript, do ponto de vista de diversos profissionais da área.
9 |
10 |
11 |
--------------------------------------------------------------------------------
/v0.1/00-introducao/00-introducao.md:
--------------------------------------------------------------------------------
1 | Curso PHP Básico
2 | ================
3 |
4 | Aprenda do jeito certo
5 | ----------------------
6 |
7 | 
8 |
9 | Bem-vindo ao curso PHP Básico do Jeito Certo. Nessa apostila você não
10 | aprenderá somente o PHP, as sintaxes dos *if*, *while*, *for* etc. A
11 | proposta desse curso vai muito além da programação. Nosso objetivo é
12 | capacitar o novo profissional de PHP com as recentes atualizações do
13 | PHP, padronizações de codificação, utilização de alguns recursos
14 | externos ao PHP como: HTML 5, CSS 3, framework de CSS 3 Twitter
15 | bootstrap e o framework de JavaScrpt jQuery.
16 |
17 | Agradecimentos
18 | --------------
19 |
20 | Agradecimento especial a minha esposa Keylla Cristhiane de Almeida Corrêa por me ajudar a corrigir a apostila e agradecimentos aos meus colegas desenvolvedores Vitor e Raphael que me ajudaram com a correção e verificação técnica do conteúdo da apostila.
21 |
--------------------------------------------------------------------------------
/v0.1/00-introducao/img/image1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PHProgramando/phprogramando/d414cf4bb1db61deb272ee3f406d6512cf59764a/v0.1/00-introducao/img/image1.jpg
--------------------------------------------------------------------------------
/v0.1/01-capitulo_1/01-capitulo_1.md:
--------------------------------------------------------------------------------
1 |
2 | Capítulo 1
3 | ==========
4 |
5 | O que é o PHP?
6 | --------------
7 |
8 | Essa linguagem foi concebida durante o outono de 1994 por Rasmus
9 | Lerdorf. As primeiras versões não foram disponibilizadas, tendo sido
10 | utilizadas em sua home-page apenas para que ele pudesse ter informações
11 | sobre as visitas que estavam sendo feitas. A primeira versão utilizada
12 | por outras pessoas foi disponibilizada em 1995, e ficou conhecida como
13 | “Personal Home Page Tools” (ferramentas para página pessoal). Era
14 | composta por um sistema bastante simples que interpretava algumas macros
15 | e alguns utilitários que rodavam “por trás” das home-pages: um livro de
16 | visitas, um contador e algumas outras coisas.
17 |
18 | Diferentemente de algumas linguagens para web, o PHP permite criar sites
19 | web dinâmicos, possibilitando uma interação do usuário com o site,
20 | através de formulários feitos em HTML, parâmetros da URL, links e também
21 | serve para criar aplicações embarcadas, aplicações mobile, de linha de
22 | comando. A diferença entre ela com relação ao JavaScript padrão, por
23 | exemplo, é que o código PHP é executado no servidor, sendo enviado para
24 | o cliente apenas HTML puro e o próprio código JavaScript. Hoje em dia
25 | existe NodeJS rodando JavaScript no servidor. Desta maneira é possível
26 | interagir com bancos de dados e aplicações existentes no servidor, com a
27 | vantagem de não expor o código fonte para o cliente. Outra diferença do
28 | PHP com um script CGI escrito em C ou Perl é que o código PHP fica
29 | embutido no próprio HTML, enquanto no outro caso é necessário que o
30 | script CGI gere todo o código HTML, ou leia de um outro arquivo.
31 |
32 | Com o PHP podemos fazer tudo, qualquer coisa feita por algum programa
33 | CGI pode ser feita com PHP, como coletar dados de um formulário, gerar
34 | páginas dinamicamente ou enviar e receber cookies. O PHP também tem como
35 | uma das características mais importantes o suporte a um grande número de
36 | bancos de dados, como dBase, Interbase, Firebird, mSQL, mySQL, Oracle,
37 | Sybase, PostgreSQL e vários outros. Construir uma página baseada em um
38 | banco de dados torna-se uma tarefa extremamente simples com PHP. Além
39 | disso, PHP tem suporte a protocolos como IMAP, SNMP, NNTP, POP3 e,
40 | logicamente, HTTP. Também é possível abrir sockets e interagir com
41 | outros protocolos.
42 |
43 | Como funciona o PHP
44 | -------------------
45 |
46 | 
47 |
48 | Requisitos do Sistema Operacional
49 | ---------------------------------
50 |
51 | - **SO:** Linux, Solaris, MAC OS
52 |
53 | - **Servidores web:** Apache 2, Nginx e o Próprio PHP. Pacotes como
54 | LAMP, XAMP e alguns outros também podem ser utilizados.
55 |
56 | - **Banco de Dados:** mSQL, SQL Server, MySql/MariaDB, Sybase, Oracle,
57 | PostgreSQL
58 |
59 | **Nota:** Pode-se usar o comando php -S 0.0.0.0:8001 -t caminho/do/site
60 |
61 | Instalação e configuração do PHP
62 | --------------------------------
63 |
64 | Para instalar o PHP é necessário o PHP, Apache, MySQL e phpMyAdmin. Abra
65 | o terminal (CTRL+T) e rode os comandos abaixo para instalar os pacotes.
66 |
67 | **Apache:** \~\$ sudo apt-get install apache2
68 |
69 | **MySQL:** \~\$ sudo apt-get install mysql-server e sudo apt-get install
70 | php5-mysqlnd
71 |
72 | **PHP:** \~\$ sudo apt-get install php5 php5-curl php5-mcrypt php5-mysql
73 | libapache2-mod-php5
74 |
75 | **phpMyAdmin:** \~\$ Apache: sudo apt-get install phpMyAdmin
76 |
77 | ### Testando o Apache
78 |
79 | Abra o browser e digite [http://localhost](http://localhost/).
80 |
81 | 
82 |
83 | ### Configurando o Apache
84 |
85 | Para podermos criar nossos projetos de uma forma mais fácil e sem
86 | precisar virar root no sistema, vamos cria um diretório em
87 | */home/seu\_usuario/www.* Todos os seus sites e projetos devem ser
88 | colocados nesse diretório. Finalizando nosso processo, precisamos
89 | modificar o arquivo de configuração do apache apontando para o novo
90 | diretório criado. Abra um terminal (CRTL+T) e rode comando.
91 |
92 | \~\$ sudo gedit /etc/apache2/sites-available/000-default.conf
93 |
94 | Procure por *DocumentRoot /var/www/html* e comente a linha colocando o
95 | sinal tralha na frente da linha. Adicione *DocumentRoot
96 | /home/seu\_usuario/www/*
97 |
98 | ### Testando o PHP
99 |
100 | Crie um arquivo chamado *info.php.*
101 |
102 | ```
103 | *, para exibir conteúdo na tela utilizar = \$variavel;
165 | ?>.
166 |
167 | **ATENÇÃO:** Em códigos legados e/ou em código cujo a versão do PHP seja
168 | inferior a 5.4.x ou que não seguem as recomendações de padronização é
169 | comum encontrar a sintaxe sendo usada da seguinte forma:
170 |
171 | ---------------------------------------------------------------------------
172 | comandos ?> Não recomendado
173 | --------------------------------- -----------------------------------------
174 |
177 |
178 | <% comandos %> Não recomendado
179 |
180 | Ainda utilizado, mas não é recomendado.
181 | ---------------------------------------------------------------------------
182 |
183 | É altamente recomendado o não fechamento da tag PHP e deixar uma linha
184 | em branco no fim do arquivo sem espaços[^1]
185 |
186 | ### Finalização de comando
187 |
188 | Entre cada instrução em PHP é preciso utilizar o ponto e vírgula, assim
189 | como em Pascal, C, Perl e outras linguagens mais conhecidas.
190 |
191 | ### Variáveis
192 |
193 | Toda variável em PHP tem seu nome composto pelo caracter \$ e o nome da
194 | variável, que deve iniciar sempre por uma letra ou o caracter “\_”. PHP
195 | é case sensitive, ou seja, as variáveis *\$quantidade* e *\$Quantidade*
196 | são diferentes. Por isso é preciso ter muito cuidado ao definir os nomes
197 | das variáveis. É bom evitar os nomes em maiúsculas, pois como veremos
198 | mais adiante, o PHP já possui alguma variável pré-definidas cujos nomes
199 | são formados por letras maiúsculas.
200 |
201 | Não há um padrão para nomes de variáveis podemos criar algo como
202 | \$teste\_valor ou \$testeValor desde que a aplicação inteira use o mesmo
203 | padrão. Particurlamente em caso de nome composto eué recomendado o
204 | padrão camelCase. *\$matriculaUsuario*, *\$valorTotal*, etc, pois esse é
205 | o padrão adotado nos argumentos de funções e métodos de classes.
206 |
207 | ### Tipos de variáveis
208 |
209 | - Inteiro
210 | - Array
211 | - Objeto
212 | - String
213 | - Ponto flutuante
214 | - Boolean
215 |
216 | ### Constantes
217 |
218 | Constantes são um tipo especial para armazenar valores fixos, diferentes
219 | de variáveis que podem ter seus valores alterados ao decorrer do script.
220 | No PHP uma constante é definida com caracteres em maiúsculo.
221 |
222 | *define('FILE\_READ\_MODE', 0644);*
223 |
224 | Primeiros passos com PHP
225 | ------------------------
226 |
227 | Crie um diretório chamado */home/seu\_usuario/www/cap1*.
228 | ```
229 |
230 |
231 |
232 |
233 | Curso PHP Básico do Jeito Certo
234 |
235 |
236 | = "Bem-vindo ao PHP"; ?>
237 |
238 |
239 | ```
240 | Salve em */home/seu\_usuario/www/PHPBasico/Cap1/exemplo1.php*, no
241 | browser digite
242 | [*http://localhost/*](http://localhost/PHPBasico/Cap1/exemplo1.php)[*PHPBasico*](http://localhost/PHPBasico/Cap1/exemplo1.php)[*/*](http://localhost/PHPBasico/Cap1/exemplo1.php)[*Cap1*](http://localhost/PHPBasico/Cap1/exemplo1.php)[*/*](http://localhost/PHPBasico/Cap1/exemplo1.php)[*exemplo1*](http://localhost/PHPBasico/Cap1/exemplo1.php)[*.php*](http://localhost/PHPBasico/Cap1/exemplo1.php).
243 |
244 | Vimos agora um exemplo prático de um script PHP rodando no navegador com
245 | TAGs HTML 5. Iremos agora modificar o arquivo criado acima e implementar
246 | os conceitos aprendidos nos tópicos já aprendidos.
247 |
248 | **Nota:** Nos arquivos PHP que forem usados para exibição do HTML como
249 | no exemplo acima é recomendado o uso da tag, `<`?= ?`>` ao invés da
250 | tag `<`?php echo ?`>`;
251 |
252 | ```
253 |
254 |
255 |
256 |
257 | Curso Básico - PHP do Jeito Certo
258 |
259 |
260 |
261 | = '
Bem-vindo ao PHP
';
262 | echo '
Variáveis e Constantes
';
263 | //Isso é um comentário de uma linha
264 |
265 | //vamos estudar agora as variáveis
266 | $nome = 'Anna Clara'; //Variável tipo string
267 |
268 | $sobrenome = 'Da Fonseca'; //Variável tipo string
269 |
270 | $idade = 33; //Variável tipo integer
271 |
272 | $altura = 1.69; //Variável tipo float
273 |
274 | $genteFina = true; //Variável tipo boolean
275 |
276 | \* Comentário em bloco muito usado para grandes descrições
277 | * Exibindo o resultado no navegador
278 | */
279 |
280 | echo $nome . ' ';
281 | echo $sobrenome . ' ';
282 | echo $idade . " ";
283 | echo $altura . ' ';
284 | echo $genteFina . '
'; //Esse 1 representa um true (verdadeiro)
285 |
286 | //Agrupando as variáveis em um texto
287 | echo 'Olá meu nome é ' . $nome . ' ' . $sobrenome . '. ';
288 |
289 | echo 'Tenho ' . $idade . ' anos e minha altura é ' . $altura . 'm ';
290 |
291 | //Constantes
292 | define('SO', 'GNU/Linux Ubuntu'); //definindo uma constante
293 | define('FERRAMENTAS_ESCRITORIO', 'LibreOffice');
294 |
295 | echo 'Eu uso ' . SO . ' com ' . FERRAMENTAS_ESCRITORIO;
296 |
297 | ' O Valor de PI é: ' . M_PI //Constante Interna do PHP
298 |
299 | ?>
300 |
301 |
302 | ```
303 |
304 | Salve o arquivo e atualize o browser para ver o resultado.
305 |
306 | Dando continuidade à sintaxe básica do PHP, veremos agora como trabalhar
307 | com os arrays. Eles são de suma importância para os desenvolvedores de
308 | qualquer linguagem. Com ele podemos agrupar várias informações em uma
309 | única variável. Também muito útil para agrupar valores de um mesmo
310 | contexto.
311 |
312 | ```
313 |
314 |
315 |
316 |
317 | Curso Básico - PHP do Jeito Certo
318 |
319 |
320 |
321 | Exemplo 2
323 |
324 |
';
493 |
494 | //exibindo individualmente o produto farinha
495 | echo 'Hoje eu comprei ' . $compras['semana2']['item3']['produto'];
496 | ?>
497 |
498 |
499 | ```
500 |
501 | Salve em */home/seu\_usuario/www/PHPBasico/Cap1/exemplo4.php*, no
502 | browser digite
503 | [*http://localhost/*](http://localhost/PHPBasico/Cap1/exemplo4.php)[*PHPBasico*](http://localhost/PHPBasico/Cap1/exemplo4.php)[*/*](http://localhost/PHPBasico/Cap1/exemplo4.php)[*Cap1*](http://localhost/PHPBasico/Cap1/exemplo4.php)[*/exemplo*](http://localhost/PHPBasico/Cap1/exemplo4.php)[*4*](http://localhost/PHPBasico/Cap1/exemplo4.php)[*.php*](http://localhost/PHPBasico/Cap1/exemplo4.php).
504 |
505 | **Nota:** Esse último exemplo mostra como os arrays estão sendo
506 | utilizados principalmente nas versões mais novas do PHP e também é um
507 | tipo de notação que vem sendo adotadas em frameworks.
508 |
509 | Referências
510 | -----------
511 |
512 | Arrays em php é um assunto muito vasto, existem muitas funções internas
513 | do php só para tratamento de arrays. Conheça essas funções do php em:
514 | **http://php.net/manual/pt\_BR/book.array.php**
515 |
516 | Resumo do capítulo
517 | ------------------
518 |
519 | Nesse capítulo aprendemos o básico do básico no PHP. Como criar e
520 | manipular variáveis do tipo string, boolean, integer e arrays, criar e
521 | usar constantes, comentários simples e em blocos, concatenamos o texto
522 | com variáveis com o operador '.' (ponto).
523 |
524 | Exercícios
525 | ----------
526 |
527 | 1. Crie um array simples contendo 7 animais selvagem e exiba na tela
528 | cada item com seu respectivo índice;
529 |
530 | 2. Crie um array simples contendo 5 animais domésticos e exiba na tela
531 | cada item com seu respectivo índice;
532 |
533 | 3. Crie uma matriz chamado animais dividindo em animais domésticos e
534 | selvagens, para facilitar pode atribuir os dois arrays simples
535 | criados nos itens anteriores. Exiba na tela um texto contendo, “meu
536 | animal selvagem favorito é: ” e “meu animal doméstico favorito é: ”
537 | e escolha um de sua preferência.
538 |
--------------------------------------------------------------------------------
/v0.1/01-capitulo_1/img/image2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PHProgramando/phprogramando/d414cf4bb1db61deb272ee3f406d6512cf59764a/v0.1/01-capitulo_1/img/image2.jpg
--------------------------------------------------------------------------------
/v0.1/01-capitulo_1/img/image3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PHProgramando/phprogramando/d414cf4bb1db61deb272ee3f406d6512cf59764a/v0.1/01-capitulo_1/img/image3.jpg
--------------------------------------------------------------------------------
/v0.1/01-capitulo_1/img/image4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PHProgramando/phprogramando/d414cf4bb1db61deb272ee3f406d6512cf59764a/v0.1/01-capitulo_1/img/image4.jpg
--------------------------------------------------------------------------------
/v0.1/02-capitulo_2/02-capitulo_2.md:
--------------------------------------------------------------------------------
1 |
2 | Capítulo 2
3 | ==========
4 |
5 | Nesse capítulo aprenderemos sobre os operadores suportados pelo PHP.
6 | Quais seus tipos precedências e seus tipos.
7 |
8 | Operadores
9 | ----------
10 |
11 | Um operador é utilizado para realizar operações entre um ou mais valores
12 | (ou expressões, no jargão de programação) e retornar apenas um valor
13 | final. Vamos agora aos operadores.
14 |
15 | ### Aritméticos
16 |
17 | Só podem ser utilizados quando os operandos são números (integer ou
18 | float). Se forem de outro tipo, terão seus valores convertidos antes da
19 | realização da operação.
20 |
21 | - \+ Adição
22 | - \- Subtração
23 | - \* Multiplicação
24 | - \/ Divisão
25 | - \% Módulo (resto da divisão)
26 |
27 | ### De strings
28 |
29 | Só há um operador exclusivo para strings (ponto):
30 |
31 | - \. Concatenação
32 |
33 | ### De atribuição
34 |
35 | Existe um operador básico de atribuição e diversos derivados. Sempre
36 | retornam o valor atribuído. No caso dos operadores derivados de
37 | atribuição, a operação é feita entre os dois operandos, sendo atribuído
38 | o resultado para o primeiro. A atribuição é sempre por valor, e não por
39 | referência.
40 |
41 | - \= Atribuição simples
42 | - \+= Atribuição com adição
43 | - \-= Atribuição com subtração
44 | - \*= Atribuição com multiplicação
45 | - \/= Atribuição com divisão
46 | - \%= Atribuição com módulo
47 | - \.= Atribuição com concatenação
48 |
49 | ###
50 |
51 | ### Bit a bit
52 |
53 | Comparam dois números bit a bit.
54 |
55 | - \& “e” lógico
56 | - \| “ou” lógico (pipe)
57 | - \^ “ou” exclusivo
58 | - \~ Não (inversão)
59 | - << shift left
60 | - >> shift right
61 |
62 | ### Lógico
63 |
64 | Utilizados para inteiros representando valores booleanos.
65 |
66 | - and “e” lógico
67 | - or “ou” lógico (pipe)
68 | - xor “ou” exclusivo
69 | - ! Não (inversão)
70 | - && “e” lógico
71 | - \|\| “ou” lógico (pipe pipe)
72 |
73 | ### Comparação
74 |
75 | As comparações são feitas entre os valores contidos nas variáveis, e não
76 | as referências. Sempre retornam um valor booleano.
77 |
78 | - == Igual a
79 | - ! Diferente
80 | - < Menor que
81 | - > Maior que
82 | - <= Menor ou igual a
83 | - >= Maior ou igual a
84 |
85 | ### Expressão condicional ou ternária
86 |
87 | Existe um operador de seleção que é ternário. O interpretador PHP avalia
88 | a primeira expressão. Se ela for verdadeira, a expressão retorna o valor
89 | de expressão2. Senão, retorna o valor de expressão3.
90 |
91 | `If
26 |
27 | = 18) {
32 | echo 'Opa, já posso dirigir e beber';
33 | }
34 | ?>
35 | ...
36 | ```
37 |
38 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/condicional1.php*, no
39 | browser digite
40 | [*http://localhost/*](http://localhost/PHPBasico/Cap3/condicional1.php)[*PHPBasico*](http://localhost/PHPBasico/Cap3/condicional1.php)[*/*](http://localhost/PHPBasico/Cap3/condicional1.php)[*Cap*](http://localhost/PHPBasico/Cap3/condicional1.php)[*3*](http://localhost/PHPBasico/Cap3/condicional1.php)[*/*](http://localhost/PHPBasico/Cap3/condicional1.php)[*condicional1*](http://localhost/PHPBasico/Cap3/condicional1.php)[*.php*](http://localhost/PHPBasico/Cap3/condicional1.php).
41 |
42 | Nota: Repare que entre o “**if**” e o parênteses “**(**“, existe um
43 | espaço, o mesmo ocorre entre o fechamento do parênteses “**)**” e a
44 | abertura da chaves “**{**“. Não há espaço depois da abertura nem
45 | fechamento das chaves.[^2]
46 |
47 | #### else
48 |
49 | ```
50 | ...
51 |
77 |
78 | = 18) {
83 | //retorna true
84 | echo 'Opa, já posso dirigir e beber';
85 | } elseif ($idade >= 12 && $idade <= 17) {
86 | //retorna true se idade for maior e
87 | //igual a 17 e menor e igual a 10
88 | echo 'Não posso dirigir nem beber';
89 | } else {
90 | //retorna false
91 | echo 'Muito criança, não vai nem para escola sozinho';
92 | }
93 | ?>
94 | ...
95 | ```
96 |
97 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/condicional3.php*, no
98 | browser digite
99 | [*http://localhost/*](http://localhost/PHPBasico/Cap3/condicional3.php)[*PHPBasico*](http://localhost/PHPBasico/Cap3/condicional3.php)[*/*](http://localhost/PHPBasico/Cap3/condicional3.php)[*Cap*](http://localhost/PHPBasico/Cap3/condicional3.php)[*3*](http://localhost/PHPBasico/Cap3/condicional3.php)[*/*](http://localhost/PHPBasico/Cap3/condicional3.php)[*condicional*](http://localhost/PHPBasico/Cap3/condicional3.php)[*3*](http://localhost/PHPBasico/Cap3/condicional3.php)[*.php*](http://localhost/PHPBasico/Cap3/condicional3.php).
100 |
101 | #### Outro exemplo if e eles
102 |
103 | ```
104 | ...
105 |
If e Else
106 |
107 |
126 | ...
127 | ```
128 |
129 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/condicional4.php*, no
130 | browser digite
131 | [*http://localhost/*](http://localhost/PHPBasico/Cap3/condicional4.php)[*PHPBasico*](http://localhost/PHPBasico/Cap3/condicional4.php)[*/*](http://localhost/PHPBasico/Cap3/condicional4.php)[*Cap*](http://localhost/PHPBasico/Cap3/condicional4.php)[*3*](http://localhost/PHPBasico/Cap3/condicional4.php)[*/*](http://localhost/PHPBasico/Cap3/condicional4.php)[*condicional*](http://localhost/PHPBasico/Cap3/condicional4.php)[*4*](http://localhost/PHPBasico/Cap3/condicional4.php)[*.php*](http://localhost/PHPBasico/Cap3/condicional4.php).
132 |
133 | Veremos agora outra forma de condicional o switch (\$var) … case.
134 |
135 | #### Switch
136 |
137 | Assim como no if, esse comando fará comparações, e caso o valor seja
138 | verdadeiro, entrará na condição. Vamos a um exemplo bem simples.
139 |
140 | ```
141 | ...
142 |
switch e case
143 |
144 |
156 | ...
157 | ```
158 |
159 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/condicional5.php*, no
160 | browser digite
161 | [*http://localhost/*](http://localhost/PHPBasico/Cap3/condicional4.php)[*PHPBasico*](http://localhost/PHPBasico/Cap3/condicional4.php)[*/*](http://localhost/PHPBasico/Cap3/condicional4.php)[*Cap*](http://localhost/PHPBasico/Cap3/condicional4.php)[*3*](http://localhost/PHPBasico/Cap3/condicional4.php)[*/*](http://localhost/PHPBasico/Cap3/condicional4.php)[*condicional*](http://localhost/PHPBasico/Cap3/condicional4.php)[*5*](http://localhost/PHPBasico/Cap3/condicional4.php)[*.php*](http://localhost/PHPBasico/Cap3/condicional4.php).
162 |
163 | Note que no final de cada case exite o comando break, esse comando é
164 | obrigatório, e será explicado em outro exercício.
165 |
166 | ```
167 | ...
168 |
switch e case
169 |
170 |
185 | ...
186 | ```
187 |
188 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/condicional6.php*, no
189 | browser digite
190 | [*http://localhost/*](http://localhost/PHPBasico/Cap3/condicional6.php)[*PHPBasico*](http://localhost/PHPBasico/Cap3/condicional6.php)[*/*](http://localhost/PHPBasico/Cap3/condicional6.php)[*Cap*](http://localhost/PHPBasico/Cap3/condicional6.php)[*3*](http://localhost/PHPBasico/Cap3/condicional6.php)[*/*](http://localhost/PHPBasico/Cap3/condicional6.php)[*condicional*](http://localhost/PHPBasico/Cap3/condicional6.php)[*6*](http://localhost/PHPBasico/Cap3/condicional6.php)[*.php*](http://localhost/PHPBasico/Cap3/condicional6.php).
191 |
192 | O comando **default**:, serve como um “**else**”, ou seja, no caso de
193 | false em todos os “**case**” ele assume um valor padrão.
194 |
195 | ```
196 | ...
197 |
switch e case
198 |
199 |
219 | ...
220 | ```
221 |
222 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/condicional7.php*, no
223 | browser digite
224 | [*http://localhost/*](http://localhost/PHPBasico/Cap3/condicional7.php)[*PHPBasico*](http://localhost/PHPBasico/Cap3/condicional7.php)[*/*](http://localhost/PHPBasico/Cap3/condicional7.php)[*Cap*](http://localhost/PHPBasico/Cap3/condicional7.php)[*3*](http://localhost/PHPBasico/Cap3/condicional7.php)[*/*](http://localhost/PHPBasico/Cap3/condicional7.php)[*condicional*](http://localhost/PHPBasico/Cap3/condicional7.php)[*7*](http://localhost/PHPBasico/Cap3/condicional7.php)[*.php*](http://localhost/PHPBasico/Cap3/condicional7.php).
225 |
226 | Nota: Repare que entre o “**switch**” e o parênteses “**(**“, existe um
227 | espaço, o mesmo ocorre entre o fechamento do parênteses “**)**” e a
228 | abertura da chaves “**{**“. Não há espaço depois da abertura nem
229 | fechamento das chaves.[^3]
230 |
231 | ### Repetição
232 |
233 | As estruturas de repetições ou laços, servem para que uma determinada
234 | situação seja repetida enquanto ela seja verdadeira. Fazem parte dessa
235 | lista o while, do, for e foreach.
236 |
237 | #### While
238 |
239 |
240 | ```
241 | ...
242 |
While
243 |
244 | ';
250 | }
251 | ?>
252 | ...
253 | ```
254 |
255 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/repeticao1.php*, no
256 | browser digite .
257 |
258 | Nota: Assim como no **if** e no **switch**, observe o espaço entre o
259 | comando “**while**” e o parênteses “**(**“ e o espaço entre o fechamento
260 | do parênteses “**)**” com a abertura da chave “**{**“.[^4]
261 |
262 | #### Do while
263 |
264 | ```
265 | ...
266 |
Do While
267 |
268 | ';
274 | } while ($contador <= 10);
275 |
276 | ?>
277 | ...
278 | ```
279 |
280 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/repeticao2.php*, no
281 | browser digite
282 | [http://localhost/PHPBasico/Cap3/repeticao](http://localhost/PHPBasico/Cap3/repeticao1.php)[2](http://localhost/PHPBasico/Cap3/repeticao1.php)[.php](http://localhost/PHPBasico/Cap3/repeticao1.php).
283 |
284 | Nota: A diferença entre o **while** e o **do while** é que o **while**
285 | testa se é verdadeiro e executa enquanto o **do while** executa pelo
286 | menos uma vez antes de testar. Veja a forma como foi codificado o **do
287 | while**, segue o mesmo padrão do FIG[^5]
288 |
289 | #### For
290 |
291 | ```
292 | ...
293 |
353 |
354 | 'Suzuki',
357 | 2 => 'Yamaha',
358 | 3 => 'Honda',
359 | 4 => 'Triumph',
360 | 5 => 'Ducati'
361 | ];
362 |
363 | foreach ($motos as $key => $value) {
364 | echo $key . ' - ' . $value . ' ';
365 | }
366 | ?>
367 | ...
368 | ```
369 |
370 | Salve em */home/seu\_usuario/www/PHPBasico/Cap3/repeticao6.php*, no
371 | browser digite
372 | [http://localhost/PHPBasico/Cap3/repeticao](http://localhost/PHPBasico/Cap3/repeticao5.php)[6](http://localhost/PHPBasico/Cap3/repeticao5.php)[.php](http://localhost/PHPBasico/Cap3/repeticao5.php).
373 |
374 | Nota: o **for** e o **foreach** também seguem a padronização do FIG[^6]
375 |
376 | Resumo do capítulo
377 | ------------------
378 |
379 | Nesse capítulo aprendemos um pouco mais do básico do PHP. Vimos como é
380 | possível tomar decisões no código com os comandos ***if***, ***else*** e
381 | ***elseif***, e com o comando ***switch*** ***case***, uma outra maneira
382 | de tomar decisões. Com os comandos ***while***, ***do while***,
383 | ***for*** e ***foreach*** descobrimos como repetir informações de uma
384 | coleção de dados ou lista.
385 |
386 | Exercícios
387 | ----------
388 |
389 | 1. Crie um script que informe se o aluno foi “Aprovado”, “Reprovado” ou
390 | está em “Recuperação”. Com os seguintes critérios, maior ou igual a
391 | 6, aluno está aprovado, menor ou igual a 5, aluno reprovado.
392 |
393 | 2. Crie uma estrutura de controle com o “switch case” para exibir se um
394 | modelo de carro é do ano atual ou não.
395 |
396 | 3. Crie um contador cujo exiba o valor de 4 até 100 contando de 2 em 2,
397 | ou seja, 4, 6, 8 etc.
398 |
399 | 4. Aproveite o arquivo exemplo4.php do Capítulo 1 para listar todos os
400 | itens e subitens do array “\$compras” criado no arquivo.
401 |
402 | 5. Crie um script que conte de 0 até 1000 e quando chegar no número da
403 | sua idade, escreva na tela “Eu tenho X anos” e quando chegar ao
404 | número 169 interromper o script.
405 |
--------------------------------------------------------------------------------
/v0.1/04-capitulo_4/04-capitulo_4.md:
--------------------------------------------------------------------------------
1 |
2 | Capítulo 4
3 | ==========
4 |
5 | Nesse capítulo aprenderemos sobre as funções do PHP, e como elas são
6 | muito úteis e evitam a repetição de código. A partir de agora, sairemos
7 | do basicão e entraremos um pouco mais a fundo na linguagem e estamos
8 | dando um passo para o nível intermediário.
9 |
10 | Funções
11 | -------
12 |
13 | O principal objetivo das funções é simplificar a vida do desenvolvedor.
14 | Aprendendo e usando as ***functions***, você será capaz de implementar o
15 | **DRY** (***Don't Repeat Yourself***). Algumas caraterísticas de uma
16 | função, ela pode ou não esperar um argumento ou mais, e sempre returna
17 | um valor mesmo que nulo. Vamos aos exemplos.
18 |
19 | ### Função sem argumentos
20 |
21 | ```
22 | ...
23 |
24 |
Função sem argumento
25 |
26 |
41 | ...
42 | ```
43 |
44 | Salve em */home/seu\_usuario/www/PHPBasico/Cap4/funcao1.php*, no browser
45 | digite
46 | [http://localhost/PHPBasico/Cap](http://localhost/PHPBasico/Cap4/funcao1.php)[4](http://localhost/PHPBasico/Cap4/funcao1.php)[/](http://localhost/PHPBasico/Cap4/funcao1.php)[funcao1](http://localhost/PHPBasico/Cap4/funcao1.php)[.php](http://localhost/PHPBasico/Cap4/funcao1.php).
47 |
48 | **Nota:** Em uma função as variáveis criadas dentro dela, só é válida
49 | dentro da própria função. Variáveis criadas fora da função também não
50 | são acessadas pela função somente se utilizar o escopo GLOBALS dentro da
51 | função.
52 |
53 | ### Função sem argumentos com variável fora do escopo
54 |
55 | ```
56 | ...
57 |
58 |
Função sem argumento com variável fora do
59 | escopo
60 |
61 | ' . $valor1;
79 |
80 | ?>
81 | ...
82 | ```
83 |
84 | Salve em */home/seu\_usuario/www/PHPBasico/Cap4/funcao2.php*, no browser
85 | digite
86 | [http://localhost/PHPBasico/Cap](http://localhost/PHPBasico/Cap4/funcao1.php)[4](http://localhost/PHPBasico/Cap4/funcao1.php)[/](http://localhost/PHPBasico/Cap4/funcao1.php)[funcao](http://localhost/PHPBasico/Cap4/funcao1.php)[2](http://localhost/PHPBasico/Cap4/funcao1.php)[.php](http://localhost/PHPBasico/Cap4/funcao1.php).
87 |
88 | **Nota:** Repare que o valor da soma continuou o mesmo. Isso porque a
89 | variável $valor1 só é utilizada fora da função.
90 |
91 | ### Função sem argumento com variável global
92 | ```
93 | ...
94 |
95 |
Função sem argumento com variável global
96 |
97 | ' . $valor1;
115 |
116 | ?>
117 | ...
118 | ```
119 |
120 | Salve em */home/seu\_usuario/www/PHPBasico/Cap4/funcao3.php*, no browser
121 | digite
122 | [http://localhost/PHPBasico/Cap](http://localhost/PHPBasico/Cap4/funcao1.php)[4](http://localhost/PHPBasico/Cap4/funcao1.php)[/](http://localhost/PHPBasico/Cap4/funcao1.php)[funcao](http://localhost/PHPBasico/Cap4/funcao1.php)[3](http://localhost/PHPBasico/Cap4/funcao1.php)[.php](http://localhost/PHPBasico/Cap4/funcao1.php).
123 |
124 | **Nota:** Repare que o valor da soma modificou. Isso porque a variável
125 | \$valor1 foi precedida da palavra-chave “global” dentro da função.
126 |
127 | ### Função com argumento
128 | ```
129 | ...
130 |
131 |
Função com argumento
132 |
133 |
149 | ...
150 | ```
151 |
152 | Salve em */home/seu\_usuario/www/PHPBasico/Cap4/funcao4.php*, no browser
153 | digite
154 | [http://localhost/PHPBasico/Cap](http://localhost/PHPBasico/Cap4/funcao4.php)[4](http://localhost/PHPBasico/Cap4/funcao4.php)[/](http://localhost/PHPBasico/Cap4/funcao4.php)[funcao](http://localhost/PHPBasico/Cap4/funcao4.php)[4](http://localhost/PHPBasico/Cap4/funcao4.php)[.php](http://localhost/PHPBasico/Cap4/funcao4.php).
155 |
156 | **Nota:** Observe que nesse exemplo eu passei um argumento para a função
157 | chamada $nome, com isso posso alterar livremente a variável nome sem
158 | ter que mudar a função.
159 |
160 | ### Função com dois argumentos ou mais
161 | ```
162 | ...
163 |
Função com dos argumentos ou mais
164 |
165 |
183 | ...
184 | ```
185 |
186 | Salve em */home/seu\_usuario/www/PHPBasico/Cap4/funcao5.php*, no browser
187 | digite
188 | [http://localhost/PHPBasico/Cap](http://localhost/PHPBasico/Cap4/funcao5.php)[4](http://localhost/PHPBasico/Cap4/funcao5.php)[/](http://localhost/PHPBasico/Cap4/funcao5.php)[funcao](http://localhost/PHPBasico/Cap4/funcao5.php)[5.](http://localhost/PHPBasico/Cap4/funcao5.php)[php](http://localhost/PHPBasico/Cap4/funcao5.php).
189 |
190 | **Nota:** Nesse exemplo passamos 2 parâmetros, note que **$idade** está
191 | declarado com o valor 100, isso indica que o parâmetro tem um valor
192 | padrão e também quer dizer que pode ser omitido na chamada da função.
193 |
194 | Resumo do capítulo
195 | ------------------
196 |
197 | Nesse capítulo aprendemos como criar e chamar funções. Elas são muito
198 | úteis para evitar reescrita do código. Com as funções você começará a
199 | criar suas próprias bibliotecas e reutilizá-las em outros projetos.
200 |
201 | Exercícios
202 | ----------
203 |
204 | 1. Crie uma função que passe um parâmetro em forma de array contendo
205 | nome, nota1, nota2, nota3 e nota4, Calcule a média do aluno e exiba
206 | no final o nome do aluno e a situação se está aprovado, reprovado ou
207 | em recuperação e a sua média. O critério é o mesmo do exercício 1 do
208 | Capítulo 3.
209 |
210 | 2. Crie uma função que retorne os elementos pares de um loop de
211 | forma automática.
212 |
--------------------------------------------------------------------------------
/v0.1/05-capitulo_5/05-capitulo_5.md:
--------------------------------------------------------------------------------
1 |
2 | Capítulo 5
3 | ==========
4 |
5 | Nesse capítulo abordaremos como disparar e-mail com o PHP usando a
6 | função mail.
7 |
8 | Função Mail
9 | -----------
10 |
11 | Essa função é responsável por disparar e-mails usando o PHP. Ela suporta
12 | todas as configurações que são usadas normalmente em um webmail.
13 | Configurações como, anexo, mime-type entre outras.
14 |
15 | Abaixo um breve descritivo dos parâmetros da função.
16 |
17 | - **$to (*string*)** – Destinatário (para quem vai a mensagem);
18 |
19 | - **$subject (*string*)** – Assunto;
20 |
21 | - **$message (*string*)** – Mensagem;
22 |
23 | - **$adtional\_headers (*string*)** – Informações do Cabeçalho do
24 | e-mail (opcional);
25 |
26 | - **$adition\_parameters (*string*)** – Usado para definição
27 | de sendmail\_paht() (opcional);
28 |
29 | ### Envio de e-mail simples
30 | ```
31 | ...
32 |
122 | ";
123 |
124 | $headers = 'MIME-Version: 1.0' . "\r\n";
125 | $headers .= 'Content-type:text/html;charset=UTF-8' . "\r\n";
126 | $headers .= 'From: webmaster , alguém
127 | E-mail enviado com sucesso!';
138 | } else {
139 | echo 'Erro: Não foi possível enviar o e-mail!';
140 | }
141 | ?>
142 | ...
143 | ```
144 |
145 | Salve em */home/seu\_usuario/www/PHPBasico/Cap5/email4.php*, no browser
146 | digite
147 | [http://localhost/PHPBasico/Cap](http://localhost/PHPBasico/Cap5/email4.php)[5](http://localhost/PHPBasico/Cap5/email4.php)[/](http://localhost/PHPBasico/Cap5/email4.php)[email](http://localhost/PHPBasico/Cap5/email4.php)[4](http://localhost/PHPBasico/Cap5/email4.php)[.](http://localhost/PHPBasico/Cap5/email4.php)[php](http://localhost/PHPBasico/Cap5/email4.php).
148 |
149 | Resumo do capítulo
150 | ------------------
151 |
152 | Nesse capítulo aprendemos como fazer envio de e-mail diretamente com o
153 | PHP. No entanto, para elas funcionarem o seu servidor de hospedagem
154 | precisa estar com as configurações feitas, caso contrário o envio
155 | falhará.
156 |
--------------------------------------------------------------------------------
/v0.1/06-capitulo_6/06-capitulo_6.md:
--------------------------------------------------------------------------------
1 | Capítulo 6
2 | ==========
3 |
4 | Nesse capítulo você aprenderá como recuperar dados de formulários, seus
5 | tipos (POST, GET e REQUEST) e formulários que suportam envio de
6 | arquivos.
7 |
8 | Recuperando dados de Formulários
9 | --------------------------------
10 |
11 | Para recuperar dados vindo de um fomulário é preciso saber qual tipo de
12 | protocolo foi informado no formulário. Para formulário do tipo
13 | ***post*** as informações devem ser recebidas pela variável global de
14 | PHP do tipo **$_POST[]** e formulário do tipo ***get*** devem ser
15 | recebidos pela variável global **$_GET[]**. Existe um tipo especial
16 | que é o $_REQUEST[], que recebe tanto o tipo *get* quanto o tipo
17 | *post*, porém seu uso deve ser muito restrito (evitado).
18 |
19 | **Nota:** Todas as vezes que sua aplicação receber dados de um
20 | formulário ou tiver interação com o usuário esses dados **DEVEM** ser
21 | tratados por meio de algumas funções do PHP.
22 |
23 | ### Recuperando campos de texto via $_POST[].
24 | ```
25 | ...
26 |
Formulário simples 1 (POST)
27 |
28 |
43 |
44 | Recuperando campos de texto do tipo post';
48 |
49 | echo 'Nome: ' . $_POST['nome'];
50 | echo ' E-mail: ' . $_POST['email'];
51 | endif;
52 | ?>
53 | ...
54 | ```
55 |
56 | Salve em */home/seu_usuario/www/PHPBasico/Cap6/formSimples1.php*, no
57 | browser digite .
58 |
59 | **Nota:** Todos os campos são recuperados da mesma forma, porém campos
60 | do tipo checkbox tem um comportamento um pouco diferente dos outros.
61 |
62 | ### Recuperando campos de texto via $_GET[].
63 |
64 | Salve o arquivo anterior como *formSimples2.php* e altere o ***method***
65 | do formulário para o tipo **get** e substitua ***$_POST*** por
66 | ***$_GET***. Digite no browser
67 | [http://localhost/PHPBasico/Cap6/formSimples](http://localhost/PHPBasico/Cap6/formSimples1.php)[2](http://localhost/PHPBasico/Cap6/formSimples1.php)[.php](http://localhost/PHPBasico/Cap6/formSimples1.php).
68 |
69 | **Nota:** Uma atenção especial deve ser dada ao se recuperar pelo método
70 | get, esse protocolo só aceita 255 caracteres.
71 |
72 | **Obs:** links em modo geral são recuperados também com o
73 | **$_GET[]**.
74 |
75 | ### Recuperando campos do tipo checkbox e radiobutton.
76 | ```
77 | ...
78 |
Formulário simples 3
79 |
80 |
119 |
120 | Recuperando campos Checkbox e Radiobutton';
124 |
125 | echo 'Qual seu nível de conhecimento em PHP? ';
126 | echo 'R: ' . $_POST['conhecimento'] . '
';
127 | echo 'Quais versão do PHP já utilizou? ';
128 | echo 'R: ' . $_POST['versao'][0] . ' '; //recupera o primeiro item selecionado
129 |
130 | var_dump($_POST['versao']); //Recupera todos os itens marcados
131 | endif;
132 | ?>
133 | ...
134 | ```
135 |
136 | *Salve em /home/seu_usuario/www/PHPBasico/Cap6/formSimples3.php, no
137 | browser digite*
138 | [*http://localhost/PHPBasico/Cap6/formSimples*](http://localhost/PHPBasico/Cap6/formSimples3.php)[*3*](http://localhost/PHPBasico/Cap6/formSimples3.php)[*.php*](http://localhost/PHPBasico/Cap6/formSimples3.php)*.*
139 |
140 | Tratamento de dados recuperados de formulário
141 | ---------------------------------------------
142 |
143 | É altamente recomendado tratar e validar quais quer dado que venha de um
144 | formulário, isso vai garantir um pouco mais de segurança em seu site.
145 | Abordarei aqui as principais e mais comuns funções de tratamento e
146 | validação. O Exercício a seguir mostrará como aplicar essas validações.
147 |
148 | ### Tratamento de formulário com trim(), addslashes(), htmlspecialchars() e htmlentities()
149 | ```
150 | ...
151 |
Tratando form 1
152 |
153 |
167 |
168 | Recuperando e tratando campos de texto do tipo post';
171 | Nome: ' . addslashes($_POST['nome']);
172 |
173 | echo '
Nome: ' . addslashes(nl2br(trim($_POST['comentario'])));
220 | endif;
221 | ?>
222 | ...
223 | ```
224 |
225 | *Salve em /home/seu_usuario/www/PHPBasico/Cap6/tratandoForm2.php, no
226 | browser digite*
227 | [*http://localhost/PHPBasico/Cap6/*](http://localhost/PHPBasico/Cap6/tratandoForm2.php)[*tratandoForm*](http://localhost/PHPBasico/Cap6/tratandoForm2.php)[*2*](http://localhost/PHPBasico/Cap6/tratandoForm2.php)[*.php*](http://localhost/PHPBasico/Cap6/tratandoForm2.php)*.*
228 |
229 | Envio (upload) de arquivo
230 | -------------------------
231 |
232 | O upload de arquivos é muito comum em um site. Mas para que ele funcione
233 | seu formulário precisa informar ao HTML que ele será ser usado com a
234 | finalidade de upload, para isso basta utilizar o atributo
235 | *enctype="multipart/form-data"* na tag form.
236 |
237 | ### Envio de dados com PHP e validação
238 | ```
239 | ...
240 |
Upload de arquivo e validação
241 |
242 |
254 |
255 | Erro: O nome do campo deve ser informado!';
266 | exit;
267 | }
268 | }
269 |
270 | function verificaCampoVazio($nomeCampo = nul, array $campo = null)
271 | {
272 | if ($_FILES[$nomeCampo]['size'] !== 0) {
273 | return true;
274 | } else {
275 | echo ' - Nenhum arquivo '. $nomeCampo .' para ser enviado! ';
276 | }
277 | }
278 |
279 | function validaCampo(array $campo = null)
280 | {
281 | if (is_array($campo)) {
282 | return true;
283 | } else {
284 | echo 'Erro: O Campo deve ser um array!';
285 | exit;
286 | }
287 |
288 | if ($campo) {
289 | return true;
290 | } else {
291 | echo 'Erro: O Campo deve ser informado!';
292 | exit;
293 | }
294 | }
295 |
296 | function upload($nomeCampo = null, array $campo = null)
297 | {
298 |
299 | $dir = __DIR__ . '/upload/';
300 |
301 | if (validaNomeCampo($nomeCampo)) {
302 | if (validaCampo($campo)) {
303 | $arquivo = $uploadfile = $dir . basename($_FILES[$nomeCampo]['name']);
304 |
305 | if(move_uploaded_file($_FILES[$nomeCampo]['tmp_name'], $uploadfile))
306 | {
307 | echo "Arquivo válido e enviado com sucesso. \n";
308 | } else {
309 | echo "Não foi possível gravar oarquivo \n";
310 | }
311 | }
312 | }
313 | }
314 |
315 | if (verificaCampoVazio('img', $_FILES['img'])) {
316 | //verificando se upload é uma imagem
317 | if (!empty($_FILES['img']) && ($_FILES['img']['type'] == 'image/jpeg' ||
318 | $_FILES['img']['type'] == 'image/jpg' ||
319 | $_FILES['img']['type'] == 'image/png' ||
320 | $_FILES['img']['type'] == 'image/gif')) :
321 |
322 | echo 'Grava a imagem no servidor ou banco. Para isso é necessário utilizar $_FILES["img"]["tmp_name"] e ter permissão de escrita no servidor.
';
323 |
324 | upload('img', $_FILES['img']);
325 | else :
326 | echo 'Erro: Arquivo enviado não é uma imagem.
';
327 | endif;
328 | }
329 |
330 | if (verificaCampoVazio('doc', $_FILES['doc'])) {
331 | //verificando se upload é um documento ou planílha ODF ou PDF
332 | if ($_FILES['doc']['type'] == 'application/vnd.oasis.opendocument.spreadsheet' ||
333 | $_FILES['doc']['type'] == 'application/vnd.oasis.opendocument.text' ||
334 | $_FILES['doc']['type'] == 'application/pdf') :
335 | echo 'Grava a imagem no servidor ou banco. Para isso é necessário utilizar $_FILES["doc"]["tmp_name"] e ter permissão de escrita no servidor.
';
336 |
337 | upload('doc', $_FILES['doc']);
338 | else :
339 | 'Erro: Arquivo enviado não documento ou planílha ODF ou PDF.
';
340 | endif;
341 | }
342 | endif;
343 | ?>
344 | ...
345 | ```
346 |
347 | *Salve em /home/seu_usuario/www/PHPBasico/Cap6/formUpload.php, no
348 | browser digite*
349 | [*http://localhost/PHPBasico/Cap6/*](http://localhost/PHPBasico/Cap6/formUpload.php)[*formUpload*](http://localhost/PHPBasico/Cap6/formUpload.php)[*.php*](http://localhost/PHPBasico/Cap6/formUpload.php)*.*
350 |
351 | Evitando o CSRF (Cross Site Request Forgery)
352 | --------------------------------------------
353 |
354 | Como já foi falado várias vezes durante o curso, segurança é um ponto
355 | que devemos sempre estar atento. Nesse tópico abordaremos mais ponto de
356 | segurança, o **CSRF**, popularmente conhecido como token de formulário.
357 | Para facilitar o entendimento e testes, faremos os exercícios em várias
358 | etapas e dividiremos em 2 arquivos.
359 | ```
360 | ...
361 |
Evitando o CSRF (Cross Site Request Forgery)
362 |
363 |
379 | ...
380 | ```
381 |
382 | *Salve em /home/seu_usuario/www/PHPBasico/Cap6/formEvitandoCSRF.php, no
383 | browser digite*
384 | [http://localhost/PHPBasico/Cap6/](http://localhost/PHPBasico/Cap6/formEvitandoCSRF.php)[*formEvitandoCSRF*](http://localhost/PHPBasico/Cap6/formEvitandoCSRF.php)[*.php*](http://localhost/PHPBasico/Cap6/formEvitandoCSRF.php)*.*
385 |
386 | Continuando a edição do arquivo criado anteriormente. Nesse momento
387 | faremos as principais validações e recuperação dos dados enviados pelo
388 | formulário no PHP. Abra o arquivo
389 | *home/seu_usuario/www/PHPBasico/Cap6/formEvitandoCSRF.php* e edite logo
390 | abaixo da tag ****.
391 | ```
392 | ...
393 |
394 |
433 | ...
434 | ```
435 |
436 | *Salve em /home/seu_usuario/www/PHPBasico/Cap6/formEvitandoCSRF.php, no
437 | browser digite*
438 | [http://localhost/PHPBasico/Cap6/](http://localhost/PHPBasico/Cap6/formEvitandoCSRF.php)[*formEvitandoCSRF*](http://localhost/PHPBasico/Cap6/formEvitandoCSRF.php)[*.php*](http://localhost/PHPBasico/Cap6/formEvitandoCSRF.php)*.*
439 |
440 | Vamos agora testar nosso formulário e veremos como ainda está vulnerável
441 | a ataques. Abra o terminal (CTRL+T) e digite o seguinte comando: ***curl
442 | -d 'nome=qualquer nome&email=qualquer email&comentario=qualquer
443 | comentário'***
444 | e veja
445 | que os valores digitados foram enviados e exibidos na tela. Isso indica
446 | o quão vulnerável ainda está seu formulário.
447 |
448 | Dando continuidade ao exercício proposto criaremos um arquivo para fazer
449 | as funções de validações contra o CSRF.
450 | ```
451 |
482 | ```
483 | *Salve em /home/seu_usuario/www/PHPBasico/Cap6/formEvitandoCSRF.php.*
484 |
485 | *Continue editando o arquivo formEvitandoCSRF.php*. Posicione o cursor
486 | depois do comentário '*if ($_POST) {*', e envolva todo o código PHP
487 | com a validação contra o CSRF, como no exercício abaixo.
488 | ```
489 | ...
490 | //verifica se houve subimit
491 | if ($_POST) {
492 | if (verificaToken(isset($_POST['token']))) {
493 | extract($_POST);
494 |
495 | if (trim($nome) == "") {
496 | ...
497 |
498 | } //fim do if (verificaToken())
499 |
500 | ...
501 |
502 | }// fim do if ($_POST)
503 | ?>
504 | ...
505 | ```
506 | *Salve em /home/seu_usuario/www/PHPBasico/Cap6/formEvitandoCSRF.php*.
507 |
508 | Agora para finalizar, crie um campo do tipo hidden com o nome token.
509 | Esse campo pode ser o primeiro campo do formulário.
510 | ```
511 | ...
512 |