【问题标题】:What does Apache need to support both mysqli and PDO?Apache 需要什么来支持 mysqli 和 PDO?
【发布时间】:2009-10-26 16:50:44
【问题描述】:

我正在考虑更改一些 PHP 代码以使用 PDO 而不是 mysqli 进行数据库访问(因为 PDO 语法对我来说更有意义并且与数据库无关)。为此,我需要在进行转换时同时使用这两种方法。

我的问题是:到目前为止,任何一种方法都会使 Apache 崩溃

现在我在 Windows XP 和 PHP 版本 5.2.8 中使用 XAMPP。 Mysqli 工作正常,这样也可以:

$dbc = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
echo 'Connected to database';
$sql = "SELECT * FROM `employee`";

但是这一行会使 Apache 崩溃:

$dbc->query($sql);

我不想重做整个 Apache 或 XAMPP 安装,但我希望 PDO 能够正常工作。所以我尝试从here 更新libmysql.dll,正如oddvibes 推荐的here。这使我的简单 PDO 查询工作正常,但随后 mysqli 查询使 Apache 崩溃。

(在那之后我也尝试了更新php_pdo_mysql.dllphp_pdo.dll的建议,但没有效果。)

测试用例

我创建了这个测试脚本来比较 PDO 和 mysqli。对于libmysql.dll 的旧副本,如果$use_pdo 为真,则它会崩溃,如果为假则不会。对于libmysql.dll 的新副本,情况正好相反。

if ($use_pdo){
  $dbc = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
  echo 'Connected to database<br />';
  $sql = "SELECT * FROM `employee`";
  $dbc->query($sql);
  foreach ($dbc->query($sql) as $row){
    echo $row['firstname'] . ' ' . $row['lastname'] . "<br>\n";
  }

}
else {
  $dbc = @mysqli_connect($hostname, $username, $password, $dbname) OR die('Could not connect to MySQL: ' . mysqli_connect_error());
  $sql = "SELECT * FROM `employee`";
  $result = @mysqli_query($dbc, $sql) or die(mysqli_error($dbc));

  while ($row = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
    echo $row['firstname'] . ' ' . $row['lastname'] . "<br>\n";
    }
}

Apache 需要什么来支持这两种数据库查询方法?

【问题讨论】:

  • 崩溃?错误日志中有任何内容吗?
  • “崩溃”究竟是什么意思?
  • “崩溃”表示 Windows 提示“Apache HTTP Server 遇到问题,需要关闭。对于给您带来的不便,我们深表歉意”,页面什么也没有显示。
  • error.log 没有显示任何对我来说不寻常的东西——比如“创建子进程”和“启动工作线程”。我认为这是我在更改这些文件后重新启动它的地方。
  • 这是您查询的结果吗?也许某些特定于您的员工表?您是否尝试过其他表或带有虚拟数据的简单“testschema”表?

标签: php apache pdo mysqli


【解决方案1】:

不是一个直接的答案,但也许它可以帮助您搜索它:

旧版 mysql 扩展(以mysql_ 为前缀的函数)是对 libmysqlclient 的精简包装。新的 mysqli 扩展基本相同,但它实现了一些在更高版本的 libmysqlclient 中引入的功能。 PDO 也使用 libmysqlclient,但不像其他扩展那样直接映射它。这都相当于 3 个不同的 php 扩展,它们都引用同一个本地库。如果其中一些人对库的版本做出假设,可能会导致它们发生冲突。

我建议您安装最新版本的 libmysqlclient.dll,您可以找到并尝试禁用旧版 mysql 扩展(如果您还没有的话)。

如果你有使用 mysql 扩展的代码,你可以让 mysqli 绑定到这些函数,它应该可以工作。

另外,请确保由于某种原因没有安装新的 mysqlnd 驱动程序。 mysqlnd 是 libmysqlclient 的替代实现,它实际上只是让一切变得更加复杂。

是的,真是一团糟。

【讨论】:

  • 有趣的解释。但是,我在 xampp/php 或 xampp/apache/bin 目录中都没有看到 libmysqlclient.dll。我也没有在下载的 php 包中看到它。
  • 检查它是否在c:\windowsc:\windows\system32 中。否则它可能会被静态编译到扩展中(然后我不知道如何进行)。
【解决方案2】:

您似乎只需要取消注释php.ini 中正确的extension 指令,例如extension=php_mysqli.dllextension=php_pdo_mysql.dll

我从未使用 XAMPP 确认过这一点,因为我对此感到沮丧并决定单独安装 Apache、PHP 和 MySQL。在此过程中,我学会了执行上述步骤以及许多其他事情。所以我还没有确认这将与 XAMPP 一起使用,但我不明白为什么不能,除非它没有配备正确的驱动程序。

上面示例指令中的两个驱动程序(.dll 文件)是我正在使用的。我还在php.ini 中设置了extension_dir = "c:/php/ext" - 您应该确保路径指向您的php 扩展所在的目录。 (请注意,单独安装这些组件的好处之一是我可以将 PHP 放在 c:\php 中,而不是将它埋在 c:\xampp 的深处。)

如果有人想单独安装您的服务器组件,请在我的博客上documented the whole process, with screenshots

【讨论】:

    【解决方案3】:

    Why does this pdo::mysql code crash on windows?

    但暂时没有解决办法

    仅在“SELECT * FROM xxx”查询()和准备/执行时发生崩溃

    【讨论】:

      【解决方案4】:

      我找到的独特解决方案:

      从 5.0.51a 包安装 LibMySQL.DLL(使用最新的 5.1.44 MySQL 版本)

      http://www.netfulvpc.fr/files/libmysql_dll.zip

      【讨论】:

        【解决方案5】:

        好的,我有一个非常糟糕但可行的解决方案:p)

        使用十六进制编辑器打开 ext\php_pdo_mysql.dll

        搜索“83 C3 50”偏移量 0x000024d5(在 php 5.2.12 vc6 中)

        替换为 83 C3 "54"

        问题是结构大小不好...(struct pdo_column_data)

        我试图在 libmysql.dll 中修复该问题,但导致 php_mysqli 崩溃;)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-05
          • 1970-01-01
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 2019-12-09
          • 2017-08-19
          相关资源
          最近更新 更多