0

ZENDを使用してプロジェクトに取り組んでいます

非常に奇妙で非論理的なことが起こり続けています。

ユーザーが登録すると、アクティベーションコードが生成され、DBに書き込まれます。

//Generate Activation Code;
$activation_code = date('YmdHis');
$activation_code .= substr(number_format(time() * rand(),0,'',''),0,10);

データベースで私は例のために取得します。このようなコード:201212301653302670595490

ユーザーはリンクに移動する必要があります /user/activation/201212301653302670595490

私はコントローラーでこのパラメーターを取得します:

public function activateAction() {

$activation_code = htmlentities(trim($this->_getParam('activation_code', 0)));
$activation_code = preg_replace("/[^0-9]/","", $activation_code);


    $usersModel = new Users_Model_DbTable_Users();
    $result = $usersModel->activUser($activation_code);

    if($result) {

        $this->view->message = 'Your account is activated. You may now Login.';

    } else {

        $this->view->message = 'Something went wrong.';

    }
}

このアクションは私のモデルの関数を呼び出します:

public function activUser($activation_code) {

    $data = array(
        'status' => 2
    );

    if($this->update($data, 'activation_code = '. $activation_code)) {
        return true;            
    }

}

これは私のブートストラップのカスタムルートです:

$activateUserRoute = new Zend_Controller_Router_Route("user/activate/:activation_code", array(
   'module' => 'users',
   'controller' => 'manage',
   'action' => 'activate'
));

$router->addRoute('activateUserRoute', $activateUserRoute); 

DBテーブルの私のセルactivation_codeは、長さが24のVARCHARです('cuzは、24シンボルの長さで生成されたコードです)。

気まずい瞬間

アクティベーションプロセスに失敗し続けます。常にfalseを返します。

DBに移動すると、生成されたコードを任意の番号1、1231231231234、または生成されたコード自体(201212301653302670595490)に置き換えて、アクティブ化します。

たぶん、ここで何が問題になっているのか教えていただけますか?何か練習はありますか?

4

2 に答える 2

0

私は最初にこれを尋ねなければなりません:

ポイントは$activation_code = preg_replace("/[^0-9]/","", $activation_code);、アクティベーションコードのすべての値を何も置き換えていないようです。

アクティベーションコードを$whereパラメーターに渡す方法は廃止されました。構文が機能する場所もあれば、機能しない場所もあります。

public function activUser($activation_code) {

    $data = array(
        'status' => 2
    );
    $where = $this->getAdapter()->quoteInto('activation_code = ?', $activation_code);
    //update() returns number of rows updated,
    if($this->update($data, $where) === 0) {
        return false;            
    } else {
        return true;
    }
}

update()更新された行数を返すため、現在のif()ステートメントの不正な条件は不正確になります。ITはほとんどの場合正しく機能する可能性があります...
更新されるはずの行の数を正確にテストし、その数が返されない場合は失敗する場合は、さらに良いでしょう。

htmlentities()入力パラメータをフィルタリングするのに最適な選択ではない場合があります。そこにあることがわかっているタイプのデータをフィルタリングする方がはるかに良い場合があります。Zend_Filter_Inputには、非常に便利なフィルターとバリデーターがあります。

于 2012-12-31T03:06:59.790 に答える
0

http://framework.zend.com/manual/1.12/en/zend.db.profiler.htmlを試して、生成されるSQLを確認してください。

于 2012-12-30T18:24:18.560 に答える