2013-04-06 20 views
0

我成功使用下面的run_sql_script()函數在使用PHP的文件中執行SQL。使用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後 更新爲每個排接點BEGIN END $$ DELIMITER SQLSTATE [42000]: 語法錯誤或訪問衝突:1064你在你的SQL 有一個錯誤句法;檢查對應於你的MySQL服務器版本 爲使用附近的正確的語法手冊「DELIMITER $$ CREATE TRIGGER tg_contacts_upd更新後的通訊錄FOR EACH」在行1

任何建議如何解決

回答

1

似乎太容易了,但以下似乎工作。

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