PHP e páginas dinâmicas com base de dados
Tipos, funções, pedidos, PDO, transações, templates, sessões e autenticação no servidor.
Fronteira do pedido
- PHP corre a cada pedido; o cliente recebe só a saída. Nada local persiste: estado fica na base de dados ou na sessão.
.concatena; aspas duplas interpolam, simples são mais literais.strlenconta bytes, não letras.===compara valor e tipo. Zero válido exige!== null:if ($nota)eemptyrejeitam 0.strposexige!== false, pois a posição 0 é válida.isseté falso para ausência ounull;array_key_existsdistingue chave presente comnull.sortrenumera,asortconserva chaves,ksortordena chaves.array_filterconserva chaves:array_valuesantes de emitir JSON como lista.strict_typessó regula chamadas escalares desse ficheiro. Não valida HTTP.$thisé o objeto;staticpertence à classe.throwinterrompe,catchtrata,finallyfinaliza.
| Origem | Leitura |
|---|---|
| Query | $_GET |
| Corpo de formulário | $_POST (mais nada: JSON não aparece aqui) |
| Corpo JSON | php://input com json_decode |
| Método | $_SERVER['REQUEST_METHOD'] |
- Entrada pode faltar ou ser array (
q[]=x). Exige método, confirmais_string, valida inteiro e limites, e só depois converte.intval('2x')dá 2: converter não é validar. Dinheiro exato usa cêntimos inteiros.
Base de dados
$stmt = $db->prepare('SELECT titulo, preco FROM livro WHERE preco < :limite');
$stmt->execute(['limite' => 20]);
$livros = $stmt->fetchAll(PDO::FETCH_ASSOC);
preparesepara valores do SQL;executefornece-os.fetchdá uma linha oufalse;fetchAlldá as restantes.- Marcador é valor, nunca coluna. Ordenação escolhida pelo cliente mapeia-se para nomes fixos.
LIKEcontinua a interpretar%e_. - Base em ficheiro persiste; fora da raiz pública, com caminho estável.
PRAGMA foreign_keys = ONpor conexão, quando as restrições importam.
Reserva consistente
beginTransaction.UPDATE ... SET stock = stock - :q WHERE id = :id AND stock >= :q; confirma que alterou uma linha.INSERTda reserva.commitsó no fim; em falha,rollbacke relança.
Condição no UPDATE fecha a janela entre ler e escrever. Transação não substitui autorização nem validação.
Responder e autenticar
- Página consulta e apresenta; ação valida, altera e redireciona. Template escapa ao apresentar:
htmlspecialchars($t, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'). header('Location: ...', true, 303)antes de qualquer saída, seguido deexit. 303 após POST evita repetir a submissão ao atualizar.- Registo:
password_hash($p, PASSWORD_DEFAULT). Login:password_verifycontra o resumo guardado,session_regenerate_id(true), guardautilizador_idna sessão. Autorização confirma o dono em cada ação; nunca vem de campo hidden. - Cookies:
HttpOnly,Secureem HTTPS,SameSiteadequado. Logout limpa estado, destrói a sessão e remove o cookie.
Âmbito: o que cada função vê
- Função nomeada não vê variáveis do ficheiro: passa por argumento ou declara
global. Superglobais ($_POST,$_SESSION) são a exceção. - Closure:
use ($x)congela o valor da criação;use (&$x)segue a variável. foreach ($a as &$v)deixa$vligada à última posição.unset($v)após o ciclo desfaz o vínculo sem apagar o elemento. Sem&, nada disto acontece.