我在访问yii的网络应用程序时遇到了麻烦。我已经配置为与所有者的设置相同,但是当我尝试访问时,我收到错误“列必须是字符串或数组”。我怎么能解决它?提前谢谢..
答案 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)
看一下这个链接
您的表似乎没有primary key
或者主键没有很好地恢复,这通常是由损坏的备份文件引起的。
答案 4 :(得分:0)
如果您忘记添加返回值,则会显示错误。简单的例子,使用这种方法的模型将在PK上返回错误
...
public function relations()
{
}
...
您必须添加返回值。
/**
* @return array
*/
public function relations()
{
return array();
}
如果您不使用此类方法,则应删除它们,或添加“默认返回值”。否则它会产生与主键或其他数据库问题相同的错误(因为模型读取的是无效数据,并不是它应该做的所有事情)。