<?phptry { $db = new PDO("mysql:host=localhost;dbname=mtest;charset=utf8", 'root', 'root'); $db -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $db -> prepare("select * from zhuru where _id=:usid "); $usid = '1001 and 1=0'; $stmt->bindParam(':usid',$usid,PDO::PARAM_INT); $exer = $stmt -> execute(); while ($rows = $stmt -> fetch(PDO::FETCH_ASSOC)) { echo $rows['username'].'------' . $rows['nickname'].'<br><br>'; } $db = null;} catch(PDOException $e) { echo $e -> getMessage();}
select * from zhuru where _id=:usid
実際の実行は
select * from zhuru where _id='1001 and 1=0'
条件を満たすことは不可能です
控えめに言っても、一重引用符を追加しなくても、実行は
select * from zhuru where _id=1001 and 1=0
1=0 は常に false となり、式は成立しません。
問題は、_id=1001 のユーザーの情報が照会されることです。
select * from zhuru where _id=:usid
実際の実行は
select * from zhuru where _id='1001 and 1=0'
を満たすことは不可能です条件
一歩戻ると、一重引用符を追加しなくても、実行は
select * from zhuru where _id=1001 and 1=0
1=0 は常にfalse の場合、式は確立されません。当然、
実際に実行されるのは
select * from zhuru where _id='1001 and 1=0'
_id は int 型なので '1001 and 1=0' は値に変換されます条件が満たされている
実際の実行は
select * from zhuru where _id='1001 and 1=0'
_id が int 型であるため、 ' 1001 と 1=0' は に変換されます。 値は 1001 であり、条件を満たします