1
resposta

Qual a maneira correta e executar a Query?

As duas maneiras abaixo geram o mesmo resultado, mas gostaria de saber se existe uma diferença técnica e os porques, se puderem me ajudar. CÓDIGO 01: A maneira que o Vinicius ensina. CÓDIGO 02: Essa é a maneira que geralmente faço, e se for muito ruim a lógica, posso mudar, mas gostaria de saber os porques.

CÓDIGO 01: $videosList = $con->query('SELECT * FROM videos;')->fetchAll(PDO::FETCH_ASSOC);

CÓDIGO 02: $querySelect = 'SELECT * FROM videos;'; $stmt = $con->prepare($querySelect); $stmt->execute(); $videosList = $stmt->fetchAll(PDO::FETCH_ASSOC);

1 resposta

Olá, Tiago, tudo bem?

Geralmente utilizamos o método query quando não desejamos passar argumentos para uma instrução SQL, em outras palavras esta consulta SQL é executada imediatamente.

O exemplo abaixo foi realizado pelo Vinicius na aula, e o objetivo dessa instrução é apenas buscar no banco de dados todos os vídeos, ou seja, essa é uma SQL definida de forma fixa, ela não precisa de tratamento, modificação e mudança durante a execução.

$con->query('SELECT * FROM videos;')->fetchAll(PDO::FETCH_ASSOC);

Entretanto, imagine que surgiu a necessidade de nós buscarmos as informações de apenas 1 video, para isso nós devemos passar como argumento o id do video que desejamos as informações.

Para este caso, se deparamos com uma instrução SQL dinâmica, que são construídas em tempo de execução, ou seja, precisamos que o usuário informe qual video ele deseja, e essa informação, geralmente vem de formulários. Porém, como essa é uma informação que vem do usuário, devemos tomar cuidado para evitar problemas de segurança como o SQL Injection.

E para evitar este tipo de falha de segurança utilizaremos o método prepare que inclui e relaciona um ou mais parâmetros na instrução SQL através do caractere de ponto de interrogação (?), conforme o exemplo a seguir:

$id = 5; // imagine que este valor veio de um formulário
$sql = "SELECT * FROM videos WHERE id = ?";
$statement = $pdo->prepare($sql);
$statement->bindValue(1,$id);
$statement->execute();


$result = $statement->fetch(PDO::FETCH_ASSOC);

Quando a gente utiliza o método bindValue, por baixo dos panos, será realizado diversas verificações no conteúdo da variável $id, para que ela não cause danos no nosso sistema, e só podemos utilizar esse método bindValue através do método prepare.

Recapitulando:

  • query: Usaremos em instruções SQL estáticas, ou seja, quando não precisamos passar algum argumento para a instrução.
  • prepare: Usaremos em instruções SQL dinâmicas, ou seja, quando precisarmos passar algum argumento para a instrução.

Para auxiliar no seu aprendizado você pode fazer o curso de PHP e PDO:

Espero ter ajudado, Bons estudos =)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