使用.sql文件从php运行mysql命令

tvz2xvvm  于 2021-06-23  发布在  Mysql
关注(0)|答案(0)|浏览(238)

这个问题在这里已经有答案了

在php中运行mysql*.sql文件(13个答案)
如何使用mysqli multiquery执行自定义分隔符查询(1个答案)
两年前关门了。
我已经为我的系统制作了一个安装向导。如果用户想使用我的系统,他必须在开始使用之前进行安装。安装程序将创建数据库、表、过程和触发器。
安装程序可以成功地创建数据库和表,但根本不能创建触发器或过程。
如果行以“;”结尾,我的php代码将分解一个.sql文件。但触发器以分隔符开头;;因此脚本将分隔符作为单个查询获取。
这是我的php代码,它正在读取.sql文件并将文件与查询分开。

$f = fopen($sql_dump_file,"r+");
$sqlFile = fread($f,filesize($sql_dump_file));
$sqlArray = explode(';',$sqlFile);
//  var_dump($sqlArray);
//Process the sql file by statements
foreach ($sqlArray as $stmt) {
    if (strlen($stmt)>3) {
        //echo $stmt;
        $result = mysqli_query($db,$stmt);
        if (!$result) {
            //echo $stmt;
            echo $sqlErrorCode = mysqli_errno($db);
            echo $sqlErrorText = mysqli_error($db);
            $sqlStmt = $stmt;
            break;
        }
    }
}

我有这个错误

1064You have an error in your SQL syntax; check the manual that corresponds 
  to your MySQL server version for the right syntax to use near 'DELIMITER ;; 
 CREATE PROCEDURE `acct_stop`( IN S DATETIME, IN Acct_Sessio' at line 1

这是我的程序代码

DELIMITER ;;
CREATE  PROCEDURE `acct_stop`(
    IN S DATETIME,
    IN Acct_Session_Time INT(12),
    IN Acct_Input_Octets BIGINT(20),
    IN Acct_Output_Octets BIGINT(20),
    IN Acct_Terminate_Cause VARCHAR(32),
    IN Acct_Delay_Time INT(12),
    IN Connect_Info VARCHAR(32),
    IN Acct_Session_Id varchar(64),
    IN SQL_User_Name VARCHAR(64),
    IN NAS_IP_Address VARCHAR(15)
    )
BEGIN
    DECLARE Prev_Acct_Input_Octets BIGINT(20);
    DECLARE Prev_Acct_Output_Octets BIGINT(20);
    DECLARE Prev_Acct_Session_Time INT(12);
    SELECT SUM(AcctInputOctets), SUM(AcctOutputOctets), SUM(AcctSessionTime)
        INTO Prev_Acct_Input_Octets, Prev_Acct_Output_Octets, 
        Prev_Acct_Session_Time
    FROM radacct
        WHERE AcctSessionId = Acct_Session_Id
          AND UserName = SQL_User_Name
          AND NASIPAddress = NAS_IP_Address
          AND ( AcctStopTime > 0);
    IF (Prev_Acct_Session_Time IS NULL) THEN
        SET Prev_Acct_Session_Time = 0;
        SET Prev_Acct_Input_Octets = 0;
        SET Prev_Acct_Output_Octets = 0;
    END IF;
    UPDATE radacct SET AcctStopTime = S,
                       AcctSessionTime = (Acct_Session_Time - Prev_Acct_Session_Time),
                       AcctInputOctets = (Acct_Input_Octets - Prev_Acct_Input_Octets),
                       AcctOutputOctets = (Acct_Output_Octets - Prev_Acct_Output_Octets),
                       AcctTerminateCause = Acct_Terminate_Cause,
                       AcctStopDelay = Acct_Delay_Time,
                       ConnectInfo_stop = Connect_Info
    WHERE AcctSessionId = Acct_Session_Id
      AND UserName = SQL_User_Name
      AND NASIPAddress = NAS_IP_Address
      AND (AcctStopTime IS NULL OR AcctStopTime=0);
    END ;;
DELIMITER ;

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题