2012-02-28 163 views
0

我遇到了我的cakePHP问题,并想知道是否有其他人遇到过这种情况。我正在尝试设置一个用户对象。我创建模型:CakePHP read()没有返回模型名称

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数据库。我只是尝试设置名称变量,并没有改变我的结果。

+0

您是否尝试在模型和控制器中设置$ name? '公共$ name ='User';'在模型中,'public $ name ='Users';'在Controller中。 – nappo 2012-02-28 09:16:56

+1

什么蛋糕版本?特别是在2.0中,'$ name'的提示是徒劳的。至少它应该是。 – mark 2012-02-28 09:40:44

+0

我在使用SQL Server数据库时有类似的经历。你的情况? – 2012-02-28 10:19:48

回答

0

确保您的表被命名为用户和包括该协会明确

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

你需要设置$使用变量,如果你正在使用的任何其他车型的用户模型与控制器关联。添加它明确即使只是一个不会伤害要么...

例如

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的任何修改可能被意外促成的相互作用这里...你也可以考虑倾销$ use的价值来看看有什么。

+0

尝试设置使用变量,没有任何改变,调试过它并看到 数组 ( [0] =>用户 ) 我想在此时重新安装蛋糕:( – 2012-02-29 06:07:06

0

最后发现它的原因与一个名为PDOStatement :: getColumnMeta的函数有关。这会在CakePHP运行的查询上被框架用来获取列名称,列类型和表名称。但是,无论出于何种原因,在我当前拥有的虚拟主机上,此函数不返回表名,所以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); 
} 

仍然不知道如何解决它,但这肯定是为什么它发生。

0

是的,你是对的。兽王

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

因此,在此解决方案下载具有内置PDO的PHP新版本。 请勿安装PDO VIA PECL,因为它会获得旧版本的PDO扩展。并使用

<?php phpinfo ?> 

检查它是否安装正确。所以你可以使用PHP自带的本地PDO驱动,而不是使用扩展PDO驱动。

顺便说一下,谢谢你指出的问题。

2

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

原因肯定是一个过时的pdo_mysql.so库。这是位于/ usr/local/lib目录/ PHP /分机/(最新的目录)/pdo_mysql.so

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

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

因此,这里是我做过什么: - 我从网上下载PHP站点获得最新的PHP源,提取的压缩包 - 我跑简易的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。

我希望这可以帮助其他遇到此错误的人。

0

我刚刚面临这个问题。原因不是过时的pdo_mysql.so库。

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

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

相关问题