【发布时间】:2014-11-14 15:46:18
【问题描述】:
我们的开发服务器中安装了 Wordpress 4.0。我们安装了Widgetkit(付费版),并且虽然配置了wordpress数据库(这意味着:WP安装可以顺利完成,我们可以访问管理后端并成功登录)。
但是,当尝试创建幻灯片(或画廊)时,它不起作用(它不存储在数据库中)。阅读日志(apache错误日志)后,我看到了这个错误:
PHP 警告:mysql_real_escape_string():在 /path/to/server/www/wp-content-plugins/widgetkit/helpers/widget.php 中,用户 'myserverstartuser'@'localhost' 的访问被拒绝(使用密码:NO)第90行,referer:http://my.server.dev/wp-admin/admin.php?page=widgetkit&task=save_slideshow
(myserverstartuser代表用于启动服务器的linux用户;默认为www-data)。
我去插件里面这样一行看到了:
'post_content' => mysql_real_escape_string(json_encode($data)),
这不是一个完整的行,而是一个语句的一部分。但是问题很明确:
- 没有为
mysql_real_escape_string函数传递链接,因此尝试建立和使用新链接。此外,没有打开之前的链接。 - 为了建立链接,
mysql_connect被调用,不带任何参数。 - 此类调用需要正确的参数(与 WP 安装中的参数相同),并且由于调用没有参数,因此每个参数都填充了默认值(从
ini_get获得的值)。 - [在整个插件文件夹中搜索后,我注意到]插件本身没有对
ini_set的任何调用,以确保mysql_connect的默认值与 wordpress 数据库配置中的值匹配。
AFAIK mysql 扩展已被弃用,但似乎这个插件使用它。 The documentation for mysql_connect 列出了我所说的 ini 值。
这意味着:mysql_real_escape_string 找不到任何链接,因此它尝试使用 ini 值打开一个新链接。插件永远不会设置此类 ini 值。这意味着,除非我遗漏了什么,否则插件不会链接到实际的 Wordpress 数据库设置。
问题:我所说的完全正确吗?我是否需要下载将数据库配置设置为 mysql 扩展的默认 ini 值的东西?还是我在插件配置中遗漏了什么?或者我应该为数据库配置中的每个参数手动调用ini_set?如果最后一个是答案:我应该把这样的电话放在哪里?
【问题讨论】: