SELECT * FROM user_info WHERE name = '$username' AND password = '$userpass';

のように入力を受け付けたときに、

SELECT * FROM user_info WHERE name = 'user1' AND password = '' OR 'A' = 'A';

のようなSQL文を生成し、不正なログインなどをするSQLインジェクションに対し、このケースの場合

$sql = "SELECT * FROM user_info WHERE name= :username AND password= :pass";
$stmt = $dbh->prepare($sql);
        $stmt->bindValue(':username',$username,PDO::PARAM_STR);
        $stmt->bindValue(':pass',$password,PDO::PARAM_STR);
        $stmt->execute();

とプレースホルダを用いて対策できる。bindValue()の返り値がboolなのに最初混乱した。注意が必要。

関連記事