3

古いmysql_*操作をすべて新しいものに変換しようとしていますが、聞いたところによると、PDOは改善されましたが、このクエリは正常に実行されないようです。テーブルPEOPLEからすべてを選択しようとしています。宣言された$username = $_SESSION['username'];

$query = "SELECT  * FROM people WHERE username=?";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $username);   
$stmt->execute();
$num_rows = $stmt->fetchColumn();

if ($num_rows == 1) {
    // ...
}

動作コードは次のとおりです。

$query = "SELECT  * FROM people 
             WHERE username=?";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $username);   
$stmt->execute();
$num_rows = $stmt->fetchColumn();
$user = $stmt->fetchObject();

if ($user) {

//do something

}
4

4 に答える 4

2

$stmt->fetchColumn行数をフェッチしません。この場合、結果セットの最初の行から最初の列をフェッチします。それは一般的に等しくないので、1あなたのテストは失敗します。

この場合、1つまたは0(ユーザー名が存在しない場合)のいずれかを期待しているため、返された行の数を実際に数える必要もありません。だからあなたは簡単に行うことができます:

$stmt->execute();
$user = $stmt->fetchObject();
if (!$user) {
    // not found
}
else {
    echo "User $user->username found!";
}

フェッチするif(!$user)行がない場合は、テストが機能します(のドキュメントを参照してください)。$userfalsefetchObject

于 2012-09-07T20:06:20.053 に答える
2
$query = "SELECT * FROM people WHERE username = :username";
$stmt = $conn->prepare($query);
$stmt->bindParam(':username', $username);   
$stmt->execute();

while ($row = $stmt->fetchObject()) {
    // do stuff
}
于 2012-09-07T20:08:04.990 に答える
2

num_rowsとしてPDOStatement::rowCountを使用し、同等のfetch_assocとしてPDOStatement :: fetch(PDO :: FETCH_ASSOC)を使用します。

于 2012-09-07T20:09:19.863 に答える
1

あなたが欲しい

if ($stmt->num_rows == 1) {

代わりは。

于 2012-09-07T20:08:46.830 に答える