2011-12-27 7 views
4

私はPDOには新しく、今朝その方向に向かうように言われています。だから、私を聞いてください。ログイン確認機能を標準mysql_query()からPDOのプリペイドド・ステートメントに書き直そうとしていますが、問題が発生しています。PDO prepared statement:実行する方法、影響を受ける行をチェックする、フィールドを取得する

関数loginCheck()は、指定された電子メールとパスワードを渡した後、一致する電子メールからsaltを取得します。そのクエリの影響を受けた行の数が1の場合は、変数$saltをそのクエリの結果に適用します。機能の後半部分については

は、私が以前に単純に使用していた:

// standard mysql query goes here 

if (mysql_num_rows($query) == 1) { 
    $salt = mysql_result($query, 0); 
} 

を今すぐ私の全体の機能は、次のようになります。

// new mysql query below 

global $dbh; 

$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`=? LIMIT 1"); 
$stmt->execute($email); 

// not sure what to write here? 

が、私は変換する方法を理解するトラブルを抱えていますコードの最上位部分をPDOの何かに似ています。私はまた、おそらく他の何かをここで間違っている(いつものように)やっているので、それも私に指摘してください。

私はPHPマニュアルを見てきましたが、私はそのほとんどを理解できません。何か案は?

+0

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-アクセス/ –

+0

既に見て、そのページは特に私の質問に答えるものではありません。 – ReactingToAngularVues

答えて

13

私は何を探していることはPDOStatement::rowCountだと思います:

$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`=? LIMIT 1"); 
$stmt->execute($email); 
if ($stmt->rowCount() == 1) { 
    $salt = $stmt->fetchColumn(0); 
} 

私はむしろ、このかかわらずのようにこれを記述します

$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`= :email LIMIT 1"); 
$stmt->execute(compact('email')); 

$user = $stmt->fetch(PDO::FETCH_ASSOC); 
if ($user) { 
    // work with $user['salt'] 
} 

明示的な命名は、列数に応じて、より堅牢です。


マニュアルを理解するには、オブジェクト指向の表記法/概念を理解する必要があります。 PDO classのドキュメントは、次のようになります。

PDO { 
    ... 
    PDOStatement prepare (string $statement [, array $driver_options = array() ]) 
    ... 
} 

これはPDOオブジェクト(あなたの例では$dbh)を意味し、PDOStatementオブジェクトを返すメソッドprepareがあります。あなたはこのようにそれを使用している:

$stmt = $dbh->prepare(...); 

ので$stmtPDOStatementオブジェクトです。これを知っていると、documentation for PDOStatementを見ることができ、使用できる方法はint PDOStatement::rowCount (void)です。

+1

偉大な答え!しかし、 '$ stmt-> execute($ email);'という行で 'PDOStatement :: execute()がパラメータ1を配列に渡し、文字列'が来るとエラーが出ます。なぜ '$ email'が配列になると思いますか? – ReactingToAngularVues

+0

名前付きパラメータを使用すると、 'execute'は連想型の名前=>値配列を期待します。私のコードをもう一度見て、私は 'compact'を使って配列を作成しています。 – deceze

関連する問題