【问题标题】:Yii CActiveRecord with Column Named "attributes"Yii CActiveRecord 列名为“属性”
【发布时间】:2013-12-09 06:25:05
【问题描述】:

我使用了旧数据库中的 CRUD 生成器。搜索列值时出现以下错误:

htmlspecialchars() 期望参数 1 是字符串,给定数组 (/usr/local/share/yii/framework/web/helpers/CHtml.php:103)

问题在于模型有一个名为“attributes”的现有列,这会造成冲突。我从 _search.php 中删除了该条目,并注释掉了模型中的所有实例,希望至少让它工作但没有运气。任何建议将不胜感激。

谢谢。

【问题讨论】:

  • 如果是单表中的单列,可以重命名吗?
  • 我们需要查看产生此错误的代码。您应该能够在配置文件中打开错误日志,这样您就可以准确地看到它所指的文件/行号。

标签: yii attributes cactiverecord


【解决方案1】:

每个CActiveRecord 实例(或CModel 实例)都有一个名为attributes 的getter/setter,可以使用它设置所有属性。这会导致冲突,因为生成的 crud 代码使用 attributes 属性,期望它如前所述工作。

控制器执行以下操作:

$model->attributes=$_POST['ModelClassName'];
// or 
$model->attributes=$_GET['ModelClassName'];

这是为了一次性设置模型的所有(安全)属性。相反,这会覆盖旧数据库模型的数据库属性 attributes

这又会导致您描述的错误,因为$_GET['ModelClassName']$_POST['ModelClassName'] 通常包含数据数组。

我想最简单的解决方法是直接调用“正常”attributes 行为的 setter 函数,这将导致将上面提到的行替换为以下内容:

// in the controller
$model->setAttributes($_POST['ModelClassName']);
// and 
$model->setAttributes($_GET['ModelClassName']);

我认为生成的其余 CRUD 代码(视图)可以而且应该保持不变以使其正常工作。

如果你想知道它的工作原理和原因,最好在 __get__set 魔术函数中添加一些 research 以及它们在 yii 框架中的使用方式。

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多