Escolar Documentos
Profissional Documentos
Cultura Documentos
Essentials
www.4linux.com.br
-2
Sumário
Capítulo 1
Introdução
......................................................................................................................................................10
1.1. Objetivos...........................................................................................................................10
1.2. Definição do projeto.........................................................................................................11
1.3. PHP e MySQL - onde vamos chegar ...............................................................................11
1.4. Como funciona um servidor Web ....................................................................................12
1.4.1. URL (Uniform Resource Locator) ou endereço da página
..........................................................................................................................................................14
1.4.2. Protocolo .................................................................................................................................14
1.4.3. Endereço do Servidor : Porta .................................................................................................15
1.4.4. Diretório/Arquivo ...................................................................................................................16
1.4.5. Arquivos índice de diretórios..................................................................................................16
1.5. Instalando o servidor web Apache com suporte ao PHP ...............................................17
1.5.1. Gerenciando pacotes com o Aptitude ....................................................................................17
1.5.2. Instalando o servidor Apache 2 com suporte ao PHP5..........................................................18
Capítulo 2
Breve revisão ao HTML/XHTML ................................................................................................20
2.1. Objetivos...........................................................................................................................20
2.2. Introdução teórica............................................................................................................21
2.3. Conhendo e personalizando o editor Gedit ....................................................................22
2.4. Estrutura básica de uma página HTML/XHTML ...........................................................23
2.5. Um primeiro exercício em HTML/XHTML ....................................................................25
2.5.1. Organizando o exercício ........................................................................................................25
2.5.2. Formulário de Compras .........................................................................................................26
2.6. Páginas estáticas X Páginas dinâmicas ..........................................................................28
Capítulo 3
A solução: PHP ............................................................................................................................29
3.1. Objetivos...........................................................................................................................29
3.2. Introdução teórica............................................................................................................29
3.3. Características do PHP ...................................................................................................30
3.4. Sintaxe básica .................................................................................................................31
3.5. Variáveis ..........................................................................................................................33
3.5.1. Conceito...................................................................................................................................33
3.5.2. Nomes de variáveis ................................................................................................................34
-3
Capítulo 4
Integrando o PHP ao HTML .......................................................................................................46
4.1. Objetivos...........................................................................................................................46
4.2. Primeira forma:................................................................................................................47
4.3. Segunda Forma:...............................................................................................................48
4.3.1. Terceira forma:........................................................................................................................48
4.4. Laboratório.......................................................................................................................49
Capítulo 5
Estruturas de controle ...............................................................................................................50
5.1. Objetivos...........................................................................................................................50
5.2. Introdução teórica............................................................................................................50
5.3. Condição: if/else ..............................................................................................................51
5.4. Condição elseif e switch/case .........................................................................................52
5.4.1. Adicionando ao script .............................................................................................................54
5.5. Laços de Repetição ou Loops .........................................................................................55
5.5.1. Interrompendo uma estrutura de controle ...........................................................................56
5.6. Laboratório.......................................................................................................................56
Capítulo 6
Funções .......................................................................................................................................57
-4
6.1. Objetivo.............................................................................................................................57
6.2. Introdução teórica............................................................................................................57
6.3. Laboratório.......................................................................................................................59
6.4. Escopo das Variáveis .......................................................................................................59
Capítulo 7
Formulários, GET e POST...........................................................................................................62
7.1. Objetivos...........................................................................................................................62
7.2. Passando variáveis entre scripts.....................................................................................63
7.2.1. Os métodos GET e POST ........................................................................................................63
7.3. Laboratório.......................................................................................................................66
7.4. Criando Links...................................................................................................................66
Capítulo 8
Arrays e Strings...........................................................................................................................68
8.1. Objetivos...........................................................................................................................68
8.2. Arrays...............................................................................................................................68
8.3. Strings..............................................................................................................................69
8.4. Strings vão muito além doque apenas caracteres que representam texto. Com strings
podemos trabalhar com arrays, validação de campos, formatação de texto e até mesmo
criar uma classe de template.
Vamos ver nesse capitulo algumas funções interessantes para se trabalhar com Strings.. 69
8.4.1. str_replace()............................................................................................................................69
8.4.2. strip_tags()...............................................................................................................................70
8.4.3. stristr().....................................................................................................................................70
8.4.4. strcmp()...................................................................................................................................71
8.4.5. Explode e Implode...................................................................................................................71
8.5. Laboratório.......................................................................................................................72
Capítulo 9
Header, Cookies, Sessões ...........................................................................................................73
9.1. Objetivos...........................................................................................................................73
9.2. Introdução teórica............................................................................................................74
9.2.1. Como utilizar sessões .............................................................................................................74
9.3. Laboratório.......................................................................................................................75
Capítulo 10
Introdução ao Banco de dados MySQL.......................................................................................76
10.1. Objetivos.........................................................................................................................76
10.2. Introdução teórica..........................................................................................................77
10.3. Instalando o MySQL ......................................................................................................77
-5
Capítulo 11
Integrando o PHP com MySQL ................................................................................................102
11.1. Objetivos.......................................................................................................................102
11.2. Extensão Melhorada MySQL (mysqli).........................................................................103
11.2.1. Conectando-se ao banco ....................................................................................................103
11.2.2. Executando consultas ........................................................................................................104
11.2.3. Recuperando registros........................................................................................................105
11.2.4. Passando por todos registros .............................................................................................106
11.2.5. Exemplo completo com uso do Modo Orientado a Objeto ................................................107
11.2.6. Prepared Statment..............................................................................................................108
-6
11.2.7. Transactions........................................................................................................................110
11.3. PDO (PHP Data Objects)..............................................................................................111
11.3.1. Conectando-se ao banco ....................................................................................................112
11.3.2. Executando consultas ........................................................................................................113
11.3.3. Executando inserções, exclusões e atualizações...............................................................114
11.3.4. Prepared Statment..............................................................................................................114
11.3.5. Transactions........................................................................................................................116
Capítulo 12
Programação Orientada a Objetos ...........................................................................................117
12.1. Objetivos.......................................................................................................................117
12.2. Introdução teórica........................................................................................................118
12.3. Conceitos .....................................................................................................................118
12.3.1. Classe .................................................................................................................................118
12.3.2. Objeto .................................................................................................................................119
12.3.3. Atributos .............................................................................................................................119
12.3.4. Métodos ..............................................................................................................................119
12.4. Uma classe simples: Pessoa ........................................................................................119
12.5. Herança .......................................................................................................................122
12.6. Encapsulamento ..........................................................................................................124
12.7. Métodos mágicos.........................................................................................................125
12.7.1. __construct .........................................................................................................................125
12.7.2. __destruct ...........................................................................................................................127
12.7.3. __get e __set.........................................................................................................................127
12.7.4. __toString............................................................................................................................130
12.7.5. Outros métodos mágicos ...................................................................................................131
12.8. Classes Abstratas ........................................................................................................131
12.9. Interfaces e Métodos Abstratos...................................................................................132
12.9.1. Interfaces............................................................................................................................132
12.9.2. Métodos Abstratos..............................................................................................................133
12.10. Atributos Estáticos ....................................................................................................133
12.11. Métodos Estáticos .....................................................................................................134
12.12. A mensagem de erro mais louca do PHP .................................................................137
Capítulo 13
Streams......................................................................................................................................138
13.1. Objetivo........................................................................................................................138
13.2. Introdução teórica........................................................................................................138
13.3. Método fopen ..............................................................................................................139
13.3.1. Gravando informações em arquivos ..................................................................................139
13.3.2. Lendo arquivos ...................................................................................................................140
-7
Capítulo 14
Tratamento de Erros e Exceções..............................................................................................142
14.1. Objetivos.......................................................................................................................142
14.2. Exibição de erros.........................................................................................................142
14.2.1. Função die...........................................................................................................................144
14.2.2. Capturando e Gerando Erros..............................................................................................144
14.2.3. Registro de Erros (Log)......................................................................................................145
14.2.4. Configurando o php.ini.......................................................................................................146
14.3. Tratamento de Exceções..............................................................................................147
14.3.1. Métodos...............................................................................................................................147
Capítulo 15
Construindo uma classe de acesso a dados .............................................................................148
15.1. Objetivos.......................................................................................................................148
15.2. Porque uma classe Tabela? .........................................................................................149
15.3. Construindo a classe tabela ........................................................................................150
15.3.1. config.inc.php – arquivo de configuração..........................................................................150
15.3.2. Atributos da Classe Tabela.................................................................................................151
15.3.3. Construtor ..........................................................................................................................152
15.3.4. Um getter automático.........................................................................................................154
15.3.5. Método para execução de consultas..................................................................................155
15.3.6. Listando (SELECT) registros..............................................................................................157
15.3.7. Recuperando um registro pela chave primária.................................................................159
15.3.8. Excluindo um registro pela chave primária.......................................................................160
15.3.9. Inserindo um registro.........................................................................................................161
15.3.10. Atualizando um registro....................................................................................................163
15.4. Criando um CRUD........................................................................................................166
15.4.1. O que é um CRUD?.............................................................................................................166
15.4.2. Criando as classes filhas ....................................................................................................166
15.4.3. Adicionando um método específico à classe......................................................................167
15.4.4. Exemplo de uso ..................................................................................................................168
Capítulo 16
Separando HTML do PHP: Classe Template............................................................................175
16.1. Objetivo........................................................................................................................175
16.2. Introdução teórica........................................................................................................176
16.3. Classe Template: pegando e exibindo arquivos de templates....................................177
16.4. Cabecalho do Site Administrativo...............................................................................180
-8
Capítulo 17
Segurança: Sistema de Login...................................................................................................200
17.1. Objetivo........................................................................................................................200
17.2. Classe Seguranca.........................................................................................................201
17.2.1. login.php..............................................................................................................................204
17.2.2. logout.php...........................................................................................................................206
17.2.3. index.php alterado para checar usuário logado................................................................206
REFERÊNCIAS
BIBLIOGRÁFICAS......................................................................................................................207
ANEXOS.....................................................................................................................................209
HTML/XHTML - Referência Básica......................................................................................210
Estrutura Básica de uma página ....................................................................................................210
Tags de Texto ..................................................................................................................................211
Listas ...............................................................................................................................................211
Imagens ..........................................................................................................................................212
Tabelas ............................................................................................................................................212
Formulários .....................................................................................................................................213
Enviando e-mails com o PHP ...............................................................................................217
Verificando o tipo de uma variável ......................................................................................218
Transformação de tipos - Coerções ...............................................................................................219
Transformação explícita de tipos ...................................................................................................221
Conexão segura ....................................................................................................................222
Instalando a ferramenta OpenSSL - (Secure Socket Layer) .........................................................222
Criando uma certificadora local ....................................................................................................222
Criando um site seguro ..................................................................................................................223
Acertando o resolvedor de nomes local .........................................................................................224
Criando uma requisição de certificação ........................................................................................224
Assinando a certificação ................................................................................................................224
Habilitando o site seguro ...............................................................................................................225
Habilitando conexão segura ...........................................................................................................225
Reiniciando o servidor web. ...........................................................................................................225
-9
Capítulo 18
A certificação.............................................................................................................................226
18.1. Questionário ZEND(Inglês).........................................................................................227
Índice de tabelas
Tabela 1: Tipos de Dados no PHP5.........................................................................................34
Tabela 2: Caracteres de Escape..............................................................................................36
Tabela 3: Variáveis Superglobais do PHP...............................................................................38
Tabela 4:Operadores aritméticos ...........................................................................................40
Tabela 5: Operador de string .................................................................................................40
Tabela 6: Operadores de Atribuição.......................................................................................41
Tabela 7: Operadores Bit a Bit................................................................................................41
Tabela 8:Operadores lógicos ..................................................................................................42
Tabela 9: Operadores de comparação ...................................................................................42
Tabela 10:Operadores de incremento/decremento ...............................................................43
Tabela 11:Ordem de precedência dos operadores ................................................................43
Tabela 12: Tabela Clientes......................................................................................................80
Tabela 13:Tabela de Operadores de Comparação .................................................................93
Tabela 14:Tabela Operadores Lógicos ...................................................................................94
Tabela 15: Caracteres de especificação de tipo...................................................................109
Tabela 16: Lista de tipos para método bindParm.................................................................114
Índice de Figuras
Figura 1.1: Como funciona um servidor Web.........................................................................13
Figura 10.1: Tabela Pessoa ....................................................................................................87
Figura 12.1: Classe Pessoa...................................................................................................120
Figura 12.2: Herança de classes..........................................................................................122
Capítulo 1 Introdução - 10
Capítulo 1
Introdução
1.1. Objetivos
• Estar apto para instalar o servidor web Apache com suporte ao PHP.
Introdução teórica
Agora iremos definir nosso projeto, ver aonde iremos chegar com o PHP e o
SBGD MySQL.
Capítulo 1 Introdução - 11
◦ Cadastro de Produtos;
◦ Cadastro de Usuário;
◦ Login;
◦ Pedido.
• Web Design;
• Uma linguagem de desenvolvimento Web;
• Um banco de dados.
• Protocolo
• Endereço do Servidor (normalmente seu nome de host/domínio): porta (a
porta é opcional)
• Recurso no servidor (no caso de serviços Web, diretório/arquivo)
Exemplo:
http://www.4linux.com.br/cursos/php-mysql-web-developer-412.html
1.4.2. Protocolo
Protocolo pode ser compreendido como uma "língua comum" para que dois
computadores troquem informações dentro de um padrão de requisição e respostas,
independente de suas plataformas, ambientes, linguagens de programação, etc.
O protocolo dos servidores Web, como já vimos, é o HTTP (ou HTTPS para
modo seguro). Entretanto, é comuns os navegadores também se comunicarem com
outros serviços com outros protocolos como o FTP.
A porta padrão dos servidores Web é 80 e por isto pode ser omitida na
navegação usual. Se o servidor aguarda requisições em outra porta, é necessário
informá-la após o endereço, separado por dois pontos.
Exemplos de Endereços:
www.4linux.com.br
netclass.hackerteen.com
66.118.142.41
netclass.hackerteen.com:8020
66.118.142.41:8050
1.4.4. Diretório/Arquivo
É importante compreender que existe uma relação direta entre o caminho que
informamos e o sistema de arquivos, pois o servidor Web determina um "caminho
raiz" para os arquivos.
/var/www/4linux
http://www.4linux.com.br/cursos/php-mysql-web-developer-412.html
/var/www/4linux/cursos/php-mysql-web-developer-412.html
Neste caso existe uma configuração nos servidores que é DirectoryIndex (ou
semelhante): ele especifíca qual o arquivo que será acessado caso se requisite
apenas um diretório, ou seja, qual o índice do diretório. Os padrões mais comuns são
index.html (padrão Apache) e default.html (padrão ISS, da Microsoft). Quando o
servidor possui vínculo com alguma outra linguagem, é comum que os arquivos desta
linguagem também sejam configurados, como index.php (PHP), index.pl (Perl), etc.
# aptitude update
Podemos procurar por pacotes com o comando abaixo. Por exemplo, para
buscar o pacote apache2 :
Capítulo 1 Introdução - 18
Testando a instalação
http://localhost/
Para testar, é necessário criar um arquivo com extensão .php no diretório raiz
do servidor web, que é /var/www:
# gedit /var/www/phpinfo.php
Capítulo 1 Introdução - 19
http://localhost/phpinfo.php
Agora você está com seu servidor Web com suporte a PHP funcional.
Capítulo 2 Breve revisão ao HTML/XHTML - 20
Capítulo 2
2.1. Objetivos
O XHTML também não permite formatação dentro das TAGS como o HTML, a
formatação é sempre através de folhas de estilo em cascata (CSS). Isto facilita muito
a vida do programador, além de tornar as páginas mais leves e de carregamento mais
ágil.
A seguir será feita uma pequena revisão dos conceitos das TAGS
HTML/XHMTL e criado um pequeno conjunto de páginas com as TAGS básicas para
este curso.
Sempre acesse o Gedit como root, pois de outro modo não será possível
salvar os arquivos dentro do diretório /var/www.
#cd /var/www
#gedit &
1 <b>texto em negrito</b>
2 <p> parágravo </p>
3 <h1> título em primeiro nível </h1>
11 <html>
12 <head>
13
14 <title>Título da página</title>
15 </head>
16 <body>
17 textos, imagens, links, etc...
18 </body>
19 </html>
No HTML não há distinção entre tags com caixa baixa ou alta, ou seja <HTML>,
<Html> e <html>, mas o XHTML é rígido e só aceita tags e atributos em minúsculas.
OBSERVAÇÃO:
#cd /var/www
#mkdir curso
#cd curso
#mkdir html
#mkdir php
1 <html>
2 <head>
3 <title>
4 Borracharia do Tux
5 </title>
6 </head>
7 <body>
8 <h1>Borracharia do Tux</h1>
9 <form action="processar.html" method="post">
10 <table border="1">
11
12 Item
13 Quantidade
14
15
16 <td>Rodas</td>
17 <td>
18 <input type="text" name="nrodas" size="3" maxlength="3">
19 </td>
20
21
22 <td>Pneus</td>
23 <td>
24 <input type="text" name="npneu" size="3" maxlength="3">
25 </td>
26
27
28 <td>Parafusos</td>
29 <td>
30 <input type="text" name="nparafusos" size="3" maxlength="3">
31 </td>
Capítulo 2 Breve revisão ao HTML/XHTML - 27
32
33
44
45 <td colspan="2">
46 <input type="submit" value="Enviar" />
47 </td>
48
49 </table>
50 </form>
51 </body>
52 </html>
1 <html>
2 <head>
3 <title>
4 Borracharia do Tux
5 </title>
Capítulo 2 Breve revisão ao HTML/XHTML - 28
6 </head>
7 <body>
8 <h1>Borracharia do Tux</h1>
9 <h2>Pedido finalizado.</h2>
10 </body>
11 </html>
Isto nos permite então criarmos aplicações web dos mais variados tipos, desde
agendas a fóruns, sistemas de documentação, jogos, chats, dentre outros.
Capítulo 3
A solução: PHP
3.1. Objetivos
Além disso, o PHP tem suporte a outros serviços através de protocolos, como
IMAP, SNMP, NNTP, POP3 e, logicamente, HTTP. Ainda é possível abrir sockets e
interagir com outros protocolos.
12 <?php
13 echo("Olá Mundo!");
14 ?>
Este exemplo nos mostra o comando echo, que "ecoa" ou envia uma string
como HTML/XHTML. O ideal é que no decorrer do script seja montada uma página
HTML/XHTML perfeitamente formatada para não gerar erros de visualização.
Para que um arquivo seja interpretado como código PHP é necessário que
ele tenha a extensão .php (ou outra que seja configurada no servidor Web,
o que não é muito comum).
// STANDARD TAGS
<?php
comandos;
?>
// SHORT TAGS
<?
comandos;
?>
// SCRIPT TAGS
<script language="php">
comandos;
</script>
// ASP TAGS
<%
comandos;
%>
Capítulo 3 A solução: PHP - 32
15 phpinfo();
16 echo "testando";
17 phpinfo()
18 echo "testando";
Capítulo 3 A solução: PHP - 33
19 <?php
20 if ($x == $x) //não precisa de ponto e vírgula
21 {
22 echo 'com ponto e vírgula'; //precisa de ponto e vírgula
23 }
24 ?>
25 <?php
26 // Comentário de uma única linha,
echo "teste" // ou até o final da linha
27 # Comentário de uma única linha, ou até o final da linha (pouco
usado)
28 /*
29 Comentário em
30 múltiplas linhas
31 */
32 ?>
3.5. Variáveis
3.5.1. Conceito
As variáveis no PHP sempre iniciam com o cifrão ($) seguido de uma letra ou
do caracter "_".
// Variáveis válidas
$dia
$Mes
$_ano
// Variáveis inválidas
$*dia
$9meses
$(nome)
Todo projeto deve ter uma padronização no nome das variáveis. Elas não
devem ser codificadas demais a ponto de não serem claras, nem longas a
ponto de dificultar seu uso. Além disso, deve-se evitar variáveis
complemente em maiúsculas, pois este é um padrão para CONSTANTES.
33 <?php
34 $teste = "Linux";
35 $total = 867;
36 ?>
37 <?php
38 $teste = "Linux";
39 $php = '---$teste---\n';
Capítulo 3 A solução: PHP - 36
40 echo "$php";
41 ?>
---$teste--\n
42 <?php
43 $teste = "Linux";
44 $php = "---$teste---\n";
45 echo "$php";
46 ?>
---Linux---
47 <?php
48 $teste = <<<TEXT
49 Uma linha de texto
50 TEXT;
51 ?>
Sintaxe Significado
\n Nova linha
\r Retorno de carro
\t Tabulação horizontal
\\ A própria barra \
\' Aspas simples '
\” Aspas duplas “
Capítulo 3 A solução: PHP - 37
a) <? ?>
b) <?php ?>
c) <# #>
d) <% %>
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
___________________________________________________________________________________
\n ->______________________________________________________________________________
\t ->______________________________________________________________________________
\r ->______________________________________________________________________________
Capítulo 3 A solução: PHP - 38
Variável Descrição
$GLOBALS Contém uma referência a cada variável disponível no escopo das variáveis
do script. As chaves desta matriz são os nomes das variáveis globais.
$_SERVER Estas variáveis são definidas pelo servidor web, caso contrário são
relacionadas ao ambiente de execução do script atual.
$_GET Variáveis disponíveis no script, oriundas de HTTP GET.
$_POST Variáveis disponíveis no script, oriundas de HTTP POST.
$_COOKIE Variáveis disponíveis no script, oriundas de HTTP cookies.
$_FILES Variáveis disponíveis no script, oriundas do envio de arquivos via HTTP.
$_ENV Variáveis disponíveis no script através do ambiente de execução do script.
$_REQUEST Através desta variável, tem-se acesso ao conteúdo das variáveis $_GET,
$_POST e $_COOKIE.
$_SESSION Variáveis registradas na sessão do script atual.
Capítulo 3 A solução: PHP - 39
3.7.3. Constantes
Ao contrário das variáveis, por vezes é interessante definir valores fixos para
todo script, mas também fazendo referência a eles. Estas são as constantes. Por
exemplo, se nosso script faz diversos cálculos usando o número PI, podemos defini-lo
e usá-lo da seguinte forma, utilizando a função define:
52 //Definindo
53 define('PI', 3.1415);
54 //Usando
55 $circunferencia = 2 * PI * $raio;
3.8. Operadores
3.8.1. Aritméticos
Operador Significado
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Módulo
Operador Significado
. Concatenação
Capítulo 3 A solução: PHP - 41
Operador Significado
= Atribuição simples
+= Atribuição com adição
-= Atribuição com subtração
*= Atribuição com multiplicação
/= Atribuição com divisão
%= Atribuição com módulo
.= Atribuição com
concatenação
Exemplo:
56 <?php
57 $a = 7;
58 $a += 2;// $a passa a conter o valor 9
59 $a -= 1;// $a passa a conter o valor 8
60 $a /= 4;// $a passa a conter o valor 2
61 ?>
Operador Significado
& E lógico
Capítulo 3 A solução: PHP - 42
| OU lógico
^ OU exclusivo
~ NÃO (inversão)
>> LEFT shift
<< RIGHT shift
Operador Significado
and E lógico
or OU lógico
xor OU exclusivo
! NÃO (inversão)
&& E lógico
|| OU lógico
Existem dois operadores para "e" e para "ou", pois eles têm diferentes
posições na ordem de precedência.
Operador Significado
== Igual a
!= Diferente de
< Menor que
> Maior que
<= Menor ou igual a
Capítulo 3 A solução: PHP - 43
Operador Significado
++ Incrementa de 1
-- Decrementa de 1
Exemplos:
62 <?php
63 $a = $b = 10; // $a e $b recebem o valor 10
64 $c = $a++; // $c recebe 10 e $a passa a ter 11
65 $d = ++$b; // $d recebe 11, valor de $b já incrementado
66 ?>
3 Esquerda xor
4 Esquerda and
5 Direita print
6 Esquerda = += -= *= /= .= %= & = != ~ = < <= >
>=
7 Esquerda ?:
8 Esquerda ||
9 Esquerda &&
10 Esquerda|
11 Esquerda ^
12 Esquerda &
13 Não associa == !=
14 Não associa < >
15 Esquerda << >>
16 Esquerda +-.
17 Esquerda */%
18 Direita ! ~ ++ -- (int) (double) (string) (array)
(object) @
19 Direita [
20 Não associa new
21 Não associa ()
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
Capítulo 3 A solução: PHP - 45
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
Capítulo 4 Integrando o PHP ao HTML - 46
Capítulo 4
4.1. Objetivos
• Dar saída a código HTML através de comandos do PHP (echo, print, printf,
etc.);
• Armazenar o conteúdo a ser exibido numa variável e então dar saída a código
HTML através de comandos do PHP (echo, print, printf, etc.);
67 <html>
68 <head>
69 <title>
70 Borracharia do Tux
71 </title>
72 </head>
73 <body>
74 <h1>Borracharia do Tux</h1>
75
76 <?php
77 echo '<h2 align="center">Pedido finalizado em ';
78 echo date('H:i, jS F');
79 echo '</h2>';
80 ?>
81
82 </body>
83 </html>
Perceba que utilizando as tags básicas do PHP (no exemplo <?php ?>)
inserimos uma sequência de comandos PHP, que tiveram “saída” através do comendo
echo.
Capítulo 4 Integrando o PHP ao HTML - 48
84 <?php
85 echo '
86 <html>
87 <head>
88 <title>
89 Borracharia do Tux
90 </title>
91 </head>
92 <body>
93 <h1>Borracharia do Tux</h1>
94 <h2 align="center">Pedido finalizado em ' .
95 date('H:i, jS F') . '</h2>
96 </body>
97 </html>';
98 ?>
99 <?php
100 $conteudo = '
101 <html>
102 <head>
103 <title>
104 Borracharia do Tux
105 </title>
106 </head>
107 <body>
Capítulo 4 Integrando o PHP ao HTML - 49
4.4. Laboratório
Capítulo 5
Estruturas de controle
5.1. Objetivos
if (condição)
comando; // Executado se a condição for true, apenas um comando
if (condição){
comandos // Executado se a condição for true
}
Temos ainda que avaliar a combobox que indica a forma pela qual o usuário
conheceu a Borracharia do Tux.
Mas neste caso, temos várias opções, e não apenas um verdadeiro ou falso.
Nesse caso, podemos utilizar os comandos elseif e switch/case. Um mesmo exemplo é
mostrado abaixo com cada uma das formas:
137
Qualquer umas das formas de teste e validação podem ser usados no script
processar.php.
Diversas vezes temos de repetir o mesmo código. Por exemplo, listar uma lista
que tenha 4 ítens, não é difícil escrever utilizando 4 linhas com o comando "echo".
Agora imaginamos a dor de cabeça que seria imprimir uma lista de compras com 100
ítens! Nestes casos, utiliza-se o while ou o for.
Estes dois ciclos são muito similares, visto que se pode sempre converter um
ciclo em outro, e vice-versa. A decisão de utilizar um ou outro, é pessoal e tem a ver
com a simplicidade de interpretação. Existem situações onde um while aplica-se com
mais facilidade e em outras o for. O while é bastante utilizado para passar pelos
registro de uma consulta ao banco de dados.
177 while(condição){
178 //bloco de código
179 }
O bloco de código é repetido até que a condição se torne falsa. Note que é
importante que dentro do ciclo a condição seja alterada em algum momento para
falsa, pois do contrário o programa travará neste loop.
Iteração número: 1
Iteração número: 2
Iteração número: 3
Iteração número: 4
Iteração número: 5
Capítulo 5 Estruturas de controle - 56
5.6. Laboratório
Capítulo 6
Funções
6.1. Objetivo
184 <?php
185 function fazerAlgo ($arg_1, $arg_2, /* ..., */ $arg_n)
186 {
187 echo "Exemplo de função.\n";
188 return $valor_retornado;
189 }
190 ?>
Capítulo 6 Funções - 58
191 <?php
192 function mostrarTitulo ()
193 {
194 echo "<h1>Capítulo 1</h1>";
195 }
196
200 <?php
201 function mostrarTitulo ($numero)
202 {
203 echo "<h1>Capítulo $numero";
204 }
205 // Utilizando a função
206 mostrarTitulo("1");
207 ?>
208 <?php
209 function mostrarTitulo ($numero='1')
210 {
211 echo "<h1>Capítulo $numero</h1>";
212 }
213
218 mostrarTitulo();
219
220 ?>
221 <?php
222 function mostrarTitulo ($numero='1')
223 {
224 return "<h1>Capítulo $numero</h1>";
225 }
226
Qualquer comando que houver depois de um return será ignorado, pois ele
encerra a função.
6.3. Laboratório
Criar uma função para o cabeçalho do site, uma para o menu e outra para o
rodapé.
Para acessar uma variável externa dentro da função, utiliza-se uma das duas
sintaxes abaixo:
Capítulo 6 Funções - 60
230 <?php
231 $nome = 'Maria';
232 $sobrenome = 'da Silva';
233 $idade = 25;
234 $dataNascimento = '01/01/1984';
235
Outro exemplo:
260 <?php
261 function Teste()
262 {
263 echo "$a";
264 static $a = 0;
265 $a++;
266 }
267 ?>
Capítulo 7
7.1. Objetivos
http://www.meusite.com/meuscript.php?campo1=valor1&campo2=valor2
De outro modo, é possível enviar uma informação via método GET sem a
necessidade de formulário, apenas digitando uma URL diretamente na barra de
endereço do navegador.
Capítulo 7 Formulários, GET e POST - 64
http://www.meusite.com/meuscript.php?
nome=Joao&idade=29&fone[com]=3333.4444&fone[res]=9999.888
facilmente alvo de ataque. Portanto, deve ser utilizada como última opção –
o ideal é usar ou $_GET ou $_POST.
7.3. Laboratório
Isto gera:
Isto gera:
Capítulo 8
Arrays e Strings
8.1. Objetivos
8.2. Arrays
Exemplo de array:
Ainda com arrays, posso associá-los a uma lista, fazendo com que variáveis
assumam determinados valores correspondentes aos índices do array.
8.3. Strings
8.4. Strings vão muito além doque apenas caracteres que representam
texto. Com strings podemos trabalhar com arrays, validação de campos,
formatação de texto e até mesmo criar uma classe de template.
Vamos ver nesse capitulo algumas funções interessantes para se trabalhar
com Strings.
8.4.1. str_replace()
8.4.2. strip_tags()
Com a função strip_tags() permitimos ao PHP que bloqueie tags HTML de uma
determinada string, mantendo assim uma certa “segurança” ao código gerado.
Isso é valido por exemplo em um sistema de comentários, ao qual eu permito que o
usuário faça uso de tags do tipo “<p>”, “<b>” e “<i>”.
8.4.3. stristr()
8.4.4. strcmp()
307 if(strcmp(“a”,”A”)==0){
308 echo “As strings são iguais”;
309 }
A primeira, tem por sua vez, a função de explodir uma string dividindo-a em
array.
Com isso conseguimos por exemplo validar um e-mail.
310 $email=”kinn.coelho@4linux.com.br”;
311 $verificacaoEmail = explode(“@”,$email);
312 $verificacaoDominio = explode(“.”$verificacaoEmail[0]);
313 if(verificacaoEmail[0] != “” AND verificacaoDominio[1] !=””)
314 echo “E-mail válido”;
O Implode por sua vez, nos permite transformar um array em uma string.
8.5. Laboratório
Fazendo uso das funções de Strings, vamos criar nossa engine de template.
Capítulo 9
9.1. Objetivos
/etc/php5/apache2/php.ini
session.gc_maxlifetime = 1440
;(1440 seconds = 24 minutes)
325 session_start();
326 session_start();
327 $_SESSION['login'] = 'jorge';
Enquanto a sessão estiver ativa, qualquer script que a carregar pode fazer uso
desta variável.
328 session_start();
329 session_destroy();
9.3. Laboratório
Fazendo uso da session, vamos fazer com que produtos sejam adicionados em
nossa sessão e consequentemente no carrinho de compras.
Para isso, vamos assumir que nosso array produtos recebera alguns produtos
como valores, para fins de testes do nosso carrinho.
Ex:
produtos(“iPod”,”iPad”,”iMac”,”Milestone”,”Android”,”ZendStudio”)
Capítulo 10 Introdução ao Banco de dados MySQL - 76
Capítulo 10
10.1. Objetivos
Testando o banco
Exemplo:
# mysql_secure_installation
production environment.
(REMOVER USUÁRIOS ANÔNIMOS? Y)
Remove anonymous users? [Y/n] Y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
(DESABILITAR ACESSO REMOTO DO root? Y)
Disallow root login remotely? [Y/n] Y
... Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
(REMOVER BANCO DE DADOS test E ACESSO A ELE? Y)
Remove test database and access to it? [Y/n] Y
- Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't
exist
... Failed! Not critical, keep moving...
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
(REINICIAR PRIVILÉGIOS? Y)
Reload privilege tables now? [Y/n] Y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
Capítulo 10 Introdução ao Banco de dados MySQL - 80
/etc/init.d/apache2 restart
10.5.1. Tabelas
# CPF Nome1
1 152.487.265-42 João da Silva
2 687.481.682-88 Maria Joaquina
3 001.645.852.12 Agnaldo Souza
Capítulo 10 Introdução ao Banco de dados MySQL - 81
Formalmente falando, uma tupla é uma lista ordenada de valores, onde cada
valor é do domínio especificado pelo atributo definido no esquema de relação.
10.5.5. Chave
Por exemplo, se um banco (base) de dados tem como chave Código do Produto
+ ID Sistema, sempre que acontecer uma inserção de dados, o sistema de
gerenciamento de banco (base) de dados irá fazer uma consulta para identificar se o
Capítulo 10 Introdução ao Banco de dados MySQL - 82
registro não se encontra gravado na tabela. Caso exista um novo registro não será
criado, sendo que apenas a alteração do registro existente será possível. A unicidade
dos registros, determinada por sua chave, também é fundamental para a criação dos
índices.
• Chave Primária: (PK - Primary Key) é a chave que identifica cada registro
dando-lhe unicidade. A chave primária nunca se repetirá. A maioria dos
bancos também exige que ela seja NÃO NULA (NOT NULL) além de única.
• Chave Estrangeira: (FK - Foreign Key) é uma chave formada pela chave
primária de outra tabela e a chave de um campo da tabela que recebe o
relacionamento. Define um relacionamento entre as tabelas e pode ocorrer
repetidas vezes.
10.5.6. Índices
Caso o índice se corrompa por algum motivo, é possível que pesquisas possam
retornar resultados não desejados ou que inserções de chaves duplicadas aconteçam.
Nesse caso o banco de dados será corrompido também. Os sistemas de bancos
(bases) de dados possuem mecanismos de evitar que esses eventos ocorram como
também possibilitam a recuperação dos índices e consistência da tabela caso eles
ocorram.
Capítulo 10 Introdução ao Banco de dados MySQL - 83
10.5.7. Relacionamentos
• Um para um (1 para 1)
• Um para muitos (1 para N)
• Muitos para muitos (N para N), que não pode ser implementado diretamente
no modelo relacional e tem que ser construído com uma tabela auxiliar.
/*
Isto é um comentário
*/
Capítulo 10 Introdução ao Banco de dados MySQL - 85
TEXTO
• CHAR(n) - String (texto) de tamanho fixo “n”. Limite 255 caracteres. Usado
quando o texto armazenado é sempre do mesmo tamanho, como em UF, CPF,
CEP
• VARCHAR(n) - String (texto) de tamanho variável até o máximo de “n”.
Limite 65.532k. Usado quando não se sabe o tamanho exato do texto a ser
armazenado, mas apenas seu tamanho máximo, como em Nome, Endereço,
etc.
• ENUM – Objeto de texto que permite definir uma lista dos valores válidos,
armazendo um deles.
• TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT – Campos texto variáveis,
podendo conter:
- TINYTEXT: of 255 (28 – 1) caracteres
- TEXT: 65,535 (216 – 1) caracteres
- MEDIUMTEXT: 16,777,215 (224 – 1) caracteres
- LONGTEXT: 4,294,967,295 or 4GB (232 – 1) caracteres
DATA
NÚMEROS
BINÁRIOS
BLOB - Este tipo de campo é o tipo indicado para armazenar Textos Grandes
“Memos”, Fotos, Gráficos, Ícones, isto é, aparentemente não tem um tipo de dado
que não possa ser armazenado no Campo Blob. Campos Blob´s não podem ser
indexados. Um tipo especial de BLOB é o TEXT, otimizado para texto.
USE cadastro;
Capítulo 10 Introdução ao Banco de dados MySQL - 87
Exemplo:
SHOW DATABASES;
SHOW TABLES;
DESCRIBE pessoa;
/* Definindo tabela */
Capítulo 10 Introdução ao Banco de dados MySQL - 89
Textos devem estar entre aspas simples ou duplas. As datas no formato aaaa-
mm-dd, também entre aspas simples ou duplas.
/* Definindo tabela */
UPDATE TABELA
/* Lista de campos a serem atualizados separados por vírgula */
SET
CAMPO1 = 'Novo Valor',
CAMPO2 = 45,
CAMPO3 = '2006-12-31';
/* Definindo tabela */
UPDATE TABELA
/* Lista de campos a serem atualizados separados por vírgula */
SET
CAMPO1 = 'Novo Valor',
CAMPO2 = 45,
CAMPO3 = '2006-12-31'
/* Filtrando a chave primária */
WHERE
CAMPO_QUE_É_CHAVE_PRIMÁRIA = 4587
/* Definindo tabela */
UPDATE TABELA
/* Lista de campos a serem atualizados separados por vírgula */
Capítulo 10 Introdução ao Banco de dados MySQL - 91
SET
CAMPO1 = 'Novo Valor',
CAMPO2 = 45,
CAMPO3 = '2006-12-31'
/* Filtrando vários registros */
WHERE
CAMPO1 = 'Valor qualquer'
AND CAMPO2 > 2;
/* Definindo tabela */
DELETE FROM TABELA;
/* Definindo tabela */
DELETE FROM TABELA
Capítulo 10 Introdução ao Banco de dados MySQL - 92
/* Definindo tabela */
DELETE FROM TABELA
/* Filtrando vários registros */
WHERE
CAMPO1 = 'Valor qualquer'
AND CAMPO2 > 2;
TRUNCATE TABELA;
Sintaxe básica :
/* Selecionar */
SELECT
/* Lista de campos separados por vírgula */
CAMPO1, CAMPO2, CAMPO3
Capítulo 10 Introdução ao Banco de dados MySQL - 93
/* Da tabela */
FROM TABELA;
Condições
Filtrando dados
Exemplo:
Operador Descrição
OR OU - Um filtro ou outro
AND E - Um filtro e outro filtro
Exemplo :
FLUSH PRIVILEGES
bind-address = 127.0.0.1
#bind-address = 127.0.0.1
Capítulo 10 Introdução ao Banco de dados MySQL - 96
/etc/init.d/mysql restart
10.9. phpMyAdmin
http://localhost/phpmyadmin
Tabela usuario :
Tabela categoria :
Tabela cliente :
Tabela livro :
Tabela pedido:
Tabela pedidoitem :
mysql> exit;
mysql -u root -p < populate.sql
10.11.1. Transações
Transação é uma sequência de instruções que deverá ser lida como uma
instrução indivisível.
Uma transação deve ser atômica (tudo ou nada), ou seja, ou são todas
operações executadas ou todas são ignoradas.
O MySQL possui uma sintaxe própria em seus scripts para tratar transações.
Utiliza-se o comando START TRANSACTION antes de um conjunto de operações para
indicar que fazem parte de uma transação; e ao final, mediante uma condição, define-
se se será efetivada toda transação (COMMIT) ou abortada completamente
(ROLLBACK).
Exemplo
Vantagens:
Desvantagens:
• Para uma única operação, gera mais requisições (uma para a preparação,
outra para a execução final).
Capítulo 10 Introdução ao Banco de dados MySQL - 101
10.12. Finalizando
Capítulo 11
11.1. Objetivos
330 // Conexão
331 $conexao = new mysqli('host', 'user', 'password', 'database');
332 if (mysqli_connect_errno()) {
333 echo 'Erro na conexão: ' . mysqli_connect_error();
334 exit;
335 }
336 // Comandos relacionadas à conexão...
337 $conexao->close();
Modo Procedural:
Modo Procedural:
Modo Procedural:
Modo Procedural:
Modo Procedural:
394 <?php
395 // Arquivo conexao.php
396 // Dados para conexão
397 $servidor = 'localhost';
398 $banco = 'cadastro';
399 $usuario = 'cadastro';
400 $senha = 'password';
401
402 // Conexão
403 $conexao = new mysqli($servidor, $usuario, $senha,$banco);
404
425
Caractere Descrição
i corresponde a uma variável de tipo inteiro
d corresponde a uma variável de tipo double
s corresponde a uma variável de tipo string
b corresponde a uma variável que contém
dados para um blob e enviará em pacotes
Modo Procedural:
11.2.7. Transactions
Modo Procedural:
O PDO retorna excessões em forma de objeto (visto mais adiante neste curso).
Portanto, é possível utilizar a sintaxe try/catch para capturar e tratar erros.
514 try
515 {
516 $dsn = 'mysql:host=localhost;dbname=banco';
517 $conexao = new PDO($dsn, 'user', 'password');
518 $conexao->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
519 $conexao->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
520 }
521 catch (PDOException $e)
522 {
523 echo 'Erro: ' . $e->getMessage();
524 }
Capítulo 11 Integrando o PHP com MySQL - 113
Constante Descrição
PDO::PARAM_BOOL Boolean
PDO::PARAM_NULL Null
PDO::PARAM_INT Integer
PDO::PARAM_STR Char, Varchar
(padrão)
PDO::PARAM_LOB Blob
11.3.5. Transactions
Capítulo 12
12.1. Objetivos
12.3. Conceitos
12.3.1. Classe
12.3.2. Objeto
12.3.3. Atributos
12.3.4. Métodos
Métodos são açãos, atividades, procedimentos que uma classe pode executar
ou podemos executar com a classe. Se temos a classe VEÍCULOS, podem ser métodos
a ACELERAR, FREAR, VIRAR À DIREITA, VIRAR À ESQUERDA, ANDAR À FRENTE,
ANDAR DE RÉ, entre outros.
cd /var/www/curso
mkdir classes
cd classes
gedit Pessoa.class.php &
611 <?php
612 // Definição da classe
613 class Pessoa {
614
• class: Para definição do nome da classe, que ficará englobada entre chaves
• private, public: Definem o encapsulamento, visto mais adiante
• function: Já conhecido, define aqui um método da classe
• $this->email: o $this é uma auto-referência, ou seja, a classe faz uma
referência a um atributo ou método dela mesma, no caso, o atributo email
Para utilizar a classe, vamos utilizar outro arquivo que vai importar o arquivo
da classe mediante o uso do comando include. este arquivo será salvo com o nome
/var/www/curso/testeClasse.php.
631 <?php
632 include('classes/Pessoa.class.php');
633 $joao = new Pessoa;
634 $joao->nome = "João";
635 $joao->email = "joao@teste.com.br";
636 $assunto = 'Teste de envio';
637 $mensagem = 'Olá, pessoa.';
638 echo "Enviando mensagem para " . $joao->nome;
639 $joao->enviarEmail($assunto, $mensagem);
640 ?>
Capítulo 12 Programação Orientada a Objetos - 122
12.5. Herança
A classe FILHA herda todas os atributos e métodos da classe PAI, e pode criar
outros ou, dentro de certas limitações, alterar os métodos da classe PAI.
Primeiro, /var/www/curso/classes/Professor.class.php :
641 <?php
642 // Definição da classe EXTENDIDA = Herança
643 class Professor extends Pessoa {
644
Segundo, /var/www/curso/classes/Aluno.class.php :
658 <?php
659 // Definição da classe EXTENDIDA = Herança
660 class Aluno extends Pessoa {
661
670 }
671 }
672 ?>
673 <?php
674 include('classes/Pessoa.class.php');
675 include('classes/Aluno.class.php');
676 $joao = new Aluno;
677 $joao->nome = "João";
678 $serie = 8;
679 $joao->alterarSerie($serie);
680
12.6. Encapsulamento
• Pública (public): O atributo ou método pode ser acessado pela classe que o
definiu, pelas classes derivadas desta classe (filhas) e pelas instâncias dessas
classes (objetos).
• Protegida (protected): O atributo ou método pode ser acessado pela classe
Capítulo 12 Programação Orientada a Objetos - 125
que o definiu, pelas classes derivadas desta classe (filhas) mas NÃO pelas
instâncias dessas classes (objetos).
• Privada (private): O atributo ou método pode ser acessado APENAS classe
que o definiu, e JAMAIS pelas classes derivadas desta classe (filhas) ou pelas
instâncias dessas classes (objetos).
12.7.1. __construct
Podemos alterar a classe Pessoa para que solicite alguns valores em sua
inicialização:
684 <?php
685 class Pessoa {
686
709 <?php
710 include('classes/Pessoa.class.php');
711 $joao= new Pessoa(1, "João");
712 $miguel = new Pessoa(2, "Miguel", "miguel@teste.com.br");
713 echo "Primeira pessoa: " . $joao->nome . "<br/>";
714 echo "A pessoa " . $miguel->nome . " tem o email " . $miguel-
>email;
715 ?>
12.7.2. __destruct
Getters e Setters são termos comuns para métodos que recuperam (get) e
definem (set) valores para um atributo da classe. É extremamente comum que
atributos sejam protegidos ou privados, e sejam alterados unicamente através de
métodos para garantir sua integridade.
716 <?php
717 class Pessoa {
718 protected $id;
719 protected $nome;
720 protected $idade;
721 protected $sexo;
Capítulo 12 Programação Orientada a Objetos - 128
722 }
723
728 <?php
729 class Pessoa {
730 protected $id;
731 protected $nome;
732 protected $idade;
733 protected $sexo;
734
744 }
745
750 <?php
751 class Pessoa {
752 protected $id;
753 protected $nome;
754 protected $idade;
755 protected $sexo;
756
E então todos os atributos estão disponíveis através dos métodos mágicos. Isto
não impede que se tenha métodos personalizados.
Capítulo 12 Programação Orientada a Objetos - 130
12.7.4. __toString
Quando um objeto é tratado como uma string (como num comando echo) ele
gera um erro. Entretanto, é possível determinar como será a saída de um objeto
nesta situação implementando o método mágico __toString.
781 <?php
782 class meuErro {
783 public $saida = 'Meu erro';
784 }
785 $erro = new meuErro;
786 echo $erro;
787 ?>
788 <?php
789 class meuErro {
790 public $saida = 'Meu erro';
791
http://www.php.net/manual/pt_BR/language.oop5.magic.php
No exemplo da classe PAI Pessoa, esta poderia ser definida como ABSTRATA,
apenas servindo de base para as classes Professor e Aluno.
799 <?php
800 abstract class Pessoa {
801 // (...)
802 ?>
Capítulo 12 Programação Orientada a Objetos - 132
12.9.1. Interfaces
803 <?php
804 interface iPessoa {
805 public function enviarEmail() ;
806 }
807 class Aluno implements iPessoa {
808
809 }
810 ?>
Fatal error: Class Aluno contains 1 abstract method and must therefore be
declared abstract or implement the remaining methods
(iPessoa::enviarEmail) in /var/www/curso/interface.php on line 7
811 <?php
812 interface iPessoa {
813 public function enviarEmail() ;
814 }
Capítulo 12 Programação Orientada a Objetos - 133
Exemplo:
820 <?php
821 class Aluno implements iPessoa {
822 abstract public function enviarEmail($email);
823 }
850 unset($obj2);
851 echo $obj1->getCont() . " - ";
852 <?php
853 class Data {
854
868 <?php
869 include('classes/Data.class.php');
870
881 ?>
Capítulo 12 Programação Orientada a Objetos - 136
Alguns cuidados devem ser tomados para evitar erros no uso de métodos
estáticos. Primeiro: métodos estáticos são utilizados sem instância da classe, então
não podem utilizar a chamada $this. Em seu lugar, utilizam o self:: .
882 <?php
883 Class Data {
884 const SEPARADOR_BANCO = '-';
885 const SEPARADOR_TELA = '/';
886
Capítulo 13
Streams
13.1. Objetivo
Exemplos :
Exemplo :
905 fclose($fp);
912 <?php
Capítulo 13 Streams - 141
Esta função lê um arquivo inteiro para uma variável. Muito útil para arquivos
HTML, por exemplo.
Capítulo 14
14.1. Objetivos
(Passe o link para os alunos, também está disponível nos links Depois da Aula)
Alguns erros são fatais, não podem ser capturados e impedem o uso do script.
Por exemplo, erros de sintaxe – entretanto, estes dificilmente chegam na aplicação
final.
O PHP possui um comando que encerra o script, que é o exit. Ele permite
recebimento de um parâmetro, que é uma mensagem que será exibida ao encerrar o
script.
display_errors = On
Isto determina quando os erros devem ser mostrados como parte da saída
ou se devem ser escondidos do usuário.
display_startup_errors = On
Mesmo quando display_errors esta em on, erros que aconteçam durante a
inicialização do PHP não são mostrados. É fortemente recomendado manter
display_startup_errors em off, exceto para procurar erros.
error_reporting = E_ALL | E_STRICT
Define o nível de erros para reportar. (já visto anteriormente).
log_errors = On
Indica se as mensagens de erro do script devem ficar no log de erros do
servidor ou em error_log. Esta opção depende do servidor.
track_errors = On
Se ativado, a última mensagem de erro sempre estará disponível na variável
$php_errormsg. (ou seja, é possível recuperar o último erro apenas com a
manipulação desta variável).
Capítulo 14 Tratamento de Erros e Exceções - 147
Ou seja:
14.3.1. Métodos
Capítulo 15
dados
15.1. Objetivos
# cd /var/www
# mkdir livraria
# cd livraria
# mkdir admin imagens intro site classes imagensLivros templates
Esta não poderá ser utilizada diretamente, pois só será possível definindo
valores para seus atributos básicos.
Capítulo 15 Construindo uma classe de acesso a dados - 150
928 <?php
929 /*
930 * Configurações de acesso ao banco de dados
931 */
932
951 include_once("classes/{$classe}.class.php");
952 }
Ao final, para não precisar de outro arquivo, foi definida a função __autoload,
para carga automática de classes. Desta forma, este é o único arquivo a ser incluído
para funcionamento básico do sistema.
Agora faremos a construção por partes, para facilitar. Vamos criar o arquivo
/var/www/livraria/classes/Tabela.class.php e definir os atributos :
953 <?php
954 /*
955 Classe Abstrata Tabela
956 */
957 abstract class Tabela {
958
Todo os atributos são protegidos, pois não queremos que o usuário final tenha
acesso aos valores, a não ser de modo controlado (getters e setters).
Alguns métodos só farão sentido quando formos utilizar a tabela, então, mais
adiante os compreenderemos.
15.3.3. Construtor
974 /*
975 * Método construtor
976 * Se conexão não existir, cria, senão, nada a fazer
Capítulo 15 Construindo uma classe de acesso a dados - 153
$GLOBALS['CONFIG']['arquivo_log']);
1009
• Linha 9: uso da palavra chave global para ter acesso a uma variável fora do
escopo da função/método, e recuperar as informações do arquivo de
configuração.
• Linha 14: uso do isset com negação (!) no teste lógico, para verificar se a
variável NÃO está definida, e uso do escopo self:: para acessar uma
variável estática da classe;
• Linha 18: montagem do Data Source Name para conexão com a biblioteca
PDO utilizando a variável de configuração importada para o escopo do
método com a palavra chave global;
• Linha 21: utilizando o tratamento de exceção com o try...catch;
• Linha 24: a conexão em si. Notar que é armazenada estaticamente, para
estar disponível para outras instâncias da classe – na segunda instância, este
bloco condicional não é executado, pois a variável já está definida – ver linha
14;
• Linhas 30 a 41: gerando uma mensagem de erro para o usuário final e
gravando no arquivo de log definido na configuração. O uso do método
getTraceString facilita o rastreio do erro.
Vamos precisar recuperar alguns atributos da classe, mas eles são protegidos.
Então utiliza-se o método mágico __get. Note que não nos interessa setters, pois não
permitiremos alterações, apenas leitura dos atributos.
1016 /*
1017 * Método mágico __get
Capítulo 15 Construindo uma classe de acesso a dados - 155
1026 /*
1027 * Método query
1028 * Executa uma consulta através da conexão estabelecida
1029 * Verifica se o debug está ativo
1030 * (variável $debugBanco=true em config.inc.php)
1031 * Retorna um objeto com o resultado da consulta
1032 */
1033 public function query($sql)
1034 {
1035 global $debugBanco;
1036
1042 {
1043 // Define o método pelo pelos primeiros caracteres =
SELECT ou select
1044 $type = substr($sql, 0, 6);
1045
1056 }
1057
1075 }
Capítulo 15 Construindo uma classe de acesso a dados - 157
1076
1078 /*
1079 * Método listar
1080 * Executa uma consulta na tabela, podendo:
1081 * - Recebe (opcionalmente) filtro em formato SQL
1082 * - Recebe (opcionalmente) ordem em formato SQL
1083 * - Recebe (opcionalmente) limite em formato MySQL
1084 * Retorna um objeto com o resultado da consulta
1085 */
1086 public function listar ($filtro=null, $ordem=null,
Capítulo 15 Construindo uma classe de acesso a dados - 158
$limite=null){
1087
1104 /*
1105 * Método listarPorChave
1106 * Executa uma consulta filtrando pela chave primária da
tabela
1107 * Recebe um valor que é um id de um registro
1108 * Retorna um objeto com o registro
1109 */
1110 public function listarPorChave ($chave){
1111
1119 /*
1120 * Método excluir
1121 * Exclui um registro filtrando pela chave primária da
tabela
1122 * Recebe um id de um registro
1123 * Retorna um objeto com o resultado
1124 */
1125 public function excluir ($chave){
1126 // Monta consulta concatenando tabela, campo que é chave
primária e o valor enviado
1127 $sql = "DELETE FROM " . $this->tabela . "
1128 WHERE " . $this->chavePrimaria . " = '$chave'";
1129
1139 /*
1140 * Método inserir
1141 * Insere um registro
1142 * Recebe um array que contém itens no formato $campo =>
$valor
1143 * (um $_POST de formulário é uma boa opção)
1144 * Retorna um objeto com o resultado
1145 */
1146 public function inserir ($dados){
1147
1168 }
1169
1184 }
1185
• Para evitar falha por tentativa de utilizar o foreach em uma string (pois tem
que receber um array) então capturou-se uma exceção com o try...catch
entre as linhas 10 e 30;
• Linha 10: teste lógico com o is_array negado (!) para verificar se a variável
enviada $dados é realmente um array, se não for dispara uma exceção;
• Linha 37: o "pulo do gato" do método, varre o array com dados e concatena
separadamente o nome do campo e o valor, para montar as duas partes do
INSERT;
• Linhas 49 e 50: com o substr retira-se a vírgula excedente na lista de
campos e valores;
Colocar todos valores entre aspas simples funciona no MySQL mas pode
causar erro em outros bancos de dados. Isto limita seu uso a este banco.
Para não tornar o exemplo extenso, não se fez um tratamento desta
situação.
O ideal seria testar com switch o driver de banco de dados utilizado (por
exemplo checando a variável $bdconfig['driver'] ou então com o método
self::$conexao->getAttribute(PDO::ATTR_DRIVER_NAME)) e realizar a
sintaxe adequada.
1194 /*
1195 * Método atualizar
1196 * Atualiza um registro filtrando pela chave primária
Capítulo 15 Construindo uma classe de acesso a dados - 164
1224 }
1225
1228
1237 }
1238
Boa parte do trabalho "braçal" numa aplicação é CRUD. Por isto, nossa classe
tabela foi criada para facilitar a geração de um CRUD
Esta parte é bastante mecânica, pois o trabalho "bruto" foi feito pela classe
Tabela. Se não formos utilizar legendas, a criação de classes filhas é muito simples,
bastando extender a classe Tabela e informar os atributos $tabela e
$chavePrimaria:
1249 <?php
1250 class Categoria extends Tabela {
1251 protected $tabela = 'categoria';
1252 protected $chavePrimaria = 'id';
1253 }
1254 ?>
1255 <?php
1256
Uma das características da Herança é que permite que uma classe filha tenha
novos métodos, utilizando-se das facilidade da classe pai.
1271 }
Que nada mais faz que executar o método listar com um parâmetro para para
ordenação.
Capítulo 15 Construindo uma classe de acesso a dados - 168
http://localhost/livraria/intro
1272 <?php
1273 /*
1274 index.php
1275 Lista Categorias
1276 */
1277
1319 }
1320
1322 <?php
1323 /*
1324 editarCategoria.php
1325 Exibe registro para edição
1326 Realiza atualização em Banco
1327 */
1328
1349 } else {
Capítulo 15 Construindo uma classe de acesso a dados - 171
1350
1355 }
1356
1357 } else {
1358
1363 }
1364
1386
1392 <?php
1393 /*
1394 inserirCategoria.php
1395 Insere um novo registro em Banco
1396 */
1397
1413
1414 } else {
1415
1420 }
1421
1422 } else {
1423
1424 ?>
1425 <form action="inserirCategoria.php" method="post" >
1426 Descrição: <input type="text" name="descricao" value=""
/><br/>
1427 <button type="submit">Salvar</button>
1428 </form>
1429
1430 <?php
1431 }
Arquivo /var/www/livraria/intro/excluirCategoria.php ;
1432 <?php
1433 /*
1434 excluirCategoria.php
1435 Exclui um registro
1436 */
1437
1442
1452 } else {
1453
1458 }
1459
1460 } else {
1461
1473 }
Capítulo 15 Construindo uma classe de acesso a dados - 175
Capítulo 16
Template
16.1. Objetivo
Algumas destas ferramentas criam até uma linguagem própria para gerenciar
a lógica de apresentação.
Sua lógica é ter um diretório (templates) com arquivos HTML que contém
códigos de partes "lógicas" da página (cabecalho, rodape, menu, etc). O conteúdo
dinâmico é incluído com uso de um padrão de substituição: "variáveis" em formato
%VARIAVEL%.
Existe uma limitação: algumas ações como loops e condições não podem ser
incluídas no template. Mas o objetivo não é criar um sistema perfeito e sim exercitar
nosso conhecimento adquirido.
Capítulo 16 Separando HTML do PHP: Classe Template - 177
1475 <?php
1476 /*
1477 Classe Template
1478 Responsável pela parte visual do sistema
1479 */
1480
1485 /*
1486 * pegarArquivo
1487 * Pega um arquivo e faz a substituição de seu parâmetros
1488 * Método estático e privado, só pode ser utilizado
1489 * por outros métodos
1490 */
1491 static private function pegarArquivo($arquivo,
$parametros=array()) {
1492
1498 try {
1499
1516 } else {
1517
1532
1533 }
1534
1541 }
1542
1555 }
1556
1557 }
1558
1559
1560 /*
1561 * exibirArquivo
1562 * Pega e dá saída um arquivo
1563 */
1564 static public function exibirArquivo($arquivo,
$parametros=array()) {
1565
Capítulo 16 Separando HTML do PHP: Classe Template - 180
1568 }
1569 }
O código está comentado, mas vale ressaltar cuidados para evitar invasões,
em especial a retirada de carateres que possam montar um caminho forçado a um
arquivo que não esteja no diretório templates. Outra questão é a substituição das
variáveis do template, que é o "pulo do gato" da classe.
1573 <head>
1574 <title>Livraria do Tux</title>
Capítulo 16 Separando HTML do PHP: Classe Template - 181
1588 /*
1589 * cabecalhoAdmin
1590 */
1591 static public function gerarCabecalhoAdmin() {
1592
1597 }
Como todos os métodos são estáticos, é utilizada a palavra chave self seguida
do separador de escopo (::).
Capítulo 16 Separando HTML do PHP: Classe Template - 182
Template (templates/cabecalhoSite.html):
1601 <head>
1602 <title>Livraria do Tux</title>
1603 <link rel="stylesheet" type="text/css"
href="../style.css" />
1604 </head>
1605 <body>
1606
Neste template já temos duas variáveis a serem substituídas. Seu uso ficara
mais claro na construção do site público, mas seu método mostra como passar os
parâmetros para a exibição do template.
1622 /*
1623 * cabecalhoSite
Capítulo 16 Separando HTML do PHP: Classe Template - 183
1624 */
1625 static public function gerarCabecalhoSite() {
1626
1636 }
16.6. Rodapé
Template (templates/rodape.html):
No rodapé será exibido DEBUG do sistema, que terá tudo que for enviado
para a variável $DEBUG definida inicialmente no arquivo config.inc.php e as
variáveis superglobais do PHP que são importantes para debugar o sistema.
1647 (...)
1648
1658 (...)
1659 /*
1660 * rodape
1661 */
1662 static public function gerarRodape() {
1663
1670 }
Este método não faz utilização de templates, mas faz uma pequena abstração
de uma listagem dos registros de uma tabela. Isto só é possível porque as
informações sobre os campos e legendas estão disponíveis através das classes
extendidas de cada tabela.
Capítulo 16 Separando HTML do PHP: Classe Template - 185
1671 /*
1672 * método gerarTabela
1673 * Recebe o objeto Tabela, um resultado
1674 * e opcionalmente uma lista de campos para listar
1675 */
1676 static function gerarTabela($tabObj, $tabResult,
$campos=false) {
1677
1699 } else {
1700 // Não foi enviada lista de campos
1701 // Varrendo as legendas do objeto Tabela
1702 foreach ($tabObj->legendas as $campo) {
1703
1706 ';
1707 }
1708
1709 }
1710
1745 } else {
1746 // Não foi enviada lista de campos
1747 // Varrendo as campos do registro
1748 foreach ($tabLinha as $campo => $valor) {
1749
1756 }
1757
Para usar este método, segue o exemplo (que pode ser adaptado para
qualquer tabela):
1770 <?php
1771 include_once('../config.inc.php');
1772
Seu uso ficará mais evidente na montagem dos sites administrativo e público,
na continuidade do curso.
1790 /*
1791 * gerarMenuAdmin
1792 */
1793 static function gerarMenuAdmin () {
Capítulo 16 Separando HTML do PHP: Classe Template - 189
1794
1802 <h1>Administração</h1>
1803 <ul>
1804 <li><a href="livroListar.php">Listar Livros</a></li>
1805 <li><a href="livroInserir.php">Inserir Livro</a></li>
1806 <li><a href="categoriaListar.php">Listar Categorias</a></li>
1807 <li><a href="categoriaInserir.php">Inserir
Categoria</a></li>
1808 <li><a href="pedidoListar.php">Listar Pedidos</a></li>
1809 </ul>
1810 ';
1811 if(Seguranca::temPerfil('admin')) {
1812
1821 }
1822
1826 }
1827
Capítulo 16 Separando HTML do PHP: Classe Template - 190
1828 /*
1829 * gerarListaCategorias
1830 */
1831 static function gerarListaCategorias () {
1832
1855 }
1856
1857 /*
1858 * adminGerar
1859 */
1860 static public function gerarAdmin($conteudo='') {
1861
1862 self::gerarCabecalhoAdmin();
1863 echo self::gerarMenuAdmin();
Capítulo 16 Separando HTML do PHP: Classe Template - 191
1867 }
1868
1869 /*
1870 * siteGerar
1871 */
1872 static public function gerarSite($conteudo='') {
1873
1874 self::gerarCabecalhoSite();
1875 echo self::gerarListaCategorias();
1876 echo $conteudo;
1877 self::gerarRodape();
1878
1879 }
1880
1894 }
1895
1898
1911 }
1912
1913
1914 /*
1915 * gerarLogin
1916 */
1917 static public function gerarLogin($parametros) {
1918
1922 }
1923
1924
1925
1926 /*
1927 * método debug
1928
1929 */
1930 private static function debug () {
1931
Capítulo 16 Separando HTML do PHP: Classe Template - 193
1940 /*
1941 * gerarMenuAdmin
1942 */
1943 static function gerarMenuAdmin () {
1944
1952 <h1>Administração</h1>
1953 <ul>
1954 <li><a href="livroListar.php">Listar Livros</a></li>
1955 <li><a href="livroInserir.php">Inserir Livro</a></li>
1956 <li><a href="categoriaListar.php">Listar Categorias</a></li>
1957 <li><a href="categoriaInserir.php">Inserir
Categoria</a></li>
1958 <li><a href="pedidoListar.php">Listar Pedidos</a></li>
1959 </ul>
1960 ';
1961 if(Seguranca::temPerfil('admin')) {
1962
1965 <ul>
1966 <li><a href="usuarioListar.php">Listar Usuários</a></li>
1967 <li><a href="usuarioInserir.php">Inserir Usuário</a></li>
1968 </ul>
1969 ';
1970
1971 }
1972
1976 }
1977
1978 /*
1979 * gerarListaCategorias
1980 */
1981 static function gerarListaCategorias () {
1982
2001 </div>';
2002
2005 }
2006
2007 /*
2008 * adminGerar
2009 */
2010 static public function gerarAdmin($conteudo='') {
2011
2012 self::gerarCabecalhoAdmin();
2013 echo self::gerarMenuAdmin();
2014 echo $conteudo;
2015 self::gerarRodape();
2016
2017 }
2018
2019 /*
2020 * siteGerar
2021 */
2022 static public function gerarSite($conteudo='') {
2023
2024 self::gerarCabecalhoSite();
2025 echo self::gerarListaCategorias();
2026 echo $conteudo;
2027 self::gerarRodape();
2028
2029 }
2030
2044 }
2045
2061 }
2062
2063
2064 /*
2065 * gerarLogin
2066 */
2067 // Varrendo variável global com informações de debug
2068 foreach ($DEBUG as $chave => $valor) {
Capítulo 16 Separando HTML do PHP: Classe Template - 197
2069
2072 }
2073
2076 $conteudo .=
"<h1>SESSÃO</h1>\n<pre>".print_r($_SESSION,true)."</pre>";
2077
2078 $conteudo .=
"<h1>COOKIE</h1>\n<pre>".print_r($_COOKIE,true)."</pre>";
2079
2080 $conteudo .=
"<h1>POST</h1>\n<pre>".print_r($_POST,true)."</pre>";
2081
2082 $conteudo .=
"<h1>GET</h1>\n<pre>".print_r($_GET,true)."</pre>";
2083
2084 $conteudo .=
"<h1>FILES</h1>\n<pre>".print_r($_FILES,true)."</pre>";
2085
2091 }
16.8.1. templates/login.html
1 <div id="login">
Capítulo 16 Separando HTML do PHP: Classe Template - 198
16.8.2. templates/livroResumo.html
1 <div class="resumolivro">
2 <img src="%IMAGEM%">
3 <h3>
4 <a href="verLivro.php?livroid=%LIVROID%">
5 %TITULO%
6 </a>
7 </h3>
8 <h4>%AUTOR%</h4>
9 <h5>%PRECO%</h5>
10 <a href="verLivro.php?livroid=%LIVROID%">ver
Capítulo 16 Separando HTML do PHP: Classe Template - 199
detalhes</a><br>
11 <a href="verCarrinho.php?livroid=%LIVROID%">adicionar ao
carrinho</a>
12 </div>
16.8.3. templates/livroDetalhe.html
1 <div class="resumolivro">
2 <img src="%IMAGEM%">
3 <h3>
4 <a href="verLivro.php?livroid=%LIVROID%">
5 %TITULO%
6 </a>
7 </h3>
8 <h4>%AUTOR%</h4>
9 <h5>%PRECO%</h5>
10 <p>%SUMARIO%</p>
11 <a href="verLivro.php?livroid=%LIVROID%">ver
detalhes</a><br>
12 <a href="verCarrinho.php?livroid=%LIVROID%">adicionar ao
carrinho</a>
13 </div>
Capítulo 17 Segurança: Sistema de Login - 200
Capítulo 17
17.1. Objetivo
• Filtrar injections.
Capítulo 17 Segurança: Sistema de Login - 201
14 <?php
15
16 class Seguranca {
17
18 /*
19 * método autenticar
20 * Recebe usuário e senha e realiza autenticação
21 * Retorna true ou false
22 * Se for true, inicia sessão com dados do usuário
23 */
24 static public function autenticar($usuario, $senha) {
25
36 // Inicia sessão
37 session_start();
38
39 // Recupera o registro
40 $usuarioLogin = $usuario->fetchObject();
41
46 $_SESSION['perfil'] = $usuarioLogin->perfil;
47
48 // Retorna verdadeiro
49 return true;
50
51 } else {
52
58 // Retorna falso
59 return false;
60
61 }
62
63 }
64 /*
65 * método estaConectado
66 * Testa se o usuário está conectado
67 * Se não estiver, destrói sessão e
68 * envia para tela de login
69 */
70 static public function estaConectado() {
71
81 header('Location:login.php');
82
83 }
84
85 }
86
87
88
89
90
91 /*
92 * método temPerfil
93 * Checa se usuário está no perfil solicitado
94 * ou numa lista de perfis(em array)
95 */
96
109 } else {
110
114 }
115
116 }
117 /*
Capítulo 17 Segurança: Sistema de Login - 204
135 }
136
137 }
138
139 }
17.2.1. login.php
140 <?php
141
158 } else {
159
169 }
170
171 }
172
17.2.2. logout.php
180 <?php
181
188 <?php
189
REFERÊNCIAS
BIBLIOGRÁFICAS
Capítulo 17 Segurança: Sistema de Login - 208
<html>
<!-- Comentário: cabeçalho da página -->
<head>
<!-- Comentário: título da página no navegador -->
<title>
Título da Página
</title>
<!-- Comentário: inclusão da folha de estilos CSS -->
<style type="text/css">estilo.css</style>
</head>
<!-- Comentário: corpo da página -->
<body>
Corpo da página
</body>
</html>
HTML/XHTML - Referência Básica - 211
Tags de Texto
Listas
Listas de definição
<dl>
<dt>Homossexual</dt>
<dd>Sabão em pó para lavar os órgão genitais</dd>
<dt>Promoção</dt>
<dd>Algo para um cara grande (feminino diminutivo: pra
HTML/XHTML - Referência Básica - 212
mocinha)</dd>
</dl>
Imagens
Tabelas
<table>
<caption>Título da tabela (XHTML)</caption>
<!-- Comentário: thead é cabeçalho da tabela -->
<thead>
<tr>
<th>Nome</th>
<th>Idade</th>
<th>Local</th>
</thead>
<!--
Comentário: tfoot é cabeçalho da tabela,
será exibido no final da tabela -->
<tfoot>
<!--
Comentário: colspan é um atributo que diz que esta coluna
tera tamanho de "x" colunas
-->
<td colspan="3">Total de Pessoas: 03</td>
</tfoot>
<tbody>
HTML/XHTML - Referência Básica - 213
<tr>
<td>João Guedes</td>
<td>31</td>
<td>Santa Maria – RS</td>
</tr>
<tr>
<td>Mário Carvalho</td>
<td>28 anos</td>
<td>Salvador – BA</td>
</tr>
<tr>
<td>Cristiane Ramalho</td>
<td>23 anos</td>
<td>Barreiras – BA</td>
</tr>
</tbody>
</table>
Formulários
<br />
</fieldset>
<fieldset>
<legend>Um grupo para seleção</legend>
<fieldset>
<legend>Input Checkbox</legend>
<!--
Comentário: o atributo "name"
deve ser diferente para cada checkbox
-->
<input type="checkbox" name="seis" value="1" />
Marque este<br />
HTML/XHTML - Referência Básica - 215
<fieldset >
<legend>Input Radio</legend>
<!--
Comentário: o atributo "name" deve em cada input radio
do mesmo grupo
-->
<input type="radio" name="nove" value="1" />Marque este<br />
<input type="radio" name="nove" value="1" />Ou este<br />
<input type="radio" name="nove" value="1" />Ou este
</fieldset>
<fieldset >
<legend>Botões</legend>
<!--
Comentário: button tipo submit -
envio do formulário (XHTML)
-->
<button type="submit" name="dez">Enviar</button>
<!--
Comentário: button tipo reset -
limpar formulário (XHTML)
-->
<button type="reset" name="dez">Limpar</button>
<!--
Comentário: input tipo submit -
envio do formulário (HTML)
-->
<input type="submit" name="dez" value="Enviar" />
<!--
HTML/XHTML - Referência Básica - 216
</fieldset>
</form>
Enviando e-mails com o PHP - 217
Exemplo :
O PHP utiliza checagem de tipos dinâmica, ou seja, uma variável pode conter
valores de diferentes tipos em diferentes momentos da execução do script. Por este
motivo não é necessário declarar o tipo de uma variável para usá-la. O interpretador
PHP decidirá qual o tipo daquela variável, verificando o conteúdo em tempo de
execução.
• is_array()
• is_bool()
• is_float()
• is_integer()
Verificando o tipo de uma variável - 219
• is_null()
• is_numeric()
• is_object()
• is_resource()
• is_scalar()
• is_string()
A palavra mixed indica que a variável var pode ser de diversos tipos. E a
função pode retornar as seguintes strings: integer, double, string, array, object e
unknown type.
Dica: Nunca use gettype() para testar um certo tipo, a string devolvida
poderá sofrer alterações em uma versão futura. Ao invés, use as funções is_*.
Quando ocorrem determinadas operações (soma "+", por exemplo) entre dois
valores de tipos diferentes, o PHP converte o valor de um deles automaticamente
(coerção). Se o operando for uma variável, seu valor não será alterado.
199 <?php
200 $php = "1";// $php é a string "1"
201 $php = $php + 1; // $php é o integer 2
202 $php = $php + 3.7; // $php é o double 5
Verificando o tipo de uma variável - 220
Como podemos notar, o PHP converte string para integer ou float mantendo o
valor.
203 <?php
204 $php = 1 + "10.5";// $php == 11.5
205 echo '<p>' . $php . '</p>';
206 $php = 1 + "-1.3e3"; // $php == -1299
207 echo '<p>' . $php . '</p>';
208 $php = 1 + "teste10.5"; // $php == 1
209 echo '<p>' . $php . '</p>';
210 $php = 1 + "10testes"; // $php == 11
211 echo '<p>' . $php . '</p>';
212 $php = 1 + " 10testes";// $php == 11
213 echo '<p>' . $php . '</p>';
214 $php = 1 + "+ 10testes"; // $php == 1
215 echo '<p>' . $php . '</p>';
216 $php = 1 + "- 10testes"; // $php == 1
217 ?>
Verificando o tipo de uma variável - 221
Exemplo:
218 <?php
219 $php = 15; // $php é integer (15)
220 $php = (double) $php;// $php é double (15.0)
221 $php = 3.9; // $php é double (3.9)
222 $php = (int) $php;// $php é integer (3)
223 // o valor decimal é truncado
224 ?>
A função settype() converte uma variável para o tipo especificado, que pode
ser "integer", "double", "string", "array" ou "object".
Exemplo:
225 <?php
226 $php = 15; // $php é integer
227 settype($php,double);// $php é double
Conexão segura - 222
Conexão segura
O site que implementamos, fora as funcionalidades que ainda faltam, não pode
ser utilizado para
# mkdir /root/ssl
Conexão segura - 223
# cd /root/ssl
# /usr/lib/ssl/misc/CA.sh -newca
Entretanto, o DNS irá resolver o nome acima para outro IP. Precisamos incluir
uma entrada no arquivo /etc/hosts:
# cd /root/ssl
# /usr/lib/ssl/misc/CA.sh -newreq
Assinando a certificação
Uma vez que a certificadora tem uma requisição, devemos então assiná-la.
Digitem o comando abaixo.
# /usr/lib/ssl/misc/CA.sh -sign
# a2ensite
Site name? livraria
# a2enmod ssl
For fim, habilite a porta de conexão segura 443. Adicione a seguinte linha ao
arquivo /etc/apache2/ports.conf :
Listen 443
/etc/init.d/apache2 restart
https://www.livraria.com.br
Capítulo 18
A certificação
• A prova:
▪ Múltipla-escolha
▪ Discursiva
▪ Somatória
Questionário ZEND(Inglês) - 227
4.
<?php
$a = array(
1 => 'red',
'green',
'blue',
'purple' => array(
'house' => 'dog',
'food' => 'meal',
'here' => 'gone',
'hello' => array(
5 => 'goodbye',
8 => 'something',
'correct')));
?>
Which of the following print statements will output the string
“correct”?
-print $a['purple][4][3];
-print $a['purple']['hello'][9];
-print $a[2][4][3];
-print $a[2][4][9];
-print $a[4]['hello'][9];
get_socket($host1, $port1),
‘data’ => str_pad(“”, 500000, “A”));
$write_map[] = array(‘fr’ => get_socket($host2, $port2),
‘data’ => str_pad(“”, 500000, “B”));
$write_map[] = array(‘fr’ => get_socket($host3, $port3),
‘data’ => str_pad(“”, 500000, “C”));
do {
$write_sockets = array();
foreach($write_map as $data) {
$write_sockets[] = $data['fr'];
}
$num_returned = stream_select($r = null, $write_sockets, $e =
null, 30);
if($num_returned) {
foreach($write_sockets as $fr) {
foreach($write_map as $index => $data) {
if($data['fr'] === $fr) {
$len = fwrite($fr, $data['buf']);
if($len) {
$data['buf'] = substr($data['buf'], $len);
if(empty($data['buf'])) {
fclose($data['fr']);
unset($write_map[$index]);
}
Questionário ZEND(Inglês) - 230
}
}
}
}
}
} while(??????????);
?>
-$num_returned > 0
-$len > 0
-!empty($data['buf'])
-count($write_sockets)
-count($write_map)
-/^[hp1-5]*\-.*/i
-/[hp1-5]*\-.?/
-/[hp][1-5]*\-.*/
-/[PhP]{3}[1-5]{2,3}\-.*$/
-/[a-z1-5\-]*/
Questionário ZEND(Inglês) - 231
final
protected
incomplete
abstract
implements
10
preg_split(“-=-”, $string);
explode(“-=-” $string);
-$dom->createTextNode(“Hello, World”);
-$dom->appendElement($title, “text”, “Hello, world!”);
-$dom->appendTextNode($title, “Hello, World!”);
-$dom->createElement(‘text’, “Hello, World”);
-None of the above
13. Implementing your own PDO class requires which steps from the
list below?(choose 3)
-As a list
-All of these uses are valid
-As a Lookup Table
-A Stack
-As a hash table
Questionário ZEND(Inglês) - 233
-$msg{$i}
-ord($msg);
-chr($msg);
-substr($msg, $i, 2);
19. In a situation where you want one and only one instance of a
particular object, the ________ design pattern should be used.
-safe_mode
-magic_quotes_gpc
-register_globals
-display_errors
-allow_url_fopen
-getString()
-__get()
Questionário ZEND(Inglês) - 235
-__value()
-__toString()
-__getString()
-mirror()
-strtoupper()
-toupper()
-str_reverse()
-strrev()
24. When embedding PHP into XML documents, what must you ensure
is true in order for things to function properly?