1

我在通过 PHP 运行的存储过程中遇到了一些问题,而且我已经连续四天摸不着头脑了。也许你可以帮助阐明这一点。

简而言之:我在本地计算机 ( spcTest) 上定义了一个存储过程。PHP 页面可以毫无问题地运行它,因此它返回一个单行记录集。当我在生产服务器上重新创建过程时,PHP 页面没有得到相同的结果。

我很确定这是一个权限问题,但我很难确定它。我可以通过 phpMyAdmin 访问生产服务器,这就是我运行所有创建脚本的地方。我还看到存储过程 spcTest 出现在生产中(使用SELECT * FROM ROUTINES),我也可以成功更新它。

当我运行以下命令时:

SHOW GRANTS FOR triis@localhost;

这些是我分别在开发服务器和生产服务器上得到的结果:

~~~=== 在开发服务器上===~~~

GRANT ALL PRIVILEGES ON *.* TO 'triis'@'localhost' IDENTIFIED BY PASSWORD '*F05[~~(snip)~~]72'

GRANT ALL PRIVILEGES ON `tri_is`.* TO 'triis'@'localhost'

~~~=== 在生产服务器上===~~~

GRANT USAGE ON *.* TO 'triis'@'localhost' IDENTIFIED BY PASSWORD '*F05[~~(snip)~~]72'

GRANT ALL PRIVILEGES ON `tri_is`.* TO 'triis'@'localhost'

注意GRANT USAGE开发端不存在的 -line 的差异。我已经阅读了 mySQL 文档,但可能错过了答案……简而言之,我的问题是:生产服务器上的权限是否如上所示,是否允许执行任何存储过程,包括spcTest

对我来说,用户似乎不triis应该有执行权限,因为EXECUTE没有特别提到 - 属性。但是看到-command 在生产和开发服务器(尤其是双方)SHOW GRANTS上返回惊人相似的结果,我有点困惑为什么 PHP 代码只能在开发端工作。ALL PRIVILEGES

如果这被证明是生产中的权限问题,是否GRANT CREATE ROUTINE, EXECUTE ON * TO triis@'localhost'有助于为此以及任何未来的存储过程提供执行权限?

谢谢你的时间!:)

4

1 回答 1

2

这不是我最初认为的权限问题,而是在存储过程 ( )中UPDATE运行的 -statement中发生的错误。SP

该错误源于表名(正在更新)区分大小写,以及开发和生产环境中的大小写不匹配。存储过程在phpMyAdmin中运行时没有直接报错,我没有资源在生产服务器上运行它的 mySQL shell 进行进一步调查。在 PHP 中运行SP进行诊断并没有帮助,虽然似乎拥有SP在两个环境中运行 s 的完全权限,但仍然只能在开发方面获得结果,这让我感到困惑。

每日一课:虽然反引号很难打字(至少在冰岛语键盘上),但最好立即将它们包括在内。另一种选择是不在您的表名或过程中使用驼峰式大小写。通过 phpMyAdmin 生成 mySQL-scripts 将添加刻度并且区分大小写。仅在您的一个环境中运行生成的脚本可能会导致仍在开发中的脚本出现问题(而不是生成的批处理的一部分)。

于 2012-11-12T16:06:36.880 回答