我已经使用MySQL Workbench制定了许多存储过程。当使用MySQL Workbench将它们放入我的测试DB时,它们工作正常。

现在,我正在准备DB创建脚本进行部署,这是唯一给我麻烦的人。当我使用命令行 / mySQL外壳时,脚本非常适合。只有当我使用php mysql(i)接口执行脚本时,它才会失败。没有评论。

我将过程创建脚本用作MySQL Workbench为我生成的;也就是说,它具有这种模式:

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执行它,该脚本可用于创建和填充DB的其他脚本)。接口上没有错误,没有结果(!)。我得到的只是“错误”,仅此而已。错误代码为0,没有错误消息。

对我来说,这是一个很大的WTF,希望您能指向正确的方向 - 如何解决此问题并从PHP安装过程?

PS:给出并验证了root/admin访问(毕竟,我刚刚创建了具有相同连接的DB,创建的用户,插入表等)。

有帮助吗?

解决方案

我没有测试,但我不会感到惊讶 mysqli_multi_query() 期望每个查询都具有相同的定界符。尝试将存储过程创建包装在单个查询中,而无需使用定界符修饰符?

所以而不是

<?php
$results = mysqli_multi(
    'DELIMITER $$
    USE `dbname`$$
    CREATE PROCEDURE `procname`(IN inputparameters)
    BEGIN
    ... procedure goes here

    ;
    END$$
    DELIMITER ;
');
?>

只是这样做

<?php
$result = mysqli_query('CREATE PROCEDURE `procname`(IN inputparameters) BEGIN ...; END');

告诉我们它是否有效:)

其他提示

把它们加起来:

定界符是实现的客户端,而不是服务器侧。

如果您有一个好的驱动程序或API,则可能会考虑到这一点。截至目前,php mysql / mysqli却没有。

如果您需要使用其他定界符(例如,因为默认定界符出现在脚本内部),则必须自己编码/逃脱SQL或将其分解,以便您无需更改定界符。这里没有PHP的帮助。

定界符是MySQL客户端应用程序实际使用的东西。我相信客户端应用程序负责分解其发送给MySQL的查询。例如,这就是PhpMyAdmin所做的。

不用花整夜编写脚本将MySQL解析为查询,而是使用我编写的代码。您将在ScriptToqueries函数中找到它,此处:

http://wush.net/svn/luckyapps/pie/trunk/framework/classes/db/mysql.php

请享用

编辑:自从编写此答案以来,我将代码移植到了免费的Q平台中,您可以在其中研究代码: https://github.com/egreg/platform/blob/master/platform/classes/db/mysql.php#l824

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top