0

PDO によって処理される php スクリプトにクエリがあります。正確には、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 が 1 つのステートメントで複数のクエリを実行することを拒否したために発生したようです。クエリを実行する前にこれを挿入しました:

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);

これで「一般的なエラー」はなくなりましたが、

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax

最初のクエリの直後、つまり PDO は 1 つのクエリだけを実行し、続行を拒否します...

4

2 に答える 2

1

結局、一度に複数のクエリを実行する方法を見つけました。MySQLi- >multi_queryがこれを許可しているようです。再び PDO に深く失望しました。

于 2012-11-25T20:54:21.387 に答える
0

一時テーブルを作成する必要はありません。2 つのステートメントを 1 つに結合すると、問題が解決するはずです。

SELECT  COUNT(*) AS number
FROM    (giant select statement) temp
WHERE   overdue >= :from AND overdue <= :to AND overdue != 0

本当に一時テーブルが必要な場合は、2 つの異なるステートメントを使用してください。1 つはテーブルを作成し、もう 1 つはクエリを実行します。さらに良いオプションは、ビューを使用することです。このようにして、モンスターの SQL ステートメントは、php コードではなくデータベースに存在します。

于 2012-11-25T19:44:49.573 に答える