在控制器中调试SQL

时间:2013-11-27 22:16:55

标签: cakephp cakephp-2.0 cakephp-2.1 cakephp-2.3

我正在尝试调试我的sql,但我很难过。我知道我可以用这个:

<?php echo $this->element('sql_dump'); ?>

转储sql但是如果我正在进行ajax调用,这不会(或者至少我不知道如何使用它)工作。由于页面未重新加载,因此转储不会刷新。如何运行我的命令并调试sql?这是我在控制器中的代码:

public function saveNewPolicy(){
 $this->autoRender = false;
        $policyData = $this->request->data["policyData"];
        $numRows=0;

         $data = array(
            'employee_id' => trim($policyData[0]["employeeId"]),
            'insurancetype_id'=> $policyData[0]["insuranceTypeId"],
            'company' =>  $policyData[0]["companyName"],
            'policynumber' => $policyData[0]["policyNumber"],
            'companyphone' => $policyData[0]["companyPhone"],
            'startdate'=> $policyData[0]["startDate"],
            'enddate'=> $policyData[0]["endDate"],
            'note' => $policyData[0]["notes"]
        );

        try{
            $this->Policy->save($data);
            $numRows =$this->Policy->getAffectedRows();

            if($numRows>0){
                $dataId = $this->Policy->getInsertID();
                $response =json_encode(array(
                    'success' => array(
                        'msg' =>"Successfully Added New Policy.",
                        'newId' => $dataId
                    ),
                ));
                return $response;
            }else{
                throw new Exception("Unspecified Error.  Data Not Save! ");
            }
        }catch (Exception $e){
            return $this->EncodeError($e);
        }

    }

问题是如果我的数组中的公司字段为空,为空,则插入将失败而没有任何错误。我知道它失败了,因为我使用了numrows变量。我知道该字段在数据库中接受空值。对我来说,调试它的唯一方法就是查看发送给MySql的SQL。有谁知道如何调试它?我正在使用CakePhp 2.4

2 个答案:

答案 0 :(得分:1)

我使用这种方法。我在AppModel类中添加了这个方法:

public function getLastQuery() {
    $dbo = $this->getDatasource();
    $logs = $dbo->getLog();
    $lastLog = end($logs['log']);
    return $lastLog['query'];
}

然后在你称之为的任何控制器中:

debug($this->{your model here}->getLastQuery());

答案 1 :(得分:0)

不是试图在CakePHP中进行攻击,也许只使用MySQL记录查询并在日志文件上执行tail -f会更容易?以下是如何实现这一目标:

  1. 在MySQL中,运行SHOW VARIABLES;并查找general_loggeneral_log_file条目
  2. 如果general_log为OFF,请运行SET GLOBAL general_log = 'ON';将其打开
  3. 在终端中,运行tail -f logfile.log(日志文件位置在general_log_file条目中)以获取日志的流式视图,因为它已写入
  4. 这对于这些情况非常有用,可以看到幕后发生了什么,或者出于某种原因你是否已经调试过。