无法调试失败的SQL查询

时间:2015-08-20 08:01:33

标签: php mysql

代码/信息

我有查询

$stmt = $dbh->prepare("INSERT INTO `tap_sajobs` (
    `ja_jid`,
    `ja_reference`,
    `ja_datePosted`,
    `ja_dateUpdated`,
    `ja_title`,
    `ja_summary`,
    `ja_description`,
    `ja_location`,
    `ja_email`,
    `ja_url`,
    `ja_salaryperiod`,
    `ja_salarymin`,
    `ja_salarymax`
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");

值由数组$ja填充。 我可以使用此

模拟查询
$query = "INSERT INTO `tap_sajobs` (`ja_jid`,`ja_reference`,`ja_datePosted`,`ja_dateUpdated`,`ja_title`,`ja_summary`,`ja_description`,`ja_location`,`ja_email`,`ja_url`,`ja_salaryperiod`,`ja_salarymin`,`ja_salarymax`)
VALUES (".implode(",",$ja).");";
echo $query;

其中输出以下内容:

INSERT INTO `tap_sajobs` (`ja_jid`,`ja_reference`,`ja_datePosted`,`ja_dateUpdated`,`ja_title`,`ja_summary`,`ja_description`,`ja_location`,`ja_email`,`ja_url`,`ja_salaryperiod`,`ja_salarymin`,`ja_salarymax`)
    VALUES ('2049216', '2091046', '2015-07-23', '2015-08-20T06:49:30Z', 'Consultant', 'Will consider a graduate or a fully qualified fellow.', 'Test', 'No Location Set', 'test@foo.com', 'https://test.foo.com/3207/2049216/vh6zpeigfx6edggjrhshwulvvy?site=live', '0', '0', '0')

执行查询的实际代码是:

if(!$stmt->execute($ja)) { 
    print_r($stmt->errorInfo());
    print_r($dbh->errorInfo());
    exit("Error communicating with database.");
}

问题

通过代码执行查询时,我看到错误"错误与数据库进行通信"和$dbh->errorInfo()输出:

Array ( [0] => 00000 [1] => [2] => ) 1

但是,执行PHP代码直接输入的查询到phpMyAdmin执行没有问题

这个问题的根源是什么,或者如何找到它?

4 个答案:

答案 0 :(得分:1)

SQLSTATE代码00000告诉您上次执行的语句中没有发生错误。如果没有行受sql查询影响,则以下行将返回0

$stmt->execute($ja);

因此,即使没有错误,您也会进入if区域,因为!$stmt->execute($ja)将等于1。因此,为了捕捉错误,我认为最好使用,

$result = $stmt->execute($ja);
if($result == false) {
    // put the error handling logic here.
}

答案 1 :(得分:0)

如果

$query = "INSERT INTO `tap_sajobs` (`ja_jid`, `ja_reference`, `ja_datePosted`, `ja_dateUpdated`, `ja_title`, `ja_summary`, `ja_description`, `ja_location`, `ja_email`, `ja_url`, `ja_salaryperiod`, `ja_salarymin`, `ja_salarymax`)
VALUES (".implode(",", $ja).");";
echo $query;

产量

INSERT INTO `tap_sajobs` (`ja_jid`, `ja_reference`, `ja_datePosted`, `ja_dateUpdated`, `ja_title`, `ja_summary`, `ja_description`, `ja_location`, `ja_email`, `ja_url`, `ja_salaryperiod`, `ja_salarymin`, `ja_salarymax`)
VALUES ('2049216', '2091046', '2015-07-23', '2015-08-20T06:49:30Z', 'Consultant', 'Will consider a graduate or a fully qualified fellow.', 'Test', 'No Location Set', 'test@foo.com', 'https://test.foo.com/3207/2049216/vh6zpeigfx6edggjrhshwulvvy?site=live', '0', '0', '0')

然后似乎$ja中的所有值都已经转义,因此当您使用数组准备语句时,它们会被双重转义,因此会出错。

答案 2 :(得分:0)

我认为您必须删除表格上的引号

'tap_sajobs'

试试这个

 tap_sajobs

答案 3 :(得分:-1)

您正在执行" ja",而不是"查询":

if(!$stmt->execute($ja))

执行查询:

if(!$stmt->execute($query))