2

ローカルのランプ スタックで動作する Yii アプリがあります。アプリをランプサーバーに配置すると、アプリはデータベースを読み取って実行しますが、アプリはデータベースに正常に書き込みません。エラーログを取得していません。何かご意見は?

dbを更新する方法は次のとおりです。

public function actionIndex()
{
    if ($_GET["yep"] == "") {
      pd_error("You are not logged in!");
    }
    list($uid, $domain) = preg_split("/@/",$_GET["yep"],2);
    $model=$this->loadModel($uid);
    $this->redirect($model->URL."?".$model->Unique_ID);     
}

public function loadModel($uid)
{
    $model=People::model()->findByPk($uid);
    $model->Login_Count++;
    $model->Last_Logged=date('Y-m-d H:i:s');
    if ($model->validate()) {
         $model->save();
    } else { 
        $this->render('notice');
    }
    return $model;
}

奇妙なことに、db が Login_Count と Last_Logged を更新しない場合でも、ユーザーは URL にリダイレクトされるため、通知ページが読み込まれないため、SQL が有効である必要があります。何かご意見は?

アップデート + ソリューション

問題は、mysql サーバーの autocommit が false に設定されていることでした。これをアプリ レベルでオーバーライドするには、次の行を config/main.php db 配列に追加します。

'db'=>array(
    ...
    'initSQLs'=>array('SET AUTOCOMMIT=1',),
    ...
);

Yii: mysql サーバーで自動コミットをオフにしてアクティブ レコードを使用する

4

1 に答える 1

0

ページのレンダリングはnoticeリダイレクトを停止しません。レンダリングされている可能性がありますが、リダイレクトのため表示できません。コードをリファクタリングしてみてください。

  • モデルを 2 回検証していますが、App ユーザーからのデータがないため、おそらく検証がスキップされる可能性があります。
  • Peopleモデルが実際に見つかったかどうかは確認しません。
  • CWebUser::afterLoginこの種のことを行うためにオーバーライドできる方法があります(ログイン数と最終ログイン日を更新します)

たぶん、この方法(クイックフィックス)が機能します:

function actionIndex()
{
    if ($_GET["yep"] == "") {
      pd_error("You are not logged in!");
    }
    list($uid, $domain) = preg_split("/@/",$_GET["yep"],2);
    if (null === ($model=People::model()->findByPk($uid))
        throw new CHttpException(404);
    $model->Login_Count++;
    $model->Last_Logged=date('Y-m-d H:i:s');
    if ($model->save()) {
         $this->redirect($model->URL."?".$model->Unique_ID);
    } else {
        // echo CHtml::errorSummary($model)
        $this->render('notice');
    }       
}
于 2013-01-13T18:03:48.677 に答える