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 つのクエリだけを実行し、続行を拒否します...