【问题标题】:Call to undefined method mysqli_stmt::get_result() AND mysqlnd installed调用未定义的方法 mysqli_stmt::get_result() 并安装了 mysqlnd
【发布时间】:2015-06-23 14:21:37
【问题描述】:

正如标题所示,我在运行 PHP 5.4 版的共享主机服务器上安装了 mysqlnd。当我尝试调用 mysqli get_result() 函数时,我得到了这个错误。

我与托管服务提供商谈过几次,最近他们告诉我尝试运行

# /opt/ntphp/php54/bin/php -i | grep -i mysqlnd

我跳上 ssh 并运行了这个命令:

mysqlnd
mysqlnd => enabled
Version => mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $
Loaded plugins => mysqlnd,example,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password
mysqlnd statistics =>  
Client API version => mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $

所以,在我看来,正如我所期望的那样。

我在另一个论坛帖子上发现了另一段建议运行的 PHP 代码:

$hasMySQL = false; $hasMySQLi = false; $withMySQLnd = false; $sentence = '';

if (function_exists('mysql_connect')) {
    $hasMySQL = true;
    $sentence.= "(Deprecated) MySQL <b>is installed</b> "; } else
    $sentence.= "(Deprecated) MySQL <b>is not</b> installed ";

if (function_exists('mysqli_connect')) {
     $hasMySQLi = true;
     $sentence.= "and the new (improved) MySQL <b>is installed</b>. "; } else
     $sentence.= "and the new (improved) MySQL <b>is not installed</b>. ";

 if (function_exists('mysqli_get_client_stats')) {
     $withMySQLnd = true;
     $sentence.= "This server is using MySQLnd as the driver."; } else
     $sentence.= "This server is using libmysqlclient as the driver.";

 echo $sentence;

我这样做并得到了结果:

(已弃用)安装 MySQL 并安装新的(改进的)MySQL。此服务器使用 libmysqlclient 作为驱动程序。

我正在使用 Arvixe 运行我的主机,他们有一篇博客文章基本上说“运行 PHP 5.4,这将起作用”。我很清楚他们认为这个函数应该运行,但它却给了我一个致命错误。

附注 - 代码在我的本地机器上完美运行,我只在调用 get_result() 时遇到错误。

编辑:

以下是 PHP 的设置方式:

$stmt = $con->prepare("SELECT * FROM User_Details WHERE LCASE(username) = LCASE(?) LIMIT 1");
  $stmt->bind_param("s", $username);
  $stmt->execute();
  $result = $stmt->get_result(); // This line throws the ugly error

【问题讨论】:

  • 我想知道您是否在 CLI 上使用了与 Apache(或任何网络服务器)正在使用的不同 PHP 版本。制作一个包含&lt;?php phpinfo(); ?&gt; 的php 文件,然后查看您正在运行的PHP 版本,并查看mysqlnd 是否存在。也许您需要编辑一个 ini 文件或其他东西来正确设置它。
  • PHP 版本 5.4.27 和 mysqlnd 版本 mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $
  • 请包含您的测试脚本,您是如何构建引发错误的东西的?
  • 我进行了编辑以显示导致错误的代码块。这是一个非常基本的脚本。我怀疑服务器上的 mysqlnd 有问题。烦人的部分是 Arvixe 一直给我发电子邮件说“只需切换到 PHP 5.x 版,然后它就可以工作”而且它从来没有......

标签: php mysqli


【解决方案1】:

对于任何想知道这是怎么回事并使用 Arvixe 的人。这是我从工作人员那里收到的回复。

这是关于 MySQLND 的一些混淆,这是由旧的 平台以及我将与我的员工交流的内容。

我们曾经运行一个允许我们拥有个人 PHP 的系统 安装,此时 5.4 和 5.5 都运行了 MysqlND。这 我们拥有的新 PHP 系统以一致的方式运行所有 PHP 安装 配置,因此我们的 PHP 5.3 安装(基本安装)不是 使用 MySQLND 也不会安装我们的 5.4 或 5.5。

这将在未来进行审查,因为 PHP 5.6 将使用 MySQLND 作为 一个默认值。

目前我们可以支持 MySQLND 的唯一方法是通过 VPS/专用 服务器。

因此,如果您使用的是 Arvixe 而不是 VPS,那么使用超级常用且推荐的约定从数据库中检索数据是不走运的。有很多不同的方法可以解决这个问题。它们要么对我的项目不可行,要么我无法让它们工作,但对于较小的查询,使用 $stmt->bind_result() 似乎是更流行的方法之一。 http://php.net/manual/en/mysqli-stmt.bind-result.php

