Questão nº 42
Questão de Tecnologia da Informação · FCC ALAP 2019 (nº 42)
Considere a função abaixo, existente em uma classe PHP de acesso a dados:
public function localizar($Usuario) {
try {
$c = new PDO("mysql:host=localhost;dbname=dados", "root", "");
$c->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$st = $c->prepare("SELECT * FROM Colaborador WHERE user=? AND password=?");
**I**
;
/*restante do código aqui */
} catch (PDOException $ex) {
return null;
}
}
Considerando que $Usuario é um objeto da classe Usuario, que possui os atributos User e Password e os respectivos métodos getter e setter, para executar a instrução SQL INSERT, a lacuna I acima deve ser preenchida corretamente com:
- A
$st->execute([$Usuario->User, $Usuario->Password])(alternativa correta) - B
$st->exec([$Usuario.getUser(),$Usuario.getPassword()]) - C
$c->execute([$st -> getUser($Usuario), $st -> getPassword($Usuario)) - D
$st->exec([$Usuario->getUser(),$Usuario ->getPassword()]) - E
$c->$st->execute([$Usuario(User), $Usuario(Password)])
Resposta comentada
Gabarito Alternativa A
Para executar uma consulta SQL com segurança e eficiência usando PDO, primeiro você prepara a instrução (criando um "molde" com prepare()) e depois a executa, passando os valores dos parâmetros separadamente. Isso evita ataques de injeção SQL.
-
(A) Correta:
$st->execute([$Usuario->User, $Usuario->Password])
Esta é a forma correta de executar uma instrução preparada ($sté o objetoPDOStatementretornado porprepare()). O métodoexecute()aceita um array de valores que serão ligados aos placeholders (os?) na ordem em que aparecem na consulta SQL. Assumindo queUserePasswordsão propriedades públicas do objeto$Usuario(ou acessíveis via__get), o acesso direto$Usuario->Useré válido. -
(B) Incorreta:
$st->exec([$Usuario.getUser(),$Usuario.getPassword()])
O métodoexec()pertence ao objetoPDO($c), não aoPDOStatement($st), e não é usado para executar instruções preparadas com parâmetros. Além disso, em PHP, o operador.é para concatenação de strings, não para chamar métodos de objeto (o correto é->). -
(C) Incorreta:
$c->execute([$st -> getUser($Usuario), $st -> getPassword($Usuario))
O métodoexecute()pertence ao objetoPDOStatement($st), não ao objetoPDO($c). Adicionalmente,$st->getUser($Usuario)está incorreto, pois o objetoPDOStatementnão possui métodosgetUser()ougetPassword(), e esses métodos seriam chamados no objeto$Usuario, não no$st. -
(D) Incorreta:
$st->exec([$Usuario->getUser(),$Usuario ->getPassword()])
Armadilha da banca: Esta alternativa é tentadora porque usa a sintaxe correta para chamar os métodos getter ($Usuario->getUser()). No entanto, o erro está no uso do métodoexec(). Como explicado na alternativa B,exec()é do objetoPDOe não é usado para executar instruções preparadas com parâmetros. O método correto para o objetoPDOStatement($st) éexecute(). -
(E) Incorreta:
$c->$st->execute([$Usuario(User), $Usuario(Password)])
A sintaxe$c->$st->execute()é completamente inválida em PHP para este contexto.$c->$sttentaria acessar uma propriedade chamada$stdentro do objeto$c, o que não faz sentido aqui. Da mesma forma,$Usuario(User)e$Usuario(Password)não são formas válidas de acessar propriedades ou chamar métodos em um objeto PHP.
Fonte: FCC ALAP 2019 Analista Legislativo - Desenvolvedor de Sistemas (Caderno Tipo 001). Reproduzida para fins de estudo.