PHP 7.1.x - mysqli_connect 未定义(扩展已打开)

PHP 7.1.x - mysqli_connect Isn't Defined (Extension is turned on)

背景

我的 Windows 10 计算机上安装了 WAMP 服务器 (3.0.6)。我正在使用一些自定义 MySQL 表开发一个 WordPress 网站,所以我使用 $wpdb.

问题

我在 PHP 7.0.10 上 运行,一切正常。今天早上安装了PHP 7.1.4,突然报错:

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in ...\wp-includes\wp-db.php:1573

我深入研究并将问题追溯到 __construct() 函数,以及这个 if 语句:

if ( function_exists( 'mysqli_connect' ) ) {

var_dump 告诉我 function_exists( 'mysqli_connect' ) 正在返回 false

不是答案

问题是 不是 我没有启用 mysqli 扩展:

我尝试过的事情

我已切换回 7.0.x(错误消失),删除 7.1.4,重新安装 7.1.4,然后切换回它。还是不行。

我试过7.1.0,还是不行。

我试过打开和关闭扩展程序,但没有任何改变。

我已经尝试将实际的 php_mysqli.dll 文件从工作 7.0.10 目录复制到 7.1.4 目录,但这不起作用。

编辑

应要求,我添加了 phpinfo() 中所显示内容的屏幕截图。在 7.0 下,我看到了 mysqli 的信息部分,而在 7.1 下,该部分丢失了。

背景

首先,了解一下 WAMPServer 处理 php.ini 文件的方式。如果您使用 phpinfo(),您可能会注意到加载的 ini 文件的路径是 而不是 PHP 中的 ini 文件安装。它而是指向 Apache 安装。

但如果你看一下,它是一个 0KB symlink。实际上是 PHP 安装中的 link 到 ini 文件。但它不是 php.ini,而是指向 phpForApache.ini。所以这个:

...\wamp64\bin\apache\apache2.4.23\bin\php.ini

实际上是

...\wamp64\bin\php\php[VERSION]\phpForApache.ini

因此,您可以忽略 Apache 文件夹中的内容,而专注于 PHP 文件夹中的 ini 文件。但是,您不能忽略 php.ini。您需要更正两者。

感谢 Jon Stirling 建议检查 phpInfo() 中加载的配置文件。

我做了什么

我从 PHP 网站安装了 PHP 7.1,但忘记从 PHP 7.0 安装转移我的 ini 文件。我改为使用 PHP 网站提供的默认 ini 文件。

那没有用,因为在 ini 文件中有一些调整需要使 PHP 与 WAMP 一起工作。所以我从我的 7.0.x 文件夹中复制了两个 ini 文件,然后它开始工作,主要是,除了 mysqli 的错误。

我的问题的根本原因

为此苦苦思索了一个小时,Fred -ii-'s 终于找到了答案。我 PHP 试图引用旧的扩展文件。原因如下:

WAMP提供的php.ini文件和phpForApache.ini文件都硬编码了一些路径。例如,PHP 7.0.10 的扩展文件夹路径编码为:

extension_dir ="c:/wamp64/bin/php/php7.0.10/ext/"

我已经复制了 ini 文件,但它们指向 7.0 的扩展文件夹。 7.0.x 的 dll 文件不适用于 7.1.x.

回答

我进入 PHP 7.1.4 文件夹中的两个文件 (php.ini phpForApache.ini),并将文本“7.0.10”的所有实例全局替换为“ 7.1.4"。现在一切正常了。