对我来说,我将把我的业务带回给 GoDaddy。我花了 10 多个小时试图找到解决方案,但没有提供任何解决方案,除了“如果您不满意,我们有 60 天退款保证。”

感谢大家帮忙解决这个问题。令人沮丧的是,我在这个过程中以及从这些董事会中学到了很多东西......通常情况下。

【讨论】:

  • 感谢您的回答,我已经在godaddy中启用了带有php 5.6版本的mysqlnd,但仍然有这个问题
  • @Lokesh 你有没有解决你的问题?
【解决方案2】:

当您运行检查 PHP 环境的代码时,是通过网络服务器运行的吗?我问这个是因为听起来你还没有将你的网络服务器配置为使用 PHP 5.4(据称它有你想要的 mysqli 版本)。

您可能需要参考 Arvixe 的 this article

有趣的是,似乎the function that's causing trouble 自 PHP 5.3 起可用。

您也可以尝试一个简单的脚本来从网络查看环境

<?php
phpinfo();

从网络上点击并检查几件事

  • PHP 5.4 版
  • mysqlnd

就个人而言,我不确定 mysqlnd 是否需要提供 get_results 函数(但需要更深入地挖掘才能确定)。

你可以做的另一个测试来看看 Arvixe 的 PHP 5.4 环境是否提供了你感兴趣的功能是测试你知道有 mysqlnd 的 CLI 环境

/opt/ntphp/php54/bin/php -r 'echo method_exists("mysqli_stmt", "get_result") . PHP_EOL;'

如果出现1,您几乎可以肯定只需要按照我之前链接的指南让您的网络服务器环境运行 PHP 5.4。

【讨论】:

  • 感谢所有的挖掘工作。 Arvixe 的那篇文章是我开始这个探索的地方。我使用该指南将我的 PHP 从 5.3 更改为 5.4 和 5.5。我的 phpinfo 页面显示 mysqlnd 已安装,但顶部附近的“配置命令”部分中没有 mysqlnd 条目,就像在我的本地服务器上一样。我按照您的建议在 ssh 中运行了命令,但没有得到响应,所以该功能不可用?
  • 嗯,是的,听起来那个功能可能不存在;虽然看起来很奇怪,但我预计会这样。为了安全起见,也许也可以通过 ssh 试试这个 - /opt/ntphp/php54/bin/php --re mysqli | grep get_result。如果返回为空,则默认不可用。
  • Arvixe 现在让我在 5.5 中工作。我按原样运行您的命令,并将 54 替换为 55 并再次尝试。两者都没有返回。
  • 我现在看到我提到 mysqlnd 的那个 php 文档是必需的(之前对它上釉)。似乎他们的构建可以顶起一些东西?果然尝试了 2 种不同的 PHP 版本,一种没有 mysqlnd,而且该功能仅在我有 mysqlnd 的地方可用。
  • 是的,我已经从“我觉得很疯狂”变成了“我认为它必须在他们身上解决”。不确定这是否 100% 准确,但我当然无法弄清楚问题所在。
【解决方案3】:

移除现有的php版本,安装新版本的php 5.5或更高版本 并通过在根终端上进行验证 $ php -v

【讨论】:

  • 希望可以,我在共享而不是 VPS,所以我无法运行 root 命令。
  • 有趣的是,从 ssh 运行 php -v 会吐出 PHP 5.3.28,同时查看 phpinfo.php 会从同一目录中得到 5.5.11。知道这意味着什么吗?
  • @drewkroft 这是因为他们在 CLI 和网络服务器上都支持不同版本的 php。这就是为什么他们让你在 CLI 上使用 /opt/ntphp/php54/bin/php 来明确说“使用 PHP 5.4”。 php 本身在其系统的 CLI 上映射到 5.3。另外,听起来您目前在网络服务器上运行 5.5。
  • 我是因为 Arvixe 刚刚告诉我回到 5.5。他们说 mysqlnd 在 5.5 上是原生的,并且 get_result() 应该在那里可用。
  • 我不相信 mysqlnd 是 5.5 的原生版本,因为我的笔记本电脑上有 5.5 版本,没有 mysqlnd 或 mysqli::get_result。听起来无论出于何种原因,您获得的 PHP 版本都没有启用 mysqlnd。我正在查看是否有运行时设置来启用它,如果有多个驱动程序可用,但还没有找到任何东西。
猜你喜欢
  • 2014-08-15
  • 2022-01-11
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多