Estás haciendo demasiado en realidad:
$query = $dbh->prepare("SELECT * FROM students");
$query->execute();
$result = $dbh->query($query);
La línea problemática es:
$result = $dbh->query($query);
Verifique con http://php.net/pdo.query
, el parámetro es una cadena, en realidad la cadena SQL que ya usa arriba, no el valor del resultado de un PDO::prepare()
llamar.
Para su consulta simple, simplemente puede hacer:
$result = $dbh->query("SELECT * FROM students");
O si te gusta preparar:
$query = $dbh->prepare("SELECT * FROM students");
$query->execute();
$result = $query;
El último es un modelo si desea insertar variables en la consulta, es por eso que lo prepara.
El siguiente problema es con el foreach
línea:
foreach($result as $row);
Está terminando el ciclo inmediatamente debido al punto y coma ;
al final. Elimine ese punto y coma para que el siguiente bloque de código entre paréntesis angulares se convierta en el cuerpo del bucle foreach.