Como lidar com strings complicadas no PHP
Imagine que você é um programador PHP e precisa fazer uma consulta no banco de dados com um monte de variáveis, você começa a escrever a declaração SQL e percebe que a string é muito complicada.
Pois é, essa é uma situação que passei recentemente e percebi que o código fica muito bagunçado, se você não souber concatenar as strings de um jeito mais limpo. Para você entender o drama, dê uma olhada no código abaixo:
<?php
public function insert(Bill $bill, int $user_id): bool
{
$link = $this->link;
$billetBanking = $link->real_escape_string($bill->getBilletBanking());
$sql =
'INSERT INTO `bill` (`description`, `price`, `expirationDate`, `barCode`, `billetBanking`, `paid`) ' .
"VALUES ('" .
$bill->getDescription() .
"', '" .
$bill->getPrice() .
"', '" .
$bill->getExpirationDate() .
"', '" .
$bill->getBarCode() .
"', " .
"'" .
$billetBanking .
"', CONV('0', 2, 10) + 0)";
$link->query($sql);
return $this->addRelation($user_id);
}
?>
Eu quero você repare na variável $sql, olhe quantas linhas, pontos, aspas
duplas e simples, eu tive que adicionar para formar a variável final. É uma
parte do código difícil de olhar, pois é um balaio de gato, até mesmo um espaço
fora do lugar poderia parar o sistema todo e mostrar um erro.
Se eu imprimisse a variável, ela ficaria assim:
INSERT INTO `bill` (
`description`,
`price`,
`expirationDate`,
`barCode`,
`billetBanking`,
`paid`)
VALUES (
'Conta de luz',
'220',
'2020-05-04',
NULL,
'um monte de dados binários aqui',
CONV (
'0', 2, 10) + 0);
Nada demais, esse era o resultado que eu queria chegar, porém como dizia o Robert C. Martin em seu livro Clean Code, “nenhuma parte do código deve ser ignorada”, então volta e meia eu teria que voltar nessa parte para fazer alguma manutenção.
Pois bem, o PHP processa todas as variáveis dentro de chaves {} em uma string, não é necessário fechar a string para adicionar o valor com um ponto.
Outra coisa que me ajudou, é que ao quebrar as linhas de uma string, o PHP não vai quebrar a linha no resultado final, para isso você tem que colocar “\n”. Se não colocar “\n”, o PHP vai ajuntar tudo em uma linha só.
Exemplo:
<?php
$msg = "
O
l
a
m
u
n
do";
echo $msg;
// Vai imprimir
// O l a m u n do
?>
No fim, a variável complicada ficou desse jeito aqui:
<?php
$sql = "INSERT INTO \`bill\` (\`description\`, \`price\`, \`expirationDate\`,
\`barCode\`, \`billetBanking\`, \`paid\`)
VALUES ('{$bill->getDescription()}', '{$bill->getPrice()}',
'{$bill->getExpirationDate()}', '{$bill->getBarCode()}', '{$billetBanking}',
CONV('0', 2, 10) + 0)";
Versus versão anterior:
<?php
$sql =
'INSERT INTO \`bill\` (\`description\`, \`price\`, \`expirationDate\`, \`barCode\`, \`billetBanking\`, \`paid\`) ' .
"VALUES ('" .
$bill->getDescription() .
"', '" .
$bill->getPrice() .
"', '" .
$bill->getExpirationDate() .
"', '" .
$bill->getBarCode() .
"', " .
"'" .
$billetBanking .
"', CONV('0', 2, 10) + 0)";
Com isso, eu evitei os problemas de concatenar strings com o ponto e todo aquele bolo de aspas duplas e simples.
Essa dica foi testada no PHP 7.3 no Debian Bullseye. Over and out!