Yii';s updateByPk不断返回0

Yii';s updateByPk不断返回0,yii,Yii,我正在尝试更新我的用户表,我的代码就是这样做的。但出于某种原因,它一直在执行else语句 在中,它声明updateByPk应返回正在更新的行数。应该是1。我错过了什么?如何检查表是否已成功更新 if (User::model()->updateByPk($model->id, array("last_login"=> Shared::timeNow()))) { Yii::app()->user->login($identity, $duration);

我正在尝试更新我的用户表,我的代码就是这样做的。但出于某种原因,它一直在执行else语句

在中,它声明
updateByPk
应返回正在更新的行数。应该是1。我错过了什么?如何检查表是否已成功更新

if (User::model()->updateByPk($model->id, array("last_login"=> Shared::timeNow())))
{
    Yii::app()->user->login($identity, $duration);
    echo json_encode(array('error' => false, 'success' => url(app()->users->getHomeUrl())));
    Yii::app()->end();
} 
else {
    echo json_encode(array('error' => 'Could not update user info', 'code' => 'auth'));
    Yii::app()->end();
}
我的表模式如下

CREATE TABLE IF NOT EXISTS `user` (
`id` int(10) unsigned NOT NULL,
  `username` varchar(100) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `gender` char(1) DEFAULT NULL,
  `birthday` date DEFAULT '0000-00-00',
  `address` varchar(255) DEFAULT NULL,
  `city` varchar(45) DEFAULT NULL,
  `state` varchar(45) DEFAULT NULL,
  `website` text,
  `postal_code` varchar(45) DEFAULT NULL,
  `phone` varchar(45) DEFAULT NULL,
  `password` varchar(63) DEFAULT NULL,
  `activate` varchar(63) NOT NULL DEFAULT '1',
  `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_login` datetime DEFAULT NULL,
  `password_reset` int(11) unsigned DEFAULT NULL,
  `admin` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `email_verified` tinyint(1) unsigned DEFAULT NULL,
  `login_disabled` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `oauth_id` bigint(20) DEFAULT NULL,
  `oauth_username` varchar(255) DEFAULT NULL,
  `oauth_provider` varchar(10) DEFAULT NULL,
  `oauth_email` varchar(255) DEFAULT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

无法更新模型,因为
last\u login
属性的值无效。 尝试获取模型错误(
$model->errors()
)或通过
$model->validate()检查模型

为什么不按如下方式实施此功能:

$model->last_login = Shared::timeNow();
if ($model->save())
{
    Yii::app()->user->login($identity, $duration);
    echo json_encode(array('error' => false, 'success' => url(app()->users->getHomeUrl())));
    Yii::app()->end();
} 
else {
    echo json_encode(array('error' => 'Could not update user info', 'code' => 'auth'));
    Yii::app()->end();
}

您应该首先检查$model exits,否则updateByPk会返回0

if ($model && User::model()->updateByPk($model->id, array("last_login"=> Shared::timeNow())))

您的表未指定主键。但您可以通过主键进行更新

你有几个选择

  • 更改表结构以包含主键
  • 使用另一个更新方法。例如,Update()允许传递条件对象
    • 知道它很旧,但是:

      如果关联的PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为


      在测试记录是否已经通过“findByPK”@gvijayan方法出现在表中之前,我已经在上面的一些代码中使用了这个
      $model=User::model()->findByAttributes(数组('oauth_id'=>$User['id'],'oauth_provider'=>$this->defaultAction,)
      您是否将表架构详细信息发布到此处?这并不能回答您的问题,但如果您手中已经有
      $model
      ,那么为什么不简单地
      $model->last_login=…
      $model->save()
      ?为表1中的id设置主键。OP询问的是不检查验证的
      updateByPk
      。@topher为什么这样认为?我猜他在问为什么
      updateByPk
      返回
      0