2014-12-01 3 views
0

저는 PHP와 특히 PDO에 새로운 (ish)입니다. 왜 누군가 JSON_encode에 빈 배열을 반환하는지 이해할 수 있습니까?PHP SQLite PDO가 빈 json 배열을 반환합니다.

SQL 쿼리가 제대로 실행되어 결과를 반환합니다. PDO를 통해이 다단계 질의를 통과하면 기대했던 것만 얻지 못합니다. 나는 비슷한 질문을 쳐다 보았고 많은 통찰력없이 PHP 문서와 조화를 이루려고했다.

PDO를 통해 SQLite로 다단계 (다소 복잡한) 쿼리를 제출하고 결과를 json_encode()으로 전달하는 올바른 방법은 무엇입니까? 모든 포인터가 많이 감사합니다.

업데이트 : @Darren, @Phill, @Mike의 유용한 의견으로 코드 예제를 업데이트/정리했습니다.

$ dbh = new PDO ('sqlite : livedb2.sqlite'); 나는이 아직도 단지 $q4 쿼리 문이 아닌 결과를 인쇄하는 것 같은 쿼리를 분할하는 경우

$sth = $dbh->prepare(' 
CREATE TEMPORARY TABLE TMPnodesA AS 
SELECT Source, Location, COUNT(*) AS value 
    FROM [emergencydept(sankey)] 
    GROUP BY Source, Location 
UNION 
SELECT Location, Destination, COUNT(*) AS value 
    FROM [emergencydept(sankey)] 
    GROUP BY Location, Destination; 
CREATE TEMPORARY TABLE TMPnodesB AS 
SELECT Source, Location, value 
    FROM TMPnodesA 
    ORDER BY value DESC; 
CREATE TEMPORARY TABLE TMPnodesC AS 
SELECT Source AS name 
    FROM TMPnodesB 
UNION 
SELECT Location 
    FROM TMPnodesB; 
CREATE TEMPORARY TABLE TMPnodesD AS 
SELECT name 
    FROM TMPnodesC; 
SELECT name, rowid-1 as id 
    FROM TMPnodesD;'); 

$sth->execute(); print_r($sth); 

...

제출 PDO를 사용하는 올바른 방법을 무엇
$dbh = new PDO('sqlite:livedb2.sqlite'); 

$q1=(' 
    CREATE TEMPORARY TABLE TMPnodesA AS 
    SELECT Source, Location, COUNT(*) AS value 
     FROM [emergencydept(sankey)] 
     GROUP BY Source, Location 
    UNION 
    SELECT Location, Destination, COUNT(*) AS value 
     FROM [emergencydept(sankey)] 
     GROUP BY Location, Destination; 
    '); 

$q2=(' 
    CREATE TEMPORARY TABLE TMPnodesB AS 
    SELECT Source, Location, value 
     FROM TMPnodesA 
     ORDER BY value DESC; 
    '); 

$q3=(' 
    CREATE TEMPORARY TABLE TMPnodesC AS 
    SELECT Source AS name 
     FROM TMPnodesB 
    UNION 
    SELECT Location 
     FROM TMPnodesB; 
    '); 

$q4=(' 
    CREATE TEMPORARY TABLE TMPnodesD AS 
    SELECT name 
     FROM TMPnodesC; 
    SELECT name, rowid-1 as id 
     FROM TMPnodesD; 
    '); 

$dbh->exec($q1); 
$dbh->exec($q2); 
$dbh->exec($q3); 
echo json_encode($dbh->query($q4)); 

SQLite에 대한 다중 단계 (복합) 쿼리 및 결과를 json_encode에 전달?

+0

그런 fetchAll()을 반복하지 않아도됩니다. 'print_r ($ sth-> fetchAll()); '은 무엇을 의미합니까? – Darren

+2

'새로운 PDO (...) 또는 죽는 (...)'은 ** die ** 문에 도달하지 않으므로 그 일을 그만두십시오 – Phil

+0

'print_r ($ sth-> fetchAll());' – Colin

답변

1

글쎄, PDO가 다중 쿼리를 지원하지 않는다는 것 (SQL 문의 첫 번째 세미콜론 다음에 멈춤)에 대한 정보가 충분하다고 보입니다. 불행히도 이러한 종류의 다중 쿼리에 대한 예는 거의 없습니다 (대부분 결과가 없습니다). 찾아내는 데 어느 정도 시간이 걸렸습니다. this excellent tut. 결국이 솔루션으로 나를 이끌었습니다.

<?php 

try { 

    $DBH = new PDO("sqlite:livedb2.sqlite"); 

    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 


    $STH = $DBH -> query(' 

     CREATE TEMPORARY TABLE TMPnodesA AS 
     SELECT Source, Location, COUNT(*) AS value 
      FROM [emergencydept(sankey)] 
      GROUP BY Source, Location 
     UNION 
     SELECT Location, Destination, COUNT(*) AS value 
      FROM [emergencydept(sankey)] 
      GROUP BY Location, Destination; 
    '); 

    $STH = $DBH -> query(' 

     CREATE TEMPORARY TABLE TMPnodesB AS 
     SELECT Source, Location, value 
      FROM TMPnodesA 
      ORDER BY value DESC; 
    '); 

    $STH = $DBH -> query(' 

     CREATE TEMPORARY TABLE TMPnodesC AS 
     SELECT Source AS name 
      FROM TMPnodesB 
     UNION 
     SELECT Location 
      FROM TMPnodesB; 
    '); 

    $STH = $DBH -> query(' 

     CREATE TEMPORARY TABLE TMPnodesD AS 
     SELECT name 
      FROM TMPnodesC; 
    '); 

    $STH = $DBH -> query(' 

     SELECT name, rowid-1 as id 
      FROM TMPnodesD; 
    '); 

$json = array(); 

while($row = $STH ->fetch(PDO::FETCH_ASSOC)) { 

     $json[] = $row; 

}; 

echo json_encode($json); 

    $DBH = null; 
} 

catch(PDOException $e){ 
    echo $e->getMessage(); 
} 

?> 

이 질문을보고 의견을 제공하는 데 시간을내어 주신 모든 분들께 감사드립니다.

관련 문제