php
1 $sql = "select * from user where email = :email limit 1";
$sqlに、SQL文字列を代入。
SQLの内容は以下。
userテーブルからemailの列が変数:emailと同じものだけを、取り出す。
ただし、上から1行だけ(limit 1)。
つまり、メールアドレスの重複があると結果が1行返ってくるようなSQLです。
php
1 $stmt = $dbh->prepare($sql);
先ほどのSQLを実行するためのオブジェクトを用意します。
php
1 $stmt->execute(array(":email" => $email));
先ほどの用意したオブジェクトに、変数:emailに$emailを代入して実行します。
php
1 $user = $stmt->fetch();
SQLの実行結果1行を$user変数に代入します。
結果がない場合は、falseを代入します。
php
1 return $user ? true : false;
$userに中身があった場合true、ない場合falseを返します。
php
1return (条件式)?(オブジェクト1):(オブジェクト2);
の表記は、
php
1if(条件式){
2 return (オブジェクト1)
3}else{
4 return (オブジェクト2)
5}
と同じ意味です。
前者のように、簡略化して書くことができるのです。
余談ですが、なぜ
php
1 $sql = "select * from user where email = ".$email." limit 1";
のように、文字列連結をしてSQLを生成しないのかというと、
こうすると$emailに不正なSQLが含まれていた場合に、
開発者の予期せぬ動作(バグ・脆弱性)を引き起こす可能性があるためです。
例えば、$emailに"x;SELECT password from user --"などと入力されると、
SQL全体では
SQL
1select * from user where email = x;SELECT password from user -- limit 1
となり、全く違う意味のSQLになります。
DELETEを使えば削除、UPDATEを使えば改ざんができるかもしれません。
これを、SQLインジェクション攻撃と呼びます。
余談でした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/15 09:33