Esse post mostra como o ChatGPT está longe de ser infalível e ainda precisa de alguém conferindo tudo que ele faz (de preferência, alguém que saiba o que está fazendo, em vez de aceitar cegamente tudo que ele responde).
O código que ele gerou é vulnerável a ataques de SQL injection. Afinal, em uma aplicação web espera-se que os ids do post e do usuário venham como parâmetros do request (seja POST ou GET). E concatenar parâmetros diretamente na query (ainda mais quando vem de fora da aplicação) é pedir pra tomar um SQL injection. Inclusive, na própria documentação tem um aviso sobre isso.
Uma solução melhor é usar bind_param
, consulte a documentação para mais detalhes. Por exemplo:
$stmt = $db->prepare('SELECT COUNT(*) as count FROM likes WHERE post_id=?');
if(!$stmt){
echo 'erro na consulta: '. $db->errno .' - '. $db->error;
}
$stmt->bind_param('i', $post_id);
$stmt->execute();
$stmt->bind_result($likes_count);
$stmt->fetch();
// mostrar o $likes_count, etc
Claro que uma validação evitaria o problema, mas outra vantagem é que acima usamos prepare
, e com isso as consultas preparadas são implementadas no lado do servidor do banco de dados. Com isso, o PHP manda somente os parâmetros a cada vez que a mesma consulta preparada é enviada para o servidor quando usa a mesma conexão persistente, mesmo que esteja atendendo uma requisição HTTP diferente. Ou mesmo se estiver executando em um loop, da segunda execução em diante ele só manda os parâmetros, reaproveitando o plano de execução da query.