php - "SQLSTATE[HY000]: General error"- 一条语句中的多个 SQL 查询

标签 php mysql pdo xampp

我的 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 仅运行一个查询并拒绝继续...

最佳答案

我终于找到了一种一次性运行多个查询的方法。看来 MySQLi->multi_query 允许这样做。再次对 PDO 深感失望。

关于php - "SQLSTATE[HY000]: General error"- 一条语句中的多个 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13551961/

相关文章:

php - 在 Laravel 中成功注册后如何重定向到上一页?

php - 在 App Engine 灵活的 PHP 7.0 上连接到第二代 Cloud SQL - 缺少套接字

php - 在 php.ini 中禁用 opcache.enable 在 CentOS 上不起作用

php - Ajax PHP Jquery - 回显数据

java - JPA 多对多关系创建两个连接表

mysql workbench无法连接到数据库,但连接测试正常

mysql - Pomelo MySql .net core 2 - 默认执行超时

php - 代码点火器 3 : update Sql table column via GET superglobal

php - 使用带有 pg_update() PHP 的事务

php - 使用占位符时 PDO 执行速度较慢