Questão nº 42

Questão de Tecnologia da Informação · FCC ALAP 2019 (nº 42)

FCC2019Analista Legislativo - Desenvolvedor de SistemasTecnologia da Informação
Gabarito: Aver comentário ↓

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:

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 objeto PDOStatement retornado por prepare()). O método execute() aceita um array de valores que serão ligados aos placeholders (os ?) na ordem em que aparecem na consulta SQL. Assumindo que User e Password sã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étodo exec() pertence ao objeto PDO ($c), não ao PDOStatement ($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étodo execute() pertence ao objeto PDOStatement ($st), não ao objeto PDO ($c). Adicionalmente, $st->getUser($Usuario) está incorreto, pois o objeto PDOStatement não possui métodos getUser() ou getPassword(), 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étodo exec(). Como explicado na alternativa B, exec() é do objeto PDO e não é usado para executar instruções preparadas com parâmetros. O método correto para o objeto PDOStatement ($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->$st tentaria acessar uma propriedade chamada $st dentro 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.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho