使用PHP mysqli从文件中执行复杂的SQL


Execute complex SQL from file with PHP mysqli

我有一组具有复杂SQLSQL文件(删除/创建表和具有分隔符更改的存储过程、删除/创建表格、更改表格等)。我试着运行这样的文件:

$sql = file_get_contents("sql/filename.sql");
if (!$mysqli->multi_query($sql)) {
    echo("Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error);
    exit();
}
do {
    if ($res = $mysqli->store_result()) {
        $res->free();
    }
} while ($mysqli->more_results() && $mysqli->next_result());

一些文件被正常处理,但在其他有分隔符更改和存储过程创建的文件上,我收到了一个错误:

Multi query failed: (1064) You 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 $$
DROP PROCEDURE IF EXISTS alter_members_table $$
CREATE PROCEDUR' at line 1

如果我复制这个SQL文件的内容并在phpMyAdmin中执行它,一切都很好,所以我确信SQL是正确的。

出了什么问题,我该如何解决?

更新。。。其中一个SQL文件生成此错误:

DELIMITER $$
DROP PROCEDURE IF EXISTS procedure_name $$
CREATE PROCEDURE procedure_name()
BEGIN
    IF NOT EXISTS ((
        SELECT * FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE()
          AND COLUMN_NAME = 'column_name'
          AND TABLE_NAME = 'table_name'
    ))
    THEN
        ALTER TABLE `table_name`
        ADD COLUMN `column_name` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
        AFTER `other_column_name`;
    END IF;
END $$
CALL procedure_name() $$
DELIMITER ;

为什么我在这里使用存储过程,这是插件安装脚本的一部分,它必须执行一些SQL文件来准备DB。我已经浏览了解决方案,如何创建新的列,如果它仍然不存在。我只找到了程序性的解决方案。

我相信只有MySQL客户端才能识别更改批处理分隔符的语句。通过其他接口执行时,它不是有效的SQL语句。

因此,我不确定是否有可能实现你想要实现的目标。

为什么需要PHP脚本来创建和删除存储过程?为什么程序不能永久存在于数据库中?