【发布时间】:2015-10-12 06:47:19
【问题描述】:
我的托管服务提供商安装了 PHP 5.3,但没有安装 mysqlnd,因此当我调用 mysqli_stmt_get_result() 时它会返回错误
是否有任何解决方法可以在无需安装 mysqlnd 的情况下实现相同的功能?
我不想改变 100 的功能,如果有更简单的方法,任何帮助将不胜感激:)
【问题讨论】:
我的托管服务提供商安装了 PHP 5.3,但没有安装 mysqlnd,因此当我调用 mysqli_stmt_get_result() 时它会返回错误
是否有任何解决方法可以在无需安装 mysqlnd 的情况下实现相同的功能?
我不想改变 100 的功能,如果有更简单的方法,任何帮助将不胜感激:)
【问题讨论】:
我在没有 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;
}
?>
【讨论】:
这个相关问题有另一种解决方法,可以在不安装 mysqlnd 的情况下获取数据。它将数据放入关联数组中。
【讨论】:
大安的解决方案非常好!为此,我不得不说声谢谢!
关键是,基于此,我开发了一个与 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);
我会把这个作为大安回答的子帖子,但我的名声太小了。
【讨论】: