PHP と MySQL を利用しています。

以下のようにユーザー入力値など外部からの文字列を使用して SQL クエリーを生成する場合、SQL インジェクションの危険性があります。

$dbh = new PDO('mysql:host=127.0.0.1;dbname=test', 'username', 'password');

$email = $_POST['email'];
$password = $_POST['password'];

// ユーザー入力値を利用して SQL 文を生成
$sql = "SELECT * FROM users WHERE email = '$email' AND password = '$password'";
$sth = $dbh->query($sql);

$userInfo = $sth->fetch(PDO::FETCH_ASSOC);
// ...

上記のようなコードは SQL インジェクションが行えてしまします。
例えば email' OR 1=1 -- が入力されると、以下の SQL が発行されて期待しない結果(例の場合、他人としてログインできる)になってしまいます。

SELECT * FROM users WHERE email = '' OR 1=1 -- ' AND password = ''

このような SQL インジェクション対策はどのように行うべきでしょうか?