2015-09-04 43 views
0

我想通過PHP將觸發器應用於現有的表和列。 執行PHP代碼時,不會引發錯誤,但不會創建觸發器。MySQL查詢適用於Phpmyadmin,但通過PHP應用時不適用?

我的PHP代碼:

//file: migrations.php 

// created_at column already defined in a previous migration 
//... 

$migrations[3]['message'] = "added created_at, updated_at columns on rate table"; 
$migrations[3]['created'] = "2015-09-05 08:28:00"; 
$migrations[3]['sql']  = " 
DELIMITER | 
CREATE TRIGGER rate_created_at BEFORE INSERT ON rate 
FOR EACH ROW 
    BEGIN 
     SET NEW.created_at = CURRENT_TIMESTAMP; 
    END | 
    DELIMITER ; 
"; 

// apply migration 
foreach ($migrations as $key => $value) { 
    // run the migration SQL for the current iteration 
    $sth = $dbh->prepare($value['sql']); 
    $sth->execute(); 
} 

繼承人什麼工作

  • 複製和粘貼觸發創建SQL到phpMyAdmin的
  • 擺脫DELIMITERBEGINEND聲明 的例如如果我減少SQL到
$migrations[3]['sql']  = " 
CREATE TRIGGER rate_created_at BEFORE INSERT ON rate 
FOR EACH ROW 
     SET NEW.created_at = CURRENT_TIMESTAMP; 
"; 

它從PHP運行,問題是我不相信我可以運行多行語句,而不DELIMITERBEGINEND
我試圖

  • 逃避使用不同的分隔符

分隔符

  • 我能做些什麼來讓PHP運行與DELIMITERBEGINEND語句在SQL?

  • +0

    運行命令定界符作爲單獨的查詢。例如'分隔符/創建/分隔符' –

    回答

    2

    是的,你將不得不擺脫那些DELIMITER的,只是有下面的代碼

    $migrations[3]['sql'] = " 
    CREATE TRIGGER rate_created_at BEFORE INSERT ON rate 
    FOR EACH ROW 
        BEGIN 
         SET NEW.created_at = CURRENT_TIMESTAMP; 
        END;"; 
    

    看到這個另一篇文章中說同樣的事情PHP: multiple SQL queries in one mysql_query statement

    +0

    謝謝拉胡爾,這工作!我不知道爲什麼MySQL不認爲在不使用不同的分隔符時沒有完成整個觸發器語句? –

    +0

    'DELIMITER'不是SQL語法的一部分,它是交互式用戶界面的一個功能。 – Barmar

    +0

    這就是爲什麼你不能在sqlfiddle中使用它,你必須使用他們的菜單來設置分隔符。 – Barmar

    相關問題