gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:01:31 25 4
gpt4 key购买 nike

我有一组具有复杂 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com