3

これは私のユーザーテーブル構造です:

+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| ID             | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| screen_name    | varchar(20)      | NO   | UNI | NULL    |                |
| slug           | varchar(20)      | NO   |     | NULL    |                |
| email          | varchar(50)      | NO   | UNI | NULL    |                |
| pass           | varchar(32)      | YES  |     | NULL    |                |
| signin_twitter | enum('T','F')    | NO   |     | F       |                |
| twitter_id     | int(11)          | YES  | UNI | NULL    |                |
| bg_image       | varchar(50)      | YES  |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+

データベースにデータを追加しようとしています。(私のコントローラーで)

$model=new Users;
        //$this->performAjaxValidation($model);
        if(isset($_POST['Users']))
        {
                    //screen_name, email,pass comes from form. Also, we need to set **slug** and **singin_twitter**
                $_POST['Users']['slug'] = $this->sanitize($_POST['Users']['screen_name']);
                $_POST['Users']['signin_twitter'] = 'F';
            $model->attributes=$_POST['Users'];
            if($model->save())
                $this->redirect('dash/index');                  
        }

しかし、それはデータを保存していません。$model->save() returning FALSE. どうすればデバッグできますか?

4

10 に答える 10

5

Yii デバッグ ツールバーは非常に優れたデバッグ ツール です yii-debug-toolbar ダウンロード ページ

于 2011-07-02T02:32:34.083 に答える
4

デバッグのために、config/main.php で CWebLogRoute を有効にします。コメントを外します:

                    array(
                            'class'=>'CWebLogRoute',
                    ),

戻り値が false の場合$model->save()、データベースへのデータの保存が失敗する可能性があります (これについては、CWebLogOutput および/または MySQL エラーを参照してください)、または検証が失敗する可能性があります。これは、通常、yii は保存する前に $model->validate を呼び出すためです。

テストのために、 $model->validate();前に呼び出し$model->save()て戻り値を確認します。データベースに保存する前に、すべての属性が「安全」であることが重要です。すべての属性が有効/安全である場合は、 を$model->validate();返しますtrue

于 2011-07-01T21:33:28.430 に答える
2
$_POST['Users']['slug'] = $this->sanitize($_POST['Users']['screen_name']);
$_POST['Users']['signin_twitter'] = 'F';
$model->attributes=$_POST['Users'];

手動の属性の後に使用しない$model->attributes=$_POST['Users']でください。フィールドがモデル ルールにある場合、フィールドが再属性になる可能性があります。

また、デバッグするには:

...
$model->attributes=$_POST['Users'];
$model->validate();
var_dump($model->getErrors());
if($model->save())
...

$model->save(false)を使用して、モデルの検証をオーバーライドできることに注意してください。

于 2011-10-05T15:19:32.910 に答える
2

$model->save(false);代わりに試してみてください。検証が必要な場合、これはそれをスキップし、データを正常に保存します

于 2011-07-29T13:03:31.960 に答える
2

$model->save();入力の検証が失敗した場合、false を返します。save() の最初のパラメーターはブール値で、属性に対して検証を実行するかどうかを示します。

yii 決定版ガイドの次の 2 つのセクションを注意深く読んでください。

getErrors() を呼び出すと、検証エラーを取得できます。

$model->getErrors();
于 2011-12-20T00:11:09.027 に答える
1

何が機能しているかを知るには、単純に $model->getErrors(); を見てください。

于 2011-07-01T22:20:17.577 に答える
0

この種のYiiアクティブレコードの問題(通常は検証の問題)をデバッグするには、次を使用します。

$model->getErrors()

しかし、物事がトリッキーになると、Yii :: log()は非常に便利です:

Yii::log($expressionOrVariable,'error');

CWebLogRouteをアクティブ化しない場合は、アプリケーションログ(/ protected / runtimeフォルダー内)に行を書き込みます。何がどこで起こっているかを追跡できるいくつかのログ行を追加します。

Yii-debug-toolbarも優れた拡張機能ですが、javascriptとfirebugを使用する場合は非常に重いものです。

于 2012-09-21T22:48:34.147 に答える
0

まず、モデルはユーザーではなくユーザーと呼ばれる必要があります。私が以前にこれを試したので、以下はおそらくうまくいくでしょう。テーブルの一部ではないフィールドは、モデルで「安全」としてマークする必要があります。そうでない場合、ユーザーは保存に失敗します。

public function actionSaveUser()
{
    $model = new User;
    if(isset($_POST['User']))
    {
      $model->setAttributes( $_POST['User'] );
      if( $model->save() ) {
          // render success
      }
    }
    // render form
}

モデルのテーブルの一部ではないモデルUserのフィールドが必要だとします。それ以外の場合は安全としてマークする必要があります。セキュリティ上の理由から、「uglyName」が$_POST['U​​ser']にある場合は保存が失敗します。

class User extends CFormModel
{
  private $uglyName;

  /**
   * Declares the validation rules.
   */
  public function rules()
  {
    return array(
      array('uglyName', 'safe'),
    );
  }
}
于 2012-01-07T20:07:43.593 に答える
0

デバッグする前に、MySQL を使用している場合は、db 構成が emulatePrepare=true に設定されていることを確認してください。この拡張機能を使用するすべてのクエリをトレースするデバッグ ツールバーを追加http://www.yiiframework.com/extension/yii-debug-toolbar

于 2013-03-24T03:20:54.537 に答える
0

ビューで使用したいと思い<?php echo $model->errorSummary();?>ます。

于 2011-12-17T10:16:36.517 に答える