Melhores práticas para escrever consultas SQL procedurais

Se alguma forma de PDO ou instruções preparadas não estiverem disponíveis e você não conseguir escrever consultas SQL brutas procedurais, existem algumas práticas recomendadas que ajudam a tornar seu código legível e legível. Não existe uma solução certa, mas normalmente um tamanho serve para a maioria.

Algumas coisas para ter em mente:

  • Seja consistente, mesmo se você estiver sozinho e especialmente se você estiver em uma organização. Você não tem que fazer exatamente dessa maneira, mas seja qual for a maneira que você fizer, mantenha-se fiel. Os padrões existem por uma razão.
  • Se você não precisa criar um apelido, não faça. Nada significa ofuscação como t1, t2, etc. Se você TEM que usar um atalho (como encurtar nomes de tabelas), torne-o legível.
  • Evite recuar o SQL real. Você passará mais tempo brincando com o recuo do que escrevendo código funcional.

Por exemplo:

$sql_query .= '(AND you = "winner") ';

vs.

$sql_query .= '           (AND you = "winner") ';
  • Tente ter um pedaço de lógica por linha. Se você tentar empinar tudo em uma linha, diffs não descreverá claramente o que mudou, você quebrará quaisquer comprimentos de linha padrão de codificação que possam existir, você tem que rolar para editar, você não pode ver tudo de uma vez, etc. Exceção – JOIN instruções que incluem on-line ON são geralmente mais fáceis de ler.
  • Capitalize verbos. Não há diferença funcional, mas é um ótimo indicador visual de que você está fazendo algo, não trabalhando com um campo.
  • Evite SELECT * – você deve sempre saber exatamente o que está comprando, não apenas tentando enfiar a mão em uma mangueira de incêndio e esperar que tudo esteja lá.
  • Não LEFT JOIN a menos que você precise de coisas de ambas as tabelas que não correspondem
  • Evite sintaxe implícita – mantenha a lógica JOIN junta para que você não precise procurar o WHERE correspondente.

Por exemplo:

FROM books
INNER JOIN authors ON books
.author_id = authors.author_id
WHERE authors
.author_name = ...

vs.

FROM books, authors WHERE books.author_id = authors.author_id AND authors.author_name = ...
  • Termine cada linha com um espaço antes da citação final. Dessa forma, se você recortar e colar o código, não precisará se preocupar com diferenças de espaçamento.
  • Um espaço após cada vírgula ajuda na legibilidade.
  • Sempre use aspas simples para que você possa usar aspas duplas no interior. Isso em parte porque …
  • Não use variáveis ​​de expansão (“WHERE id = $ id”), é desleixado e pode levar a problemas de segurança se você esquecer de colocar a variável entre aspas correspondentes.
  • Não confie nos dados de ninguém – inclusive você. Fuja e nunca assuma.
  • Use um nome de variável consistente, como $ sql_query, para que fique claro qual é o conteúdo. $ q e outras variáveis ​​de uma letra são difíceis de ler.

Aqui está um exemplo, que para fins de demonstração estou agindo como se $ author_name tivesse sido escapado corretamente.

Padronizado:

$sql_query = 'SELECT books.book_name ';
$sql_query
.= 'FROM books ';
$sql_query
.= 'INNER JOIN authors ON books.author_id = authors.author_id ';
$sql_query
.= 'WHERE authors.author_name = "' . $author_name . '" ';
$sql_query
.= 'ORDER BY book_name ASC ';

Em contraste:

$q = "select t1.book_name as name from books as t1,authors as t2 where author_name='$author_name' and t1.book_id=t2.book_id order by name asc";

Eles são basicamente equivalentes funcionalmente, mas a abordagem padronizada é muito mais fácil de ler e manter, na minha opinião.

Novamente, não existe uma resposta ou abordagem certa, mas, pela minha experiência, a aplicação desses valores funcionou muito bem para mim e para as equipes com as quais trabalhei.