2009-11-05 9 views
1

Je crée une classe qui gère diverses actions SQLite. Mon problème est le suivant: Quand je crée une chaîne SQL avec plusieurs instructions, cela fonctionne quand on utilise PHP standard => $ db-> query() ... mais cela échoue lorsqu'on fait la même requête depuis une méthode. Il semble que la méthode OO saute tout après le premier ";" - symbole dans mon instruction SQL. Pourquoi est-ce, et comment le réparer?

Merci.

// 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'); 
"); 

exemple complet:

<?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(); 
?> 

sortie:
1 - Via classe une ligne 1 (correct)
2 - Via classe une ligne 2 (correct) 3 - Via classe multi- lignes 1 (incorrect)
4 - Lignes multiples directes 1 (correct)
5 - Lignes multiples directes 2 (corrects)

Répondre

5

La page de manuel PHP pour sqlite_query() dit, à propos de l'utilisation de plusieurs instructions dans un appel de fonction, "... cela ne fonctionne que lorsque le résultat de la fonction n'est pas utilisé - si elle est utilisée, seule la première instruction SQL sera exécutée." Puisque vous renvoyez le résultat, vous "l'utilisez". C'est ma conjecture, de toute façon.

+0

Merci pour votre référence. Cela lancera plusieurs requêtes (ne renvoie aucun résultat): $ GLOBALS [db] -> queryExec ($ sql) ... et cela fonctionne aussi comme une méthode de classe. –

0

Vous pouvez transmettre une variable de support errorMsg qui sera définie si une erreur se produit. Ce pourrait être une bonne idée de vérifier si sqlite retourne quelque chose là:

Syntaxe: requête (string $ query [, int $ result_type [, string & $ error_msg]])

result_type de $ pourrait être SQLITE_BOTH (par défaut)