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

标签 php mysql sql 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文件来准备数据库。我已经浏览了解决方案,仅当它仍然不存在时才创建新列。我只找到了程序上的解决方案。

最佳答案

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

因此,我不确定是否可以实现您想要实现的目标。

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

关于php - 使用 PHP mysqli 从文件执行复杂的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185196/

相关文章:

php - 消除数据库查询中的字段索引

mysql - 如何限制/剔除一些符合条件的记录? (正确的语法)

mysql - JPA 中的跨数据库连接

php - 从数据库填充依赖下拉列表

mysql - 两者上的 SQL JOIN

php - 去掉逗号分隔值

php - 用于 PHP 的 Richtext 编辑器 - MySQL Web 应用程序

javascript - onclick 事件不起作用

javascript - 根据 Action 添加一个js文件。曾德

php - 从 Ajax POST 将数组保存到 MySQL 的正确方法