使用PHP加载包含分隔符的SQL文件

时间:2013-04-06 16:21:40

标签: php mysql-workbench

我成功使用下面的run_sql_script()函数在PHP文件中执行SQL。

    static public function run_sql_script($script)
    {
        // Load and explode the sql file
        $f = fopen($script,"r+");
        $sqlFile = fread($f,filesize($script));
        $sqlFile=preg_replace("/\\\;/", '&#59', $sqlFile);   //replace semicolons with ascii
        $sqlArray = explode(';',$sqlFile);
        //Process the sql file by statements
        foreach ($sqlArray as $stmt)
        {
            if (strlen($stmt)>8)
            {
                //Used to prevent blank lines at end of sql script from executing
                $stmt=preg_replace("/&#59/", ';', $stmt);   //replace ascii with semicolons
                try {db::db()->exec($stmt);}
                catch(PDOException $e){library::sql_error($e,$stmt);}
            }
        }
        return;
    }

我使用MySQL Workbench生成SQL,最近,我还通过MySQL Workbench添加了一个触发器。它将以下SQL添加到文件中。

DELIMITER $$

CREATE TRIGGER tg_contacts_upd AFTER UPDATE ON contacts
FOR EACH ROW
.... 
BEGIN
END$$

DELIMITER ;

通过run_sql_script()函数运行新文件后,我现在收到以下错误。

  

查询错误:DELIMITER $$ CREATE TRIGGER tg_contacts_upd AFTER   UPDATE ON联系人每个行开始结束$$ DELIMITER SQLSTATE [42000]:   语法错误或访问冲突:1064 SQL中有错误   句法;查看与MySQL服务器版本对应的手册   在'DELIMITER $$ CREATE TRIGGER附近使用正确的语法   tg_contacts_upd更新后第1行的每个联系人

任何建议如何修复

1 个答案:

答案 0 :(得分:1)

似乎太容易了,但以下似乎有效。

    static public function run_sql_script($script)
    {
        $sql = file_get_contents($script);
        db::db()->exec($sql);
    }