CakePHP Post 查询调试之谜
CakePHP Post Query Debug Mystery
我需要一些帮助来了解如何在 Cake 中进行调试以及错误可能来自何处。
我喜欢蛋糕组织得井井有条。到目前为止,我可以相对容易地确定出现错误时转到哪个函数。
我有一个名为“项目”的模型(当然它也有一个控制器和视图)。
我的问题是在名为“添加”的视图中单击提交按钮时。我知道 post 返回调用“projects_controller.php”中的函数“add”,但我在该函数中找不到导致问题的任何代码。 (我认为问题可能出在超级 class “AppController”。)
在我的 "add" 函数中,从表单提交数据后,我添加了这个
$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 行;并且错误仍然存在(所以上面的添加可能不是问题)。任何帮助,将不胜感激。谢谢!
通常,如果发生此错误,则您没有模型实例,而是您正在处理的应用程序模型实例。应用程序模型实例没有 add() 方法并直接使用 add() 查询数据库。
因此请确保正确包含您的模型。由于您没有向我们展示如何调用该方法的代码(以及如何使模型可用于控制器),因此我无法提供任何具体建议。
如果您手动包含它:
$this->ModelName = ClassRegistry::init('ModelName');
可能你的问题是这样的 post , Error: SQLSTATE[42000]: Syntax error or access violation with cakePHP
听起来像是在某处的模型对象上调用 loadModel()
,这正是这种情况下会发生的情况,因为模型魔法 __call
处理程序将执行对不存在方法的所有调用作为 SQL 个查询。
https://github.com/cakephp/cakephp/blob/2.6.1/lib/Cake/Model/Model.php#L827
Enable debug mode(将其设置为 2
)并检查触发错误时现在将出现的堆栈跟踪,这应该会揭示错误调用 loadModel()
的确切位置。
我需要一些帮助来了解如何在 Cake 中进行调试以及错误可能来自何处。
我喜欢蛋糕组织得井井有条。到目前为止,我可以相对容易地确定出现错误时转到哪个函数。
我有一个名为“项目”的模型(当然它也有一个控制器和视图)。
我的问题是在名为“添加”的视图中单击提交按钮时。我知道 post 返回调用“projects_controller.php”中的函数“add”,但我在该函数中找不到导致问题的任何代码。 (我认为问题可能出在超级 class “AppController”。)
在我的 "add" 函数中,从表单提交数据后,我添加了这个
$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 行;并且错误仍然存在(所以上面的添加可能不是问题)。任何帮助,将不胜感激。谢谢!
通常,如果发生此错误,则您没有模型实例,而是您正在处理的应用程序模型实例。应用程序模型实例没有 add() 方法并直接使用 add() 查询数据库。
因此请确保正确包含您的模型。由于您没有向我们展示如何调用该方法的代码(以及如何使模型可用于控制器),因此我无法提供任何具体建议。
如果您手动包含它:
$this->ModelName = ClassRegistry::init('ModelName');
可能你的问题是这样的 post , Error: SQLSTATE[42000]: Syntax error or access violation with cakePHP
听起来像是在某处的模型对象上调用 loadModel()
,这正是这种情况下会发生的情况,因为模型魔法 __call
处理程序将执行对不存在方法的所有调用作为 SQL 个查询。
https://github.com/cakephp/cakephp/blob/2.6.1/lib/Cake/Model/Model.php#L827
Enable debug mode(将其设置为 2
)并检查触发错误时现在将出现的堆栈跟踪,这应该会揭示错误调用 loadModel()
的确切位置。