ホームページ > バックエンド開発 > PHPチュートリアル > このコードはなぜ _id = 1001 のユーザー情報をクエリできるのでしょうか?

このコードはなぜ _id = 1001 のユーザー情報をクエリできるのでしょうか?

WBOY
リリース: 2016-06-20 12:31:03
オリジナル
1284 人が閲覧しました

<?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();}
ログイン後にコピー


なぜこのコードは _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 となり、式は成立しません。

問題は、_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 の場合、式は確立されません。当然、


を実行すると、_id=1001 のユーザーの情報は見つかりません。

実際に実行されるのは
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 であり、条件を満たします


この問題を解決するにはどうすればよいですか?
$db -> prepare("select * from zhuru where _id=:usid ");
: $usid=1001 であっても、usid は何も見つかりません。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート