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'].'
';}$db = null;} catch(PDOException $e) {echo $e -> getMessage();}
這段代碼為什麼能查詢出_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 恒為假,運算式不會成立,自然也就找不到
問題是查詢到了_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 恒為假,運算式不會成立,自然也就找不到
執行的時候查詢到了_id=1001的使用者的資訊。
實際執行的是
select * from zhuru where _id='1001 and 1=0'
因為 _id 是 int 類型,'1001 and 1=0' 轉換為數值是 1001,可以滿足條件
實際執行的是
select * from zhuru where _id='1001 and 1=0'
因為 _id 是 int 類型,'1001 and 1=0' 轉換為數值是 1001,可以滿足條件
怎麼解決這個問題?
$db -> prepare("select * from zhuru where _id=:usid ");
:usid加單引號會什麼都查不到,即使$usid=1001;