Você está fazendo muito, na verdade:
$query = $dbh->prepare("SELECT * FROM students");
$query->execute();
$result = $dbh->query($query);
A linha problemática é:
$result = $dbh->query($query);
Verifique com http://php.net/pdo.query , o parâmetro é uma string, na verdade a string SQL que você já usou acima, não o valor do resultado de um
PDO::prepare()
ligar. Para sua consulta simples, você pode apenas fazer:
$result = $dbh->query("SELECT * FROM students");
Ou se você gosta de preparar:
$query = $dbh->prepare("SELECT * FROM students");
$query->execute();
$result = $query;
O mais tarde é um clichê se você quiser inserir variáveis na consulta, é por isso que você a prepara.
O próximo problema é com o
foreach
linha:foreach($result as $row);
Você está terminando o loop imediatamente por causa do ponto e vírgula
;
no final. Remova esse ponto e vírgula para que o seguinte bloco de código entre colchetes angulares se torne o corpo do loop foreach.