我的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数据库。我刚刚尝试设置名称变量,但它没有改变我的结果。
答案 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 扩展名,否则会被禁用。