列名必须是字符串或数组yii

时间:2013-01-11 03:36:47

标签: php yii

我在访问yii的网络应用程序时遇到了麻烦。我已经配置为与所有者的设置相同,但是当我尝试访问时,我收到错误“列必须是字符串或数组”。我怎么能解决它?提前谢谢..

5 个答案:

答案 0 :(得分:6)

报告错误消息时,有助于获得准确的错误消息。实际的错误消息是:“列名称必须是字符串或数组”。使用精确的字符串,您可以搜索框架文件以查找它所在的位置。

看起来某个方法正在将无效的列名传递给CDbCommandBuilder的createInCondition方法。

见第722行:https://github.com/yiisoft/yii/blob/1.1.13/framework/db/schema/CDbCommandBuilder.php

查看调用该方法的几个实例,我猜你有一个没有主键的数据库表。这是该问题的一种可能解释。其他解释将需要您提供更多详细信息。

提供错误页面在调试模式下为您提供的堆栈跟踪以及表模式。

答案 1 :(得分:5)

如果您的表中没有主键并且尝试进行更新,则会发生这种情况。我遇到了这个问题,因为我的表中有一个复合主键。在我想要更新模型之前,我在所有操作中都得到了很好的处理。

只需添加一个int主键,通过自动增量将其称为'id'到您的表中。应该这样做。

在测试之前,请务必禁用架构缓存(如果您正在使用它)。在架构缓存过期之前,更改不会生效。

答案 2 :(得分:3)

也许你桌上没有primary key。如果您使用方法$ model-> save()来保存或使用方法$ model-> update()($ model是CActiveRecord实例),您将收到此错误。

因为CActiveRecord中的方法更新使用主键进行更新(阅读更多here

源代码:framework / db / ar / CActiveRecord.php#1115

if($this->_pk===null)
        $this->_pk=$this->getPrimaryKey();
$this->updateByPk($this->getOldPrimaryKey(),$this->getAttributes($attributes));
$this->_pk=$this->getPrimaryKey();

您可以使用方法updateAll()代替update()updateByPk()

答案 3 :(得分:2)

看一下这个链接

http://www.yiiframework.com/forum/index.php/topic/3887-cdbexception-column-name-must-be-either-a-string-or-an-array/

您的表似乎没有primary key或者主键没有很好地恢复,这通常是由损坏的备份文件引起的。

答案 4 :(得分:0)

如果您忘记添加返回值,则会显示错误。简单的例子,使用这种方法的模型将在PK上返回错误

...

public function relations()
{
}

...

您必须添加返回值。

/**
 * @return array
 */
public function relations()
{
    return array();
}

如果您不使用此类方法,则应删除它们,或添加“默认返回值”。否则它会产生与主键或其他数据库问题相同的错误(因为模型读取的是无效数据,并不是它应该做的所有事情)。