代码之家  ›  专栏  ›  技术社区  ›  Kristoffer Bohmann

包含多个SQL语句的php/sqlite:$db->query()有效,$this->db_sqlite->query()失败

  •  1
  • Kristoffer Bohmann  · 技术社区  · 15 年前

    我正在创建一个处理各种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-通过1级线路1(正确)
    2-通过1级线路2(正确) 3-通过类多行1(不正确)
    4-直接多线1(正确)
    5-直接多线2(正确)

    2 回复  |  直到 15 年前
        1
  •  5
  •   GZipp    15 年前

    PHP手册页 sqlite_query() 说,关于在一个函数调用中使用多个语句,“…这仅在不使用函数的结果时有效-如果使用了它,则只会执行第一个SQL语句。”因为返回结果,所以您正在“使用”它。不管怎样,这是我的猜测。

        2
  •  0
  •   rossoft    15 年前

    您可以传递一个errormsg holder变量,如果发生任何错误,该变量将被设置。最好检查sqlite是否返回任何内容:

    语法: 查询(string$query[,int$result_type[,string&$error_msg]])

    $result_类型可以是sqlite_both(默认)