“SQLSTATE[HY000]: 一般错误” - 一条语句中有多个 SQL 查询
Posted
技术标签:
【中文标题】“SQLSTATE[HY000]: 一般错误” - 一条语句中有多个 SQL 查询【英文标题】:"SQLSTATE[HY000]: General error" - Multiple SQL queries in one statement 【发布时间】:2012-11-13 04:03:29 【问题描述】:我的 php 脚本中有一个由 PDO 处理的查询。确切地说,它是 1 个语句中的 2 个查询。查询本身在 SQL 客户端中运行良好(我使用的是 HeidiSQL)。然而,PHP 却给了我这个错误:“SQLSTATE[HY000]: General error”,没有别的。没有错误号或消息。
有没有办法以某种方式调试查询?我认为查询本身没有错误,所以我不知道出了什么问题。 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 只运行一个查询并拒绝继续...
【问题讨论】:
这可能会有所帮助***.com/questions/6346674/… ***.com/questions/10199571/…你解决了吗 还没解决。阅读这两篇文章... 【参考方案1】:无需创建临时表。将您的两个语句合二为一应该可以解决问题。
SELECT COUNT(*) AS number
FROM (giant select statement) temp
WHERE overdue >= :from AND overdue <= :to AND overdue != 0
如果您真的想要临时表,请使用两种不同的语句。一个用来创建表,一个用来查询它。更好的选择是使用view。这样,怪物 SQL 语句就存在于数据库中,而不是您的 php 代码中。
【讨论】:
谢谢,我知道在这种情况下可以将所有内容合并到一个查询中,但是我仍然需要这个功能,因为这只是初步探测,容我们说,我还有其他东西,更复杂,肯定需要这个功能。【参考方案2】:毕竟,我找到了一种一次性运行多个查询的方法。 MySQLi->multi_query 似乎允许这样做。再次对 PDO 深感失望。
【讨论】:
这是一项功能,而不是错误。 我在这些查询中没有任何用户输入,因此安全性(SQL 注入)不是问题,因此我认为 PDO 应该具有多查询作为功能。 满足您的特定需求? 这不仅仅是我的特殊需求,MySQLi->multi_query 的存在证明了这一点。我对这个问题进行了广泛的搜索,并且有很多人在寻找这个功能。以上是关于“SQLSTATE[HY000]: 一般错误” - 一条语句中有多个 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值
PDO 错误:SQLSTATE [HY000]:一般错误:2031
SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005