# Cheat sheet

Regras para prever HTML, CSS, PHP, JavaScript, HTTP, segurança, regex e XPath.

Página: https://resumos.rgo.pt/cadeiras/ltw/folha-consulta/

Confirma primeiro o contexto: árvore HTML, nível da cascata, tipo da entrada, ordem dos callbacks ou nó XPath. As ligações levam à explicação de cada regra.

## HTML: o que o pedido contém

| Dado | Para onde vai |
| --- | --- |
| `id` | À `label` (`for`), nunca ao pedido |
| `name` | Ao pedido, como nome do parâmetro |
| Sem `name`, `disabled`, checkbox por marcar | Não viaja |
| `readonly`, checkbox marcada, botão usado | Viaja (marcada sem `value`: `on`) |
| Fragmento `#...` | Fica no navegador |

[Formulários](https://resumos.rgo.pt/cadeiras/ltw/html-estrutura/#formul%C3%A1rios-e-dados-enviados) · POST não cifra; o servidor valida tudo de novo. Tabela usa `th` com `scope`; `rowspan`/`colspan` ocupam posições que não se repetem.

## CSS: especificidade e caixa

Ordem de decisão: origem e importância, camadas, especificidade `(ID, classes, elementos)`, posição. Herança decide-se à parte: declaração no filho vence a herdada.

| Caso | Regra |
| --- | --- |
| 1 ID contra 10 classes | Ganha o ID |
| `:where` | Vale 0 |
| `!important`, estilo em linha | Mudam importância/nível, não especificidade |
| `content-box` / `border-box` | `width` exclui / inclui padding e borda; margem sempre fora |
| `em` / `rem` | Próprio elemento ou pai / raiz |
| `relative` / `absolute`+`fixed` / `sticky` | Conserva lugar / sai do fluxo / prende no scroll |
| `fr` | Reparte o que sobra após fixos e gaps; item em span inclui gaps interiores |

[Seletores](https://resumos.rgo.pt/cadeiras/ltw/css-estilo-layout/#seletores) · [Cascata](https://resumos.rgo.pt/cadeiras/ltw/css-estilo-layout/#cascata-e-heran%C3%A7a) · [Caixa](https://resumos.rgo.pt/cadeiras/ltw/css-estilo-layout/#medidas-e-modelo-de-caixa) · [Fr](https://resumos.rgo.pt/cadeiras/ltw/css-estilo-layout/#repartir-o-espa%C3%A7o-com-fr)

## PHP: fronteira e persistência

| Entrada | Verificação |
| --- | --- |
| Ausente, string com lixo, array | Rejeita antes de converter (`is_string`, inteiro completo, limites) |
| `$_POST` | Só corpos de formulário; JSON lê-se em `php://input` |
| Coluna de ordenação | Lista fixa de nomes; marcador é só valor |
| Stock concorrente | `UPDATE ... WHERE stock >= :q` + `rowCount`, em transação com `commit`/`rollback` |

`intval('2x')` dá 2: converter não valida. `header` antes de saída + `exit`; após POST, 303 para GET. `password_hash` / `password_verify`; sessão regenerada ao autenticar; dono verificado em cada ação a partir de `$_SESSION`.

[Pedir](https://resumos.rgo.pt/cadeiras/ltw/php-dinamicas-bd/#receber-um-pedido) · [PDO](https://resumos.rgo.pt/cadeiras/ltw/php-dinamicas-bd/#sqlite-e-consultas-preparadas) · [Transação](https://resumos.rgo.pt/cadeiras/ltw/php-dinamicas-bd/#alterar-dados-de-forma-consistente) · [Sessão](https://resumos.rgo.pt/cadeiras/ltw/php-dinamicas-bd/#sess%C3%B5es-e-autentica%C3%A7%C3%A3o) · [Âmbito](https://resumos.rgo.pt/cadeiras/ltw/php-dinamicas-bd/#%C3%A2mbito-global-e-captura-de-uma-vari%C3%A1vel) · [Foreach com `&`: `unset($v)` após o ciclo](https://resumos.rgo.pt/cadeiras/ltw/php-dinamicas-bd/#terminar-uma-refer%C3%AAncia-de-foreach)

## JavaScript: valores e eventos

`+` concatena, `-` numericiza; `??` só para `null`/`undefined`, `||` para falsos. `map`/`filter` criam, `forEach` devolve `undefined`, `sort` altera (números: `(a,b) => a-b` sobre cópia). `[1] === [1]` é falso.

Closure guarda o ambiente de criação; `this` normal depende da chamada; arrow herda. `target` é a origem, `currentTarget` o listener em execução; delegação via `closest` serve itens futuros. `preventDefault` trava a ação, `stopPropagation` o percurso. Cada `bind` é função nova: guarda-a para remover, com igual tipo e captura. `textContent` para texto; `innerHTML` nunca com entrada.

[Tipos](https://resumos.rgo.pt/cadeiras/ltw/javascript-dom-eventos/#tipos-e-convers%C3%B5es) · [Eventos](https://resumos.rgo.pt/cadeiras/ltw/javascript-dom-eventos/#eventos-e-delega%C3%A7%C3%A3o) · [Remover listener](https://resumos.rgo.pt/cadeiras/ltw/javascript-dom-eventos/#guardar-a-fun%C3%A7%C3%A3o-que-foi-registada)

## HTTP: método, estado e origem

GET/HEAD/OPTIONS seguros e idempotentes; PUT/DELETE idempotentes; POST em geral não. Efeito igual, resposta pode diferir. `Accept` pede, `Content-Type` descreve. 201 criado, 204 sem corpo, 303 por GET, 304 cache válida, 400/401/403/404/405/500.

`fetch` resolve com 404: testa `ok`. `json()` é assíncrono. Parâmetros com `URLSearchParams`; respostas fora de ordem pedem contador ou `AbortController`. POST JSON entre origens exige preflight OPTIONS; a resposta real também autoriza a origem. Credenciais pedem origem concreta, nunca `*`.

[Métodos](https://resumos.rgo.pt/cadeiras/ltw/http-ajax-json/#m%C3%A9todos-seguran%C3%A7a-e-idempot%C3%AAncia) · [Mensagens](https://resumos.rgo.pt/cadeiras/ltw/http-ajax-json/#ler-mensagens) · [Fetch](https://resumos.rgo.pt/cadeiras/ltw/http-ajax-json/#json-e-fetch) · [CORS](https://resumos.rgo.pt/cadeiras/ltw/http-ajax-json/#sop-e-cors)

## Segurança: cada risco, a sua defesa

SQL preparado para valores; escape do contexto de saída; token CSRF não vazio com `hash_equals`; autorização no registo com o utilizador da sessão; caminhos de mapa fixo fora da raiz pública; HTTPS só no transporte. `HttpOnly` esconde o cookie, não trava pedidos. Salt público não salva palavra-passe fraca.

[Injeção](https://resumos.rgo.pt/cadeiras/ltw/seguranca-web/#inje%C3%A7%C3%A3o-sql) · [XSS](https://resumos.rgo.pt/cadeiras/ltw/seguranca-web/#xss-e-contexto-de-sa%C3%ADda) · [CSRF](https://resumos.rgo.pt/cadeiras/ltw/seguranca-web/#csrf) · [Autorização](https://resumos.rgo.pt/cadeiras/ltw/seguranca-web/#autentica%C3%A7%C3%A3o-e-autoriza%C3%A7%C3%A3o) · [Palavras-passe](https://resumos.rgo.pt/cadeiras/ltw/seguranca-web/#palavras-passe-e-sess%C3%A3o) · [Percurso de revisão](https://resumos.rgo.pt/cadeiras/ltw/seguranca-web/#https-e-revis%C3%A3o-de-uma-a%C3%A7%C3%A3o)

## Regex e XPath: âncoras e alcance

`ab+` repete `b`; `(ab)+` o par; `^A|B$` prende cada lado; `^(?:A|B)$` prende ambas. Guloso consome o máximo, preguiçoso o mínimo; classe negada nunca atravessa o delimitador. `\1` repete a captura; `g` guarda `lastIndex` em JS; PCRE usa `\A...\z`; `pattern` testa o valor completo e o servidor valida de novo.

XPath: `/` raiz e filhos, `//` descendentes, `@` atributos, `text()` texto, posições desde 1. `[f][1]` filtra e escolhe; `[1][f]` escolhe e testa. `//livro[1]` por grupo, `(//livro)[1]` global. `!=` com vários nós pede `not(x = ...)`. Sem prefixo só há namespace vazio: regista prefixo para o URI.

[Peças](https://resumos.rgo.pt/cadeiras/ltw/expressoes-regulares/#pe%C3%A7as-e-preced%C3%AAncia) · [Motores](https://resumos.rgo.pt/cadeiras/ltw/expressoes-regulares/#javascript-php-e-html) · [Caminhos](https://resumos.rgo.pt/cadeiras/ltw/xml-xpath/#caminhos-xpath) · [Predicados](https://resumos.rgo.pt/cadeiras/ltw/xml-xpath/#predicados-e-posi%C3%A7%C3%A3o)
