0

誰かがあなたprepare()のステートメント(私の場合はupdateステートメント)とそれを教えてもらえますか?それから更新クエリ(以下のコードを参照)の後にexecute()使用して、一致するものが見つかり更新が行われたかどうかを確認しますが、私はelseステートメントを取得しました。rowCount()rowCount() > 0

ステートメントの構文エラーや条件と混同しないように、以下のコードで質問したいと思います(特定の領域について詳しくコメントしています)。elseステートメントは、一致が見つからなかったために更新できないことを意味しますか、および/または考えられる構文エラーまたはその他のエラー?太字で書いたのは、自分を混乱させないようにしたいという意味だと思います。

プリペアドステートメントのSQLUPDATE構文自体は間違っており、後で処理されるため、無視してください。私が話している領域の詳細なコメントとともに、コードはよりよく説明されていると思います。

// check if key is set and alphanumeric and equals 40 chars long
// we use sha1 so it will always be 40 chars long.
if(isset($_GET['key']) && ctype_alnum($_GET['key']) && strlen($_GET['key']) == 40){
$key = trim($_GET['key']);
}

// if key isset and valid
if(isset($key)){


try {
    // connect to database
    $dbh = sql_con();

    // checke if activation key matches and user_uid matches
    $stmt = $dbh->prepare("
            SELECT
              users_status.user_uid,
              users_status.user_activation_key
            FROM
              users_status
            JOIN
              users
            ON
              users_status.user_activation_key = ?
            AND
              users_status.user_uid = users.user_uid LIMIT 1");

    // execute query
    $stmt->execute(array($key));

    // if row count greater than 0 then match found
    if ( $stmt->rowCount() > 0 ) {

        // user verified; we now must update users status in users table to active = 1
        // and set the user_activation_key in the users_status to NULL
        $stmt = $dbh->prepare("
            UPDATE
              users.user_status,
              users_status.user_activation_key
            SET
              user_status = ".USER_STATUS_ACTIVE.",
              user_activation_key = NULL
            JOIN
              users
            ON
              users_status.user_activation_key = ?
            AND
              users_status.user_uid = users.user_uid LIMIT 1");

        // execute query
        $stmt->execute(array($key));

        if ( $stmt->rowCount() > 0 ) {

            echo 'account now activated';
            exit;

        } else {
            // update not sucessful
            // THIS IS THE BIT IM CONFUSED WITH;
            // IF RETURNED RESULT IS 0 (WHICH IT WILL BE IF I GET HERE WHEN RUNNING SCRIPT)
            // THEN I GUESS THAT MEANS THERE WAS NOT AN ERROR IN SQL SYNTAX BUT
            // CONDITION IN SQL STATEMENT COULD NOT BE MATCHED ? IS THAT CORRECT WHAT I AM THINKING ?
            // IF I AM CORRECT THEN OBVIOUSLY I WILL DISPLAY A MESSAGE TO USER AND EXIT HERE;
            // AS IF I AM THINKING RITE ANY SYNTAX ERROR WOULD BE CAUGHT BY CATCH BLOCK AND THIS ELSE STATEMENT
            // MEANS COULD NOT UPDATE BECAUSE NO MATCH IN UPDATE QUERY COULD BE FOUND ?
        }


    } // else no match found
    else {

        // no match found invalid key
        echo '<h1>Invalid Activation Link</h1>';

        $SiteErrorMessages =
        "Oops! Your account could not be activated. Please recheck the link in your email.
        The activation link could not be found or the account has already been activated.";

        SiteErrorMessages();

        include($footer_inc);
        exit;

    }

    // close database connection
    $dbh = null;

} // if any errors found log them and display friendly message
catch (PDOException $e) {
    ExceptionErrorHandler($e);
    require_once($footer_inc);
    exit;
}

} else {

// else key not valid or set
echo '<h1>Invalid Activation Link</h1>';

$SiteErrorMessages =
"Oops! Your account could not be activated. Please recheck the link in your email.
The activation link appears to be invalid.<br /><br />
If the problem persists please request a new one <a href='/member/resend-activation-email'>here</a>.";

SiteErrorMessages();

include($footer_inc);
exit;

}
4

2 に答える 2

1

複数の更新を行う場合は、実際にトランザクションを利用する必要があります。

ただし、トランザクションはデフォルトのMyISAMエンジンではサポートされていないため、ALTER TABLE tbl_name ENGINE=InnoDBこれを機能させるには次のことを行う必要があります。

$success = false;
$dbh->beginTransaction();
# perform your first query
if ($query->rowCount() == 1) {
   # something was updated/inserted/deleted
   # perform second query
   if ($query->rowCount() == 1) {
       $success = true;
   }
}

if ($success) $dbh->commit();
else $dbh->rollBack();

あなたの質問に関しては、あなたはおそらくあなたの?を囲む必要があります。一重引用符を使用するので、ステートメントを次のように変更します。

users_status.user_activation_key = '?';

結果が得られない可能性があるもう1つの理由は、$ keyが整数であり、PreparedStatement::execute($array)メソッドを使用してパラメーターをバインドする場合、それが機能するために値を適切な型にキャストする必要があることです。例:

$query->execute(array((int)$key));

それ以外の場合は、$query->bindParam($key)

于 2012-04-15T10:25:08.047 に答える
1

あなたが正しいです:

if $stmt->rowCount() == 0

次に、行が更新されていないことを意味します。

クエリの実行中にSQLエラーまたはエラーが発生した場合、実行時にFALSEの戻り値またはPDOEXCEPTIONを受け取ります。

  execute(array($key));
于 2012-04-15T10:13:34.323 に答える