Portanto, você tem uma resposta para a pergunta "Por que estou recebendo este erro", mas não obteve uma para a "consulta PDO abreviada".
Para isso, precisaremos de uma coisa chamada "programação".
Uma coisa interessante sobre programação é que não estamos limitados às ferramentas existentes, como em outras profissões. Com a programação, podemos sempre criar uma ferramenta própria e começar a usá-la em vez de um conjunto completo de ferramentas antigas.
E a Programação Orientada a Objetos é especialmente boa nisso, pois podemos pegar um objeto existente e apenas adicionar algumas funcionalidades, deixando o resto como está.
Por exemplo, imagine que queremos uma maneira abreviada de executar uma consulta preparada no PDO. Tudo o que precisamos é estender o objeto PDO com um novo método abreviado. A parte mais difícil é dar um nome ao novo método.
O resto é simples:você precisa apenas de algumas linhas de código
class MyPDO extends PDO
{
public function run($sql, $bind = NULL)
{
$stmt = $this->prepare($sql);
$stmt->execute($bind);
return $stmt;
}
}
Este é todo o código você precisa. Você pode armazená-lo no mesmo arquivo onde armazena suas credenciais de banco de dados. Observe que esta adição não afetará seu código existente de qualquer forma - permanece exatamente o mesmo e você pode continuar usando todas as funcionalidades PDO existentes como de costume.
Agora você tem que alterar apenas 2 letras no construtor PDO, chamando-o como
$conn = new MyPDO(...the rest is exactly the same...);
E imediatamente você pode começar a usar sua nova ferramenta brilhante:
$sql = "SELECT * FROM myTable WHERE id = :id";
$result = $conn->run($sql, ['id' => $id])->fetchAll(PDO::FETCH_ASSOC);
Ou, dando um pouco de otimização,
$result = $conn->run("SELECT * FROM myTable WHERE id = ?", [$id])->fetchAll();
como você sempre pode definir o modo de busca padrão uma vez por todas, e para apenas uma única variável não há uso para o espaço reservado nomeado. O que torna este código uma verdadeira abreviatura em comparação com a resposta aceita,
$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$stmt_test->execute([$id]);
$result = $stmt_test->fetchAll(PDO::FETCH_ASSOC);
e até mesmo para a melhor resposta que você tem até agora,
$result = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$result->execute([$id]);
sem falar que o último nem sempre é utilizável, pois serve apenas para obter um array. Enquanto com um real abreviado qualquer formato de resultado é possível:
$result = $conn->run($sql, [$id])->fetchAll(); // array
$result = $conn->run($sql, [$id])->fetch(); // single row
$result = $conn->run($sql, [$id])->fetchColumn(); // single value
$result = $conn->run($sql, [$id])->fetchAll(PDO::FETCH_*); // dozens of different formats