【问题标题】:CakePHP Post Query Debug MysteryCakePHP 后查询调试之谜
【发布时间】:2015-01-27 17:34:22
【问题描述】:

我需要一些帮助来了解如何在 cake 中进行调试以及错误可能来自何处。

我喜欢蛋糕的组织方式。到目前为止,对我来说,确定出现错误时要执行的功能相对容易。
我有一个名为“项目”的模型(当然它也有一个控制器和视图)。

我的问题是在名为“添加”的视图中单击提交按钮时。我知道回发调用了“projects_controller.php”中的“add”函数,但我在该函数中找不到任何导致问题的代码。 (我认为问题可能出在超类“AppController”中。)

在我的“添加”函数中,数据从表单提交后,我添加了这个

$log = $this->Project->getDataSource()->getLog(false, false);  
debug($log);

显示 SQL 语句。问题来了:

[49] => Array
    (
        [query] => loadModel
        [error] => 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'loadModel' at line 1
        [affected] => 
        [numRows] => 
        [took] => 0
    )

显然不是一个有效的 MySQL 查询!但我不确定它为什么这样做。

在我的 App Controller 中,我确实添加了一些代码,其中包括:$this->loadModel('User');。但我不确定,如果是这样,或者为什么它会作为一个问题出现。以下是我对 AppController 所做的更改(在 Git 中)(涉及添加该行):

function _canAccessProjectAssets($projectId = null) {
        if (isset($projectId)) {

                if ($this->_isProjectPrivate($projectId) == false) {
                        return true;
                } elseif ($this->_isLoggedIn() == false) {
                        return false;
                } elseif ($this->_isInGroup('Admins') == true) {
                        return true;
                } else {
                        $this->loadModel('Project');

                        $project = $this->Project->find('first', array(
                                'conditions' => array(
                                        'Project.id' => $projectId
                                ),
                                'fields' => array(
                                        'applicant_id',
                                        'id',
                                        'private'
                                ),
                                'contain' => array(
                                        'Department' => array(
                                                'fields' => array(
                                                        'id',
                                                )
                                        ),
                                        'ProjectType' => array(
                                                'fields'  => array(
                                                        'id',
                                                        'department_id',
                                                        'name'
                                                )
                                        )
                                )
                        ));

                        if ($this->Session->read('Auth.User.id') == $project['Project']['applicant_id']) {
                                return true;
                        } else {
                                $departments = Set::extract('/Department/id', $project);
                                if (!in_array($project['ProjectType']['department_id'], $departments)) { array_push($departments, $project['ProjectType']['department_id']); }
                                $id = $this->Session->read('Auth.User.id');

+                       $id = $this->Session->read('Auth.User.id');
+                       $this->loadModel('User');
+                       $userLoggedIn = $this->User->find('first', array(
+                               'recursive' => 1,
+                               'conditions' => array(
+                                       'User.id' => $id
+                               ),
+                               'fields' => array(
+                                       'id'
+                               ),
+                               'contain' => array(
+                                       'Department' => array(
+                                               'fields' => array(
+                                                       'id',
+                                                       'name'
+                                               )
+                                       ),
+                               )
+                       ));
+
+                       $sameDepartment = false;
+                       foreach($departments as $dept)
+                       {
+                           foreach($userLoggedIn['Department'] as $departmentLoggedIn)
+                           {
+                               if($dept == $departmentLoggedIn['id'])
+                               {
+                                       $sameDepartment = true;
+                               }
+                           }
+                       }
+
+                       return $sameDepartment;

        function _getUserJsonLog() {
+           $id = $this->Session->read('Auth.User.id');
+           $this->loadModel('User');
+           $user = $this->User->find('first', array(
+                                'recursive' => 1,
+                                'conditions' => array(
+                                        'User.id' => $id
+                                ),
+                                'fields' => array(
+                                        'id'
+                                ),
+                                'contain' => array(
+                                        'Department' => array(
+                                                'fields' => array(
+                                                        'id',
+                                                        'name'
+                                                )
+                                        ),
+                                )
+                        ));
+
+           $departmentList = "";
+           $deptCount = 0;
+           foreach($user['Department'] as $department)
+           {
+               if($deptCount > 0)
+               {
+                   $departmentList = $departmentList . ", ";
+               }
+               $departmentList = $departmentList . $department['id'];
+               $deptCount++;
+           }
+

我什至注释掉了 loadModel 行;并且错误仍然存​​在(因此上述添加可能不是问题)。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 检查你的用户模型,它调用“User.php”并且你的类调用class User extends AppModel { ?

标签: php mysql cakephp


【解决方案1】:

听起来您在某处的模型对象上调用 loadModel(),这正是在这种情况下会发生的情况,因为模型魔术 __call 处理程序会将所有对不存在方法的调用作为 SQL 查询执行。

https://github.com/cakephp/cakephp/blob/2.6.1/lib/Cake/Model/Model.php#L827

Enable debug mode(将其设置为2)并检查触发错误时现在将出现的堆栈跟踪,这应该会显示错误调用loadModel() 的确切位置。

【讨论】:

  • 谢谢!我实际上将调试模式设置为 2。但错误来自 Core Cake 库之一(我知道我无法修改它)。但是我接受了您的建议,并遵循了堆栈跟踪;果然,这导致我在第 37 行向 AppModel 添加了$this->loadModel('User');。当我将其注释掉时;错误消失了。再次感谢!
【解决方案2】:

通常,如果发生此错误,您没有模型实例,而是您正在处理的应用模型实例。 app模型实例没有add()方法,直接用add()查询db。

所以请确保正确包含您的模型。因为你没有向我们展示你如何调用方法的代码(以及你如何让控制器可以使用模型),所以我无法提供任何具体的建议。

如果你手动包含它:

$this->ModelName = ClassRegistry::init('ModelName');

可能是你的问题,就像这篇文章一样,Error: SQLSTATE[42000]: Syntax error or access violation with cakePHP

【讨论】:

    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 2013-11-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多