CakePHP read()未返回模型名称

时间:2012-02-28 05:57:52

标签: cakephp

我的cakePHP出了问题,想知道是否还有其他人经历过这个问题。我正在尝试设置User对象。我创建了模型:

class User extends AppModel
{
}

我创建了控制器:

class UsersController extends AppController
{
  function view($id = null) {
    $this->User->id = $id;
    $this->set('users', $this->User->read());
 }
}

然后我转到视图页面。但是,我没有得到蛋糕文件说我应该得到的东西。我得到了:

Array
(
    [0] => Array
        (
            [id] => 3
            [FirstName] => 1
            [LastName] => 1
        )
)

当我期待看到的是

Array
(
    [User] => Array
        (
            [id] => 3
            [FirstName] => 1
            [LastName] => 1
        )
)

当我做$this->User->find('all');时,我会像这样回来一个数组:

Array
(
    [0] => Array ([0] => Array (/*stuff here*/))
    [1] => Array ([0] => Array (/*stuff here*/))
    [2] => Array ([0] => Array (/*stuff here*/))
)

我已经尝试将名称更改为Myuser(包括数据库表,控制器,模型等)并且仍然具有相同的结果,因此我认为它与保留关键字无关。 有没有人碰到这个,或者更重要的是,有没有人知道如何解决它?感谢。

编辑: 我正在使用蛋糕版2.0.6。我使用的是MySQL 5.0.92数据库。我刚刚尝试设置名称变量,但它没有改变我的结果。

5 个答案:

答案 0 :(得分:2)

经过一整天的故障排除后,我终于能够解决它了。

原因绝对是一个过时的pdo_mysql.so库。它位于/ usr / local / lib / php / extensions /(最新目录)/pdo_mysql.so

由于此功能请求,getColumnMeta中返回的表名仅在某个版本中添加: https://bugs.php.net/41416/

现在,问题是,在某些Web主机中,PHP需要使用Easy Apache进行编译。为了启用PDO(我最初被禁用),我也必须经历这一点。但问题是,出于某种原因,Easy Apache每次运行时都会下载一些过时的源代码。运行yum或安装任何RPM也无济于事。

所以这就是我所做的: - 我从PHP站点下载了最新的PHP源代码,解压缩了tarball - 我运行Easy Apache,进行了重新编译,并很快进入控制台观看它重新下载过时的PHP源代码 - 当PHP源重新出现时,我很快用最新的源替换了整个ext / pdo_mysql目录 - Easy Apache将首先编译httpd,所以你有时间做上述步骤 - 构建完成后,重新启动。 - 要检查您的pdo_mysql.so版本是否支持表名,请执行以下命令: strings -f pdo_mysql.so | grep':table' - 应该有一个条目。旧版本没有。 - 顺便说一下,我注意到/ usr / lib / php / modules和/ usr / lib / php / extensions中有更多pdo_mysql.so的复制,但似乎/ usr / local中的那个是一个那是活跃的。不过,我手动更新所有副本

注意:如果您只是尝试更新pdo_mysql.so文件,它将无法正常工作。您将收到分段错误,页面将不会呈现任何内容。您需要使用上述步骤重新编译PHP。

我希望这会有助于其他会遇到此错误的人。

答案 1 :(得分:0)

确保您的表名为用户并明确包含关联

class User extends AppModel {
    public $name = 'User';
    public $useTable = 'users';
    ...

如果您使用任何其他模型,则需要设置$ uses变量以将User模型与控制器相关联。明确地添加它,即使只有一个也不会伤害......

例如

class UsersController extends AppController {

    //Controller Name
    public $name = 'Users';

    //DB Config for desired connection
    public $useDbConfig = 'test';

    // Array of associated models
    public $uses = array('Store','User');

    //Array of Helpers used by Controller Views
    public $helpers = array('Html', 'Form');
    ...

另外,检查以确保AppModel或AppController中没有可能意外地为此处的交互做出贡献的编辑...您也可以考虑转储$ uses的值以查看其中的内容。

答案 2 :(得分:0)

最后发现它的原因与一个名为PDOStatement :: getColumnMeta的函数有关。调用cakePHP运行的查询调用此框架,以获取列名,列类型和表名。但是,无论出于何种原因,在我目前拥有的webhost上,此函数不返回表名,因此cakePHP默认使用0索引而不是表名索引创建数组。

$column = $results->getColumnMeta($index);
if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) ===  false) {
    $this->map[$index++] = array($column['table'], $column['name'], $type);
} else {
    $this->map[$index++] = array(0, $column['name'], $type);
}

仍然不确定如何解决它,但这肯定是它发生的原因。

答案 3 :(得分:0)

是的,你是对的。兽王

原因是您使用旧版本的PDO驱动程序已被弃用。 PDOStatement :: getColumnMeta在旧版本中不显示[table] = name

所以这里的解决方案是下载具有内置PDO的PHP新版本。 不要通过PECL安装PDO 因为你得到旧版本的PDO扩展。并使用

<?php phpinfo ?>

检查是否安装正确。所以你可以使用PHP附带的本机PDO驱动程序,而不是使用扩展PDO驱动程序。

顺便说一句,谢谢你指出问题所在。

答案 4 :(得分:0)

我刚遇到了这个问题。原因不是过时的pdo_mysql.so库。

如果您使用cakephp 2.3.x并确保使用PHP 5.2.8或更高版本,则应检查是否启用了 pdo_mysql 扩展名。

您可以回复 phpinfo()进行检查。 注意:只有在您看到“启用MySQL的PDO驱动程序”时才会启用 pdo_mysql 扩展名,否则会被禁用。