我的php脚本中有一个由PDO处理的查询。确切地说,它是1个语句中的2个查询。查询本身在SQL客户端中运行良好(我正在使用HeidiSQL)。然而,PHP确实给出了这个错误:“ SQLSTATE [HY000]:常规错误”,没有别的。没有错误号码或消息。
有没有办法以某种方式调试查询?我不认为查询本身有错误,所以我不知道什么是错的。 mysql错误日志中没有显示任何内容。我启用了mysql通用日志,但它只记录查询本身而不显示错误。
我的堆栈:XAMPP 1.8,Apache 2.4.3,PHP 5.4.7,MySQL 5.5.27
这是我的查询(相当长):
/*First query - generating temp table with overdue jobs*/
CREATE TEMPORARY TABLE temp AS (
SELECT j.NetworkID,
@clientID := j.ClientID,
j.BranchID,
j.ServiceProviderID,
(
(DATEDIFF(CURDATE(), j.DateBooked))
-
IF(
(@unit := (
SELECT uctype.UnitTurnaroundTime
FROM job
LEFT JOIN product ON job.ProductID = product.ProductID
LEFT JOIN unit_type AS utype ON product.UnitTypeID = utype.UnitTypeID
LEFT JOIN unit_client_type AS uctype
ON utype.UnitTypeID = uctype.UnitTypeID
AND uctype.ClientID = @clientID
WHERE job.JobID = j.JobID
)
) IS NOT NULL, /*statement*/
@unit, /*TRUE - Client Unit Type has turnaround time assigned in the db*/
IF( /*FALSE - Now checking if Client Default Turnaround Time is set*/
(@clnt := (
SELECT DefaultTurnaroundTime AS dtt
FROM client
WHERE client.ClientID = @clientID
)
) IS NOT NULL, /*statement*/
@clnt, /*TRUE - Client Default Turaround time is set*/
( /*FALSE - falling back to general default*/
SELECT gen.Default
FROM general_default AS gen
WHERE gen.GeneralDefaultID = 1
)
)
)
) AS overdue
FROM job AS j
HAVING overdue > 0
);
/*Second query - filtering out overdue jobs with specific time range*/
SELECT COUNT(*) AS number
FROM temp
WHERE overdue >= :from AND overdue <= :to AND overdue != 0
更新:问题似乎是由PDO拒绝在一个语句中运行多个查询引起的。我在执行查询之前插入了这个:
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
所以现在“一般错误”消失了,但我正在
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax
在第一个查询之后,意味着PDO只运行一个查询并拒绝继续......
答案 0 :(得分:1)
我找到了一种方法可以一次运行多个查询。看来 MySQLi-&gt; multi_query 允许这样做。再次对PDO深感失望。
答案 1 :(得分:0)
无需创建临时表。将两个语句合并为一个可以解决问题。
SELECT COUNT(*) AS number
FROM (giant select statement) temp
WHERE overdue >= :from AND overdue <= :to AND overdue != 0
如果您真的想要临时表,请使用两个不同的语句。一个用于创建表,另一个用于查询。更好的选择是使用view。这样怪物SQL语句就会存在于数据库中而不是你的php代码中。