Yii的updateByPk一直返回0

时间:2014-05-30 08:44:34

标签: yii

我正在尝试更新我的代码所用的用户表。但由于某种原因,它继续执行else语句。

documentation中的

表明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 ;

4 个答案:

答案 0 :(得分:1)

您应首先检查$ model退出,否则updateByPk可返回0

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

答案 1 :(得分:0)

您的表格未指定主键。然而,您按主键更新。

你有几个选择。

  • 更改您的表格结构以包含主键
  • 使用其他更新方法。例如,Update()允许您传递条件对象。

答案 2 :(得分:0)

知道它很旧,但是:https://www.php.net/manual/en/pdostatement.rowcount.php

<块引用>

如果关联的 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,这种行为并不能保证适用于所有数据库,并且不应依赖于可移植应用程序。

还有Yii1 use rowCount

答案 3 :(得分:-1)

模型无法更新,因为last_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();
}