【问题标题】:workaround for mysqlnd missing drivermysqlnd 缺少驱动程序的解决方法
【发布时间】:2015-10-12 06:47:19
【问题描述】:

我的托管服务提供商安装了​​ PHP 5.3,但没有安装 mysqlnd,因此当我调用 mysqli_stmt_get_result() 时它会返回错误

是否有任何解决方法可以在无需安装 mysqlnd 的情况下实现相同的功能?

我不想改变 100 的功能,如果有更简单的方法,任何帮助将不胜感激:)

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我在没有 mysqlnd 的服务器上遇到了很多麻烦,并且很头疼。

    如果您没有安装/加载任何 mysqlnd,您将在尝试调用 mysqli_stmt_get_result() 时获得未定义的引用。

    我写了自己的mysqli_stmt_get_result()mysqli_result_fetch_array() 来配合它。

    <?php
    class iimysqli_result
    {
        public $stmt, $nCols;
    }    
    
    function iimysqli_stmt_get_result($stmt)
    {
        /**    EXPLANATION:
         * We are creating a fake "result" structure to enable us to have
         * source-level equivalent syntax to a query executed via
         * mysqli_query().
         *
         *    $stmt = mysqli_prepare($conn, "");
         *    mysqli_bind_param($stmt, "types", ...);
         *
         *    $param1 = 0;
         *    $param2 = 'foo';
         *    $param3 = 'bar';
         *    mysqli_execute($stmt);
         *    $result _mysqli_stmt_get_result($stmt);
         *        [ $arr = _mysqli_result_fetch_array($result);
         *            || $assoc = _mysqli_result_fetch_assoc($result); ]
         *    mysqli_stmt_close($stmt);
         *    mysqli_close($conn);
         *
         * At the source level, there is no difference between this and mysqlnd.
         **/
        $metadata = mysqli_stmt_result_metadata($stmt);
        $ret = new iimysqli_result;
        if (!$ret) return NULL;
    
        $ret->nCols = mysqli_num_fields($metadata);
        $ret->stmt = $stmt;
    
        mysqli_free_result($metadata);
        return $ret;
    }
    
    function iimysqli_result_fetch_array(&$result)
    {
        $ret = array();
        $code = "return mysqli_stmt_bind_result(\$result->stmt ";
    
        for ($i=0; $i<$result->nCols; $i++)
        {
            $ret[$i] = NULL;
            $code .= ", \$ret['" .$i ."']";
        };
    
        $code .= ");";
        if (!eval($code)) { return NULL; };
    
        // This should advance the "$stmt" cursor.
        if (!mysqli_stmt_fetch($result->stmt)) { return NULL; };
    
        // Return the array we built.
        return $ret;
    }
    ?>
    

    【讨论】:

    • 它工作得很好,但只有一个缺点,它返回非键数组(即没有 assoc)
    【解决方案2】:

    这个相关问题有另一种解决方法,可以在不安装 mysqlnd 的情况下获取数据。它将数据放入关联数组中。

    Mysqli - Bind results to an Array

    【讨论】:

      【解决方案3】:

      大安的解决方案非常好!为此,我不得不说声谢谢!

      关键是,基于此,我开发了一个与 mysqlnd 一起工作的类,当它在那里时,当它丢失时,Daan 的替代方案。

      我已经内置了 fetchAssoc、fetchAllAssoc/Array、num_rows 作为方法。它仍在开发中,是 youphptube 的一部分。这可能也有助于 Ehab(希望 fetchAssoc)。

      https://github.com/DanielnetoDotCom/YouPHPTube/blob/master/objects/mysql_dal.php

      用法:

          $sql = "SELECT * FROM users WHERE id = ?";
          $res = sqlDAL::readSql($sql,"i",array($users_id)); 
          $fullData = sqlDAL::fetchAllAssoc($res);
          // $data = sqlDAL::fetchAssoc($res); $data2 = sqlDAL::fetchAssoc($res); // or like this
          // $countedRows = sqlDAL::num_rows($res); // or like this
          sqlDAL::close($res);
      

      我会把这个作为大安回答的子帖子,但我的名声太小了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 2021-10-05
        相关资源
        最近更新 更多