Ошибка SQL DELIMITER при выполнении триггера - PullRequest
0 голосов
/ 19 октября 2018

Я создал следующий триггер:

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, он показал мне следующие ошибки:

Ошибка при выполнении запроса 'DELIMITER //DROP TRIGGER ЕСЛИ СУЩЕСТВУЕТ after_insert_order_replica;': У вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который можно использовать рядом с 'DELIMITER // DROP TRIGGER IF EXISTS' after_insert_order_replica 'в строке 1

Ошибка выполнения запроса' // CREATE TRIGGER after_insert_order_replica AFTER INSERT ON res_order_replicaКАЖДАЯ СТРОКА НАЧИНАЕТ ВСТАВИТЬ В ЗНАЧЕНИЯ res_order (replica_id) (NEW.id);': У вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который нужно использовать рядом с '// CREATE TRIGGER after_insert_order_replica ПОСЛЕ INSERT ON res_order_replica' в строке 1

Ошибка при выполнении запроса 'END;': У вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'END' в строке 1

Ошибка при выполнении запроса '// DELIMITER;': в синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'DELIMITER' в строке 1

Я пробовал использовать другой DELIMITER, но безуспешно.

здесьмой код PHP

public function Triggers(){

    $restaurants = $this->em->getRepository('entities\company')->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.';

}

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Решением этой проблемы является удаление функции с именем IMPORT_TABLES и использование следующего кода PHP:

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

system($command);
0 голосов
/ 25 октября 2018

Я думаю, что техника DELIMITER - это просто уловка для инструмента командной строки mysql.

Выполните DROP ... как запрос из PHP.Тогда сделайте весь CREATE ... END; из PHP.Не используйте DELIMITER или // ни в одном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...