我在访问 yii 的 Web 应用程序时遇到了一些问题。我已配置为与所有者的设置相同,但是当我尝试访问时,出现错误“列必须是字符串或数组”。我该如何解决?提前致谢..
5 回答
报告错误消息时,获得准确的错误消息会有所帮助。实际的错误消息是:“列名必须是字符串或数组”。使用确切的字符串,您可以搜索框架文件以找到提及它的位置。
看起来某处的某些方法正在将无效的列名传递给createInCondition
CDbCommandBuilder 的方法。
参见第 722 行:https ://github.com/yiisoft/yii/blob/1.1.13/framework/db/schema/CDbCommandBuilder.php
查看调用该方法的几个实例,我猜您在某处有一个没有主键的数据库表。这是问题的一种可能解释。其他解释将需要您提供更多详细信息。
提供错误页面在调试模式下为您提供的堆栈跟踪以及表模式。
当您的表中没有主键并且您尝试进行更新时,就会发生这种情况。我遇到了这个问题,因为我的表中有一个复合主键。在我想更新模型之前,我在所有操作上都得到了很好的处理。
只需添加一个 int 主键,使用自动增量将其称为“id”到您的表中。它应该可以解决问题。
在测试之前,请务必禁用模式缓存(如果您正在使用它)。在您的架构缓存过期之前,更改不会生效。
也许你primary key
的桌子上没有。如果你使用 $model->save() 方法保存或使用 $model->update() 方法($model 是 CActiveRecord 实例),你会得到这个错误。
因为 CActiveRecord 中的方法更新使用主键来更新(在这里阅读更多 )
源代码: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()
看看这个链接
您的表似乎没有 aprimary key
或主键没有很好地恢复,这通常是由损坏的备份文件引起的。
如果您忘记添加返回值,您将显示错误。简单的例子,使用这种方法的模型将在 PK 上返回错误
...
public function relations()
{
}
...
您必须添加返回值。
/**
* @return array
*/
public function relations()
{
return array();
}
如果您不使用此类方法,则应删除它们,或添加“默认返回值”。否则,它会给出与主键或其他数据库问题相同的错误(因为模型读取无效数据并且并非所有应有的东西)。