执行触发器时出现 SQL 分隔符错误



>我创建了以下触发器:

DELIMITER //
DROP TRIGGER IF EXISTS after_insert_order_replica
//
CREATE TRIGGER after_insert_order_replica AFTER INSERT ON order_replica
FOR EACH ROW BEGIN
INSERT INTO exm_order 
(replica_id)
VALUES (NEW.id);
END;
//
DELIMITER ;

当我尝试从PHP执行它时,它向我显示以下错误:

执行查询时出错 '分隔符//删除触发器(如果存在after_insert_order_replica(;':您的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本对应的手册 在"分隔符//删除触发器(如果存在("附近使用的正确语法 1号线的after_insert_order_replica'

执行查询时出错 '//创建触发器after_insert_order_replica 插入后res_order_replica每行开始插入 res_order ( replica_id ( 值 ( NEW.id(;':您在 您的 SQL 语法;检查与您的 MariaDB 对应的手册 在"//创建触发器"附近使用正确语法的服务器版本 after_insert_order_replica 插入 res_order_replica ' 在行 1

执行查询"结束"时出错;':您的 SQL 语法有错误; 检查与您的 MariaDB 服务器版本对应的手册 在第 1 行的"END"附近使用的正确语法

执行查询 '//分隔符 ;' 时出错:您的 SQL语法;检查与您的 MariaDB 服务器对应的手册 在第 1 行的"//分隔符"附近使用的正确语法的版本

我尝试使用不同的分隔符,但没有运气。

这是我的PHP代码

public function Triggers(){
$restaurants = $this->em->getRepository('entitiescompany')->findBy(
array("companyName" => "testing_trigger")
);

set_time_limit(0);
include APPPATH . 'config/database.php';
$data = array();
$sql = "SHOW VARIABLES LIKE 'basedir'";
$result = $this->common->runSQL($sql);
$data['folderPath'] = rtrim(rtrim($result[0]['Value'], "/"), "\");
$data['folderPath'] .= "/bin";
foreach ($restaurants as $rts) {    
$data['dbHost'] = $rts->getServer()->getDbHost();
$data['dbUsername'] = $rts->getServer()->getDbUsername();
$data['dbPassword'] = $rts->getServer()->getDbPassword();
$data['dbDatabase'] = $rts->getDbDatabase();

$triggerAry = array(
"After Insert Order Replica"  => "after_insert_order_replica.txt"
);
foreach ($triggerAry as $k=>$v) {
$trigger = FCPATH . "assets/$v";
$this->IMPORT_TABLES($data['dbHost'],$data['dbUsername'],$data['dbPassword'],$data['dbDatabase'], $trigger);

usleep(100000); //1 of 10th of a Second
}
}
}

function IMPORT_TABLES($host,$user,$pass,$dbname, $sql_file_OR_content){
set_time_limit(3000);
$SQL_CONTENT = (strlen($sql_file_OR_content) > 300 ?  $sql_file_OR_content : file_get_contents($sql_file_OR_content)  );  
$allLines = explode("n",$SQL_CONTENT); 
$mysqli = new mysqli($host, $user, $pass, $dbname); if (mysqli_connect_errno()){echo "Failed to connect to MySQL: " . mysqli_connect_error();} 
$templine = ''; // Temporary variable, used to store current query
foreach ($allLines as $line)    {                                           // Loop through each line
if (substr($line, 0, 2) != '--' && $line != '') {$templine .= $line;    // (if it is not a comment..) Add this line to the current segment
if (substr(trim($line), -1, 1) == ';') {        // If it has a semicolon at the end, it's the end of the query
if(!$mysqli->query($templine)){ print('Error performing query '<strong>' . $templine . '': ' . $mysqli->error . '<br /><br />');  }  $templine = ''; // set variable to empty, to start picking up the lines after ";"
}
}
}   return 'Importing finished. Now, Delete the import file.';

}

我认为DELIMITER技术只是命令行工具mysql的一个技巧。

DROP ...作为来自 PHP 的查询。 然后从 PHP 完成整个CREATE ... END;。 不要在这两种情况下使用DELIMITER//

此问题的解决方案是删除名为 IMPORT_TABLES 的函数并使用以下 PHP 代码:

$command = "C:/xampp/mysql/bin/mysql -h ".$data['dbHost']." -u ".$data['dbUsername']." -p".$data['dbPassword']." ".$data['dbDatabase']." < ".$trigger;
system($command);

相关内容

  • 没有找到相关文章

最新更新