2012-11-25 4 views
0

PHP 스크립트에서 PDO가 처리하는 쿼리가 있습니다. 정확히 말하면 1 문장에서 2 개의 쿼리입니다. 쿼리 자체는 SQL 클라이언트에서 잘 실행됩니다 (저는 HeidiSQL을 사용하고 있습니다). PHP는 그러나 나에게 정확히이 오류를 준다 : "SQLSTATE [HY000] : 일반 오류"과 함께. 오류 번호 또는 메시지가 없습니다."SQLSTATE [HY000] : 일반 오류"- 하나의 명령문에 여러 SQL 쿼리가 있습니다.

어떻게 든 쿼리를 디버깅 할 수 있습니까? 나는 쿼리 자체에 에러가 있다고 생각하지 않는다. 그래서 나는 틀린 것을 모른다. mysql 에러 로그에는 아무것도 나타나지 않습니다. mysql 일반 로그를 사용하도록 설정했지만 오류를 표시하지 않고 쿼리 자체 만 기록합니다.

내 스택 : 이것은 내 쿼리입니다 5.5.27

XAMPP 1.8, 아파치 2.4.3, PHP 5.4.7, MySQL은 (오히려 길다) :

/*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 

UPDATE : 문제는 한 명령문에서 여러 쿼리를 실행하지 못하게하는 PDO가 원인 인 것 같습니다. 나는 실행 쿼리하기 전에이를 삽입 한 :

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

는 이제 "일반 오류가"사라,하지만 난 PDO는 단지 하나 개의 쿼리를 실행하는 것을 의미 단지 첫 번째 쿼리 후

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

받고 있어요 계속하기를 거부합니다 ...

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/6346674/pdo-support-for-multiple-queries-pdo-mysql-pdo-mysqlnd –

+0

http://stackoverflow.com/questions/10199571/why- sqlstatehy000 - 일반 오류가 아직 해결되지 않았습니다 – Drew

+0

아직 해결하지 못했습니다. 두 게시물을 모두 읽으십시오 ... – Caballero

답변

1

여러 검색어를 한 번에 실행하는 방법을 찾았습니다. 이 나타납니다. MySQLi-> multi_query이 허용합니다. PDO에 깊은 실망.

+0

이것은 기능이 아니며 버그입니다. –

+0

나는이 쿼리에서 사용자 입력이 전혀 없으므로 보안 (SQL 삽입)이 문제가 아니므로 PDO가 다중 쿼리를 기능으로 가져야한다고 생각합니다. – Caballero

+0

귀하의 특정 요구를 충족 시키려면? –

0

임시 테이블을 만들 필요가 없습니다. 두 문장을 하나로 결합하면 문제가 해결됩니다.

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

임시 테이블이 실제로 필요한 경우 두 개의 다른 문을 사용하십시오. 하나는 테이블을 생성하고 하나는 쿼리를 생성합니다. 더 나은 옵션은 view을 사용하는 것입니다. 이 방법은 몬스터 SQL 문 PHP 코드 대신 데이터베이스에 살고있다.

+0

감사합니다.이 경우에는 모든 쿼리를 하나의 쿼리로 병합 할 수 있지만이 기능이 필요하지는 않습니다. 초기 프로빙 이었으므로이 기능이 필요합니다. 더 복잡한이 기능이 꼭 필요합니다. – Caballero

관련 문제