调用未定义的方法mysqli_stmt :: get_result()和mysqlnd安装

时间:2015-06-23 14:21:37

标签: php mysqli

正如标题所示,我在运行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

3 个答案:

答案 0 :(得分:4)

任何人都想知道这是怎么回事,并使用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-&gt; bind_result()是一种比较流行的方法。 http://php.net/manual/en/mysqli-stmt.bind-result.php

对我来说,我把我的生意带回了GoDaddy。我花了10多个小时试图找到解决方案而没有提供解决方案,除了#34;如果你不满意,我们有60天的退款保证。&#34;

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

答案 1 :(得分:1)

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

您可能需要参考Arvixe的this article

有趣的是,从PHP 5.3开始,似乎the function that's causing trouble可用。

您也可以尝试使用简单的脚本从网上查看环境

<?php
phpinfo();

从网上点击并检查一些事情

  • PHP版本5.4
  • mysqlnd

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

你可以做的另一项测试,看看Arvixe的PHP 5.4环境实际上是否提供了感兴趣的功能,测试你知道有mysql的CLI环境

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

如果它吐出1,你几乎肯定只需要遵循我之前链接的指南,让你的网络服务器环境运行PHP 5.4。

答案 2 :(得分:1)

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