【问题标题】:mysqli_stmt::get_result() not working, PHP version updated and mysqlnd enabledmysqli_stmt::get_result() 不工作,更新 PHP 版本并启用 mysqlnd
【发布时间】:2016-12-14 16:10:08
【问题描述】:

我有一个 php 类/函数,允许我对数据库执行查询,然后返回结果的关联数组。

在我的本地开发环境 (MAMP) 上一切正常。

一旦我将站点移到了 godaddy Linux 共享主机上,我会收到以下错误:致命错误:调用 /home/username/public_html 中未定义的方法 mysqli_stmt::get_result() /dev.x-matcher.com/admin/classes/c_RequeteSQL.php146 行

我已按照以下文章 (https://ca.godaddy.com/help/enable-custom-php-modules-12036) 将 PHP 版本从原生 5.4 更改为 5.4,从而启用 mysqlnd 自定义扩展。

Godaddy CPANEL - Select PHP Version

一旦激活错误消失,但脚本仍然在同一个地方阻塞,所以仍然无法工作。

我还尝试保留 5.4 本机版本的 PHP 并上传一个自定义 php.ini 文件,我在其中添加了以下行:extension=php_mysqli_mysqlnd.so 但仍然无法正常工作...

我已经阅读了很多这样的帖子(stackoverflow.com/questions/8321096/call-to-undefined-method-mysqli-stmtget-result),但找不到任何解决我的问题的方法。

我知道我可以使用 bind_paramfetch 来解决这个问题,但我不想这样做,因为我的函数需要在关联中动态获取结果数组,然后返回数组。使用 bind_param 会强制我输入变量,并且由于返回变量的数量永远不会相同,具体取决于请求它不是我正在寻找的解决方案..

如果你点击这个链接,你可以看到我的 phpinfo:dev.x-matcher.com/phpinfo.php

正如解释的那样,我的整个编码在我的本地环境中 100% 工作,但这是我的课程以防万一:

class RequeteSQL {
    private $dbhost = 'localhost';
    private $dbuser = 'user';
    private $dbpass = 'pass';


    function retourArray($requete,$lettres,$parametres){

        global $dbhost;
        global $dbuser;
        global $dbpass;
        $basededon = "db";

        $connection = new mysqli($dbhost,$dbuser,$dbpass,$basededon);
        $statement = $connection->prepare($requete);
        if ($statement === false) {
            trigger_error('Probleme avec la requete SQL :' . $requete . ' Erreur code : ' . $connection->error, E_USER_ERROR);
        } else {
            if ($parametres!=NULL) {
                if (is_array($parametres)) {

                    $a_params = array();
                    $param_type = '';
                    $n = count($lettres);
                    for ($i = 0; $i < $n; $i++) {
                        $param_type .= $lettres[$i];
                    }

                    $a_params[] = & $param_type;

                    for ($i = 0; $i < $n; $i++) {
                        $a_params[] = & $parametres[$i];
                    }

                    call_user_func_array(array($statement, 'bind_param'), $a_params);
                } else {
                    $statement->bind_param($lettres,$parametres);
                }

            }

            $statement->execute();
            $resultat = $statement->get_result();
            $resultarray = $resultat->fetch_all(MYSQLI_ASSOC);
            $statement->close();
            $connection->close();

            return $resultarray;
        }
    }

    function __destruct(){

    }
}

我在服务器上做错了什么,所以 php_mysqli_mysqlnd 无法正常工作,或者是否有支持此扩展的托管服务?

【问题讨论】:

  • “脚本仍然在同一个地方阻塞”是什么意思。没有错误?会发生什么?
  • 是的,这真的很奇怪。以下错误“致命错误:在第 146 行的 /home/username/public_html/dev.x-matcher.com/admin/classes/c_RequeteSQL.php 中调用未定义的方法 mysqli_stmt::get_result()”只是消失但没有改善停在同一个地方。 (*对不起英语不是我的第一语言)
  • 我使用 bind_param 进行了测试,并使用预先选择的请求获取并获得了正确的变量,将相同的请求与 get_result 一起使用,但一无所获。正如所解释的,虽然请求永远不会相同(通过另一个脚本动态发送)所以对我不起作用......
  • 当您拨打phpinfo() 时,mysqlnd 会出现吗?还要确保启用错误报告并将其设置为E_ALL
  • mysqlnd 显示已启用,我刚刚将 php.ini 更新为 E_ALL 和 E_NOTICE。仍然没有错误消息,但它可能必须刷新

标签: php mysqli


【解决方案1】:

由于找不到答案,我决定将代码更改为使用 PDO 而不是 mysqli。它工作得很好。由于我会说法语并用法语阅读我的教程,因此我无法将您发送到适当的教程。但是有很多资源可以使用 PDO。这很容易。希望这会有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多