【问题标题】:CakePHP read() is not returning a model nameCakePHP read() 没有返回模型名称
【发布时间】:2012-02-28 05:57:52
【问题描述】:

我的 cakePHP 遇到问题,想知道是否有其他人遇到过这种情况。我正在尝试设置一个用户对象。我创建模型:

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

【问题讨论】:

  • 您是否尝试在模型和控制器中设置 $name? public $name = 'User'; 在模型中,public $name = 'Users'; 在控制器中。
  • 什么蛋糕版本?特别是在 2.0 中,$name 提示会适得其反。至少应该是。
  • 我在使用SQL Server数据库的时候也有过类似的经历。你的情况是?
  • ahhhhhh >_requirements
  • 昨晚我从朋友那里借了一些网络空间并将我的整个应用程序复制到他们的网站(不同的主机),它使用完全相同的代码运行良好,所以我开始倾向于我托管的网站上的 PHP 配置或 SQL 版本有问题:(

标签: cakephp


【解决方案1】:

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

原因肯定是一个过时的 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 版本是否支持表名,请执行以下命令: 字符串-f pdo_mysql.so | grep ': 表' - 那里应该有一个条目。旧版没有。 - 顺便说一句,我注意到 /usr/lib/php/modules 和 /usr/lib/php/extensions 中有更多 pdo_mysql.so 的副本,但似乎 /usr/local 中的那个是那个那是活跃的。不过,我手动更新所有副本

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

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

【讨论】:

    【解决方案2】:

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

    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 的值以查看其中的内容。

    【讨论】:

    • 尝试设置使用变量。没有改变任何东西。对其进行了调试并看到了 Array ( [0] => User ) 我现在正在考虑重新安装 cake :(
    【解决方案3】:

    最后发现原因与一个名为 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);
    }
    

    仍然不确定如何修复它,但这绝对是它发生的原因。

    【讨论】:

      【解决方案4】:

      是的,你是对的。兽王

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

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

      <?php phpinfo ?>
      

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

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

      【讨论】:

        【解决方案5】:

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

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

        你可以回显 phpinfo() 来检查它。 注意:pdo_mysql 扩展仅在您看到“PDO Driver for MySQL enabled”时启用,否则它被禁用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多