这个问题在这里已经有答案了:
在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 ;
暂无答案!
目前还没有任何答案,快来回答吧!