【发布时间】:2011-06-02 07:48:06
【问题描述】:
我使用 MySQL Workbench 制作了许多存储过程。当使用 MySQL 工作台将它们放入我的测试数据库时,它们工作得很好。
现在我正在准备用于部署的数据库创建脚本,这是唯一给我带来麻烦的脚本。当我使用命令行/mysql shell 时,脚本运行得非常好。只有当我使用 PHP mysql(i) 接口来执行脚本时——它才会失败。不加评论。
我使用 MySQL 工作台为我生成的过程创建脚本;也就是说,它有这样的模式:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
在脚本的开头,然后对每个过程重复:
DELIMITER $$
USE `dbname`$$
CREATE PROCEDURE `procname`(IN inputparameters)
BEGIN
...程序在这里
;
END$$
DELIMITER ;
如果从 MySQL Workbench 运行,此脚本可以正常工作。如果我从 mysql 命令行尝试相同的操作,它也运行良好。但是当我通过 PHP mysqli 接口执行它时它无法完成任何事情(使用 mysqli_multi_query 执行它,这对于创建和填充数据库的其他脚本来说很好)。界面上没有返回错误,没有结果(!)。 我得到的只是“假”,仅此而已。错误代码为 0,没有错误信息。
对我来说这是一个很大的 WTF,我希望你能指出我正确的方向 - 我该如何解决这个问题并从 PHP 安装程序?
PS:root/admin 访问权限已提供并验证(毕竟,我只是使用相同的连接创建了数据库、创建了用户、插入了表等等)。
【问题讨论】:
-
尝试删除使用'dbname'。如果使用 mysqli_query 命令,也可以尝试运行。
-
我确实删除了那个 USE 语句,没有效果。 mysqli_query 也失败了——在这种情况下,原因很明显:字符串包含多个语句,所以如果它正在正确执行,它将返回多个结果——mysqli_query 无法处理。 - 对于其他脚本,mysqli_multi_query 工作得非常好,为每个语句返回一个结果行。 (成功时为空行,注意:1051 行作为对 SHOW WARNINGS 的反应; - 全部符合预期)。
-
我越来越接近 - 没有解决方案,但诊断。 DELIMITER 似乎是在客户端实现的 (!)。
-
您是否在双引号字符串中指定查询? PHP 可能会将
$$作为变量变量吃掉。 -
不,它们存储在我直接从文件中读取的字符串中,我检查了 $$ 替换。
标签: php mysql stored-procedures mysqli mysql-workbench