Stai facendo troppo in realtà:
$query = $dbh->prepare("SELECT * FROM students");
$query->execute();
$result = $dbh->query($query);
La linea problematica è:
$result = $dbh->query($query);
Verificare con http://php.net/pdo.query
, il parametro è una stringa, in realtà la stringa SQL che usi già sopra, non il valore del risultato di un PDO::prepare()
chiama.
Per la tua semplice domanda puoi semplicemente fare:
$result = $dbh->query("SELECT * FROM students");
Oppure se ti piace preparare:
$query = $dbh->prepare("SELECT * FROM students");
$query->execute();
$result = $query;
Il secondo è un po' standard se vuoi inserire variabili nella query, ecco perché lo prepari.
Il prossimo problema riguarda il foreach
riga:
foreach($result as $row);
Stai terminando il ciclo immediatamente a causa del punto e virgola ;
alla fine. Rimuovi quel punto e virgola in modo che il seguente blocco di codice tra parentesi angolari diventi il corpo del ciclo foreach.