すみません。
お蔭様でもうほぼ完成したんですが、どうしても解決しない所がありまして質問させてください。

$dbh = new PDO($dsn, $user, $password);

$dbh->query('SET NAMES utf8');

$sql = "select * from `user` where `id` = ? AND `pass` = ?";

$query = $dbh->prepare($sql);
$result = $query->execute(array($id,$pass));
$res = $result->fetchAll(PDO::FETCH_ASSOC);

ログインの部分で上のように記述すると

Fatal error: Call to a member function fetchAll() on a non-object in C:\xampp\htdocs\osusume\login_2.php on line 50

と出てしまいます。

$sqlを "select * from `user` where `id` = \"{$id}\" AND `pass` = \"{$pass}\"";


のように書くとログイン可能なんですが、これだと脆弱性が残る気がして不安です。
ちなみに$idと$passの箇所は

$id = htmlspecialchars($_POST[id],ENT_QUOTES);
$pass = htmlspecialchars($_POST[pass],ENT_QUOTES);

のように受け取っています。
何が駄目でエラーになってしまうのでしょうか?