2009-11-05 3 views
1

다양한 SQLite 작업을 처리하는 클래스를 만듭니다. 내 문제는 : 여러 문을 SQL 문자열을 만들 때 표준 PHP => $ db-> query() ... 사용할 때 작동하지만 메서드에서 동일한 요청을 할 때 실패합니다. OO 방법은 내 SQL 문에서 첫 번째 ";"기호 다음을 모두 건너 뛴 것으로 보입니다. 왜 그런가, 어떻게 고쳐야 할까?

감사합니다.

// Fails - line 2 is not inserted, why? 
$this->db_sqlite->query(" 
    INSERT INTO foo (name) VALUES('Via class multi-lines 1'); 
    INSERT INTO foo (name) VALUES('Via class multi-lines 2'); 
"); 

// Works - both lines are inserted. 
$GLOBALS[db]->query(" 
    INSERT INTO foo (name) VALUES('Direct multi-lines 1'); 
    INSERT INTO foo (name) VALUES('Direct multi-lines 2'); 
"); 

풀 예 :

<?php 

class db_sqlite { 

    function __construct() { 
     $this->connect(); 
    } 

    function connect() { 
     $GLOBALS[db] = new SQLiteDatabase("dbsqlite.php.db"); 
    } 

    function query($sql) { 
     return $GLOBALS[db]->query($sql); 
    } 

} 


class something { 

    function setup() { 
     $this->db_sqlite = new db_sqlite(); 

     $this->db_sqlite->query("CREATE TABLE foo (id INTEGER PRIMARY KEY, name CHAR(255));"); 

     // Works 
     $this->db_sqlite->query("INSERT INTO foo (name) VALUES('Via class one line 1');"); 
     $this->db_sqlite->query("INSERT INTO foo (name) VALUES('Via class one line 2');"); 

     // Fails (why?) 
     $this->db_sqlite->query(" 
      INSERT INTO foo (name) VALUES('Via class multi-lines 1'); 
      INSERT INTO foo (name) VALUES('Via class multi-lines 2'); 
     "); 

     // Works 
     $GLOBALS[db]->query(" 
      INSERT INTO foo (name) VALUES('Direct multi-lines 1'); 
      INSERT INTO foo (name) VALUES('Direct multi-lines 2'); 
     "); 

     foreach($this->db_sqlite->query("SELECT * FROM foo") as $v) { 
      echo $v[id] . " - " . $v[name] ."<br>"; 
     } 
    } 
} 

$something = new something(); 
$something->setup(); 
?> 

출력 :
1 - 3 2 (올바른) 분류 한 라인을 통해 - - 멀티 클래스를 통해
2 1 (올바른) 분류 한 거쳐서 라인 1 (올바르지 않음)
4 - 직접 멀티 라인 1 (올바른)
5 - 직접 멀티 라인 2 (올바른)

답변

5

sqlite_query()에 대한 PHP 매뉴얼 페이지는 하나의 함수 호출에서 다중 명령문을 사용하는 것에 대해 "함수의 결과가 사용되지 않는 경우에만 작동합니다. 사용되는 경우 첫 번째 SQL 문만 실행됩니다." 결과를 반환하기 때문에, 당신은 결과를 "사용"하고 있습니다. 어쨌든 그건 내 추측입니다.

+0

감사드립니다. 이렇게하면 여러 개의 쿼리가 실행되고 결과는 반환되지 않습니다. $ GLOBALS [db] -> queryExec ($ sql) ... 또한 클래스 메서드로 작동합니다. –

0

오류가 발생할 경우 설정되는 errorMsg 홀더 변수를 전달할 수 있습니다.

구문 : 쿼리 (문자열 $ 쿼리 [INT $는 result_type [문자열 & $ ERROR_MSG]])

$의는 result_type이 SQLITE_BOTH 수 (SQLite는이 아무것도 반환 여부를 확인하는 것이 좋습니다 수 기본값)

관련 문제