所以我的主机没有为mysqli安装mysqlnd驱动程序,所以我无法使用get_result()
函数(并且它不是安装mysqlnd驱动程序的选项)。以下查询有哪些替代方法,以便我不使用get_result()
?
我知道我可以使用以下内容从数据库中获取单个结果:
if ($stmt = $cxn->prepare("SELECT `count` FROM `numbers` WHERE `count_id` = ?")) {
$stmt->bind_param('i', $count_id);
$stmt->execute();
$stmt->bind_result($count);
$stmt->fetch();
$stmt->close();
}
但是如果我必须从数据库中选择几个结果,循环遍历每个结果并得到另一个结果呢?
if ($stmt = $cxn->prepare("SELECT `count` FROM `numbers` WHERE `number` = ?")) {
$stmt->bind_param('i', $number);
$stmt->execute();
$result = $stmt->get_result(); // uses get_result()
}
if ($result->num_rows) { // uses get_result()
while ($row = $result->fetch_assoc()) { // uses get_result()
if($stmt = $cxn->prepare("SELECT `value` FROM `values` WHERE `number` = ?")) {
$stmt->bind_param('i', $row['count']);
$stmt->execute();
$stmt->bind_result($value);
$stmt->fetch();
$stmt->close();
}
}
}
我不能使用它,因为有些语句需要get_result()
,我无法使用。
我的替代方案是什么?
答案 0 :(得分:0)
试试这个,
if ($stmt = $cxn->prepare("SELECT `count` FROM `numbers` WHERE `count_id` = ?"))
{
$stmt->bind_param('i', $count_id);
$stmt->execute();
$result = $stmt->fetchAll();
if ( count($result) )
{
foreach($result as $row)
{
print_r($row);
}
}
else
{
echo "Nothing Returned.";
}
}
答案 1 :(得分:0)
我不完全确定为什么在某些PHP安装中不提供此功能,但是它使我陷入了一个项目,因此我已经实现了这种几乎是直接替代的方法。 该函数将“ mysqli_stmt”对象作为参数,并在该对象存在的情况下调用该方法。如果没有,它将利用'mysqli_result'类的部分实现(缺少一些我未使用的方法)。
'convert_array'函数处理与'$ mode'参数关联的所有数组合并功能。
function convert_array($assoc, $mode)
{
$outarray = [];
switch ($mode)
{
case MYSQLI_ASSOC:
foreach($assoc as $key => $value)
{
if (is_array($value))
$outarray[$key] = convert_array($value, $mode);
else
$outarray[$key] = $value;
}
return $outarray;
case MYSQLI_NUM:
$i = 0;
foreach($assoc as $key => $value)
{
if (is_array($value))
$outarray[$i] = convert_array($value, $mode);
else
$outarray[$i] = $value;
$i++;
}
return $outarray;
case MYSQLI_BOTH:
$i = 0;
foreach($assoc as $key => $value)
{
if (is_array($value))
$outarray[$key] = $outarray[$i] = convert_array($value, $mode);
else
$outarray[$key] = $outarray[$i] = $value;
$i++;
}
return $outarray;
}
return $outarray;
}
//drop in replacement for the sometimes missing (depending on version) 'stmt->get_result'
class proxy_result
{
public $current_field = 0;
public $field_count = 0;
public $lengths = 0;
public $num_rows = 0;
public $current_row = 0;
public $type = 0;
public $results = [];
function fetch_all ($resulttype = MYSQLI_NUM)
{
return convert_array($this->results, $resulttype);
}
//fetch row as associative array
function fetch_assoc()
{
if ($this->current_row < $this->num_rows)
return $this->results[$this->current_row++];
else
return null;
}
function fetch_array($resulttype = MYSQLI_BOTH)
{
return convert_array($this->fetch_assoc(), $resulttype);
}
};
function get_result( $stmt )
{
if (method_exists ($stmt ,'get_result'))
{
return $stmt->get_result();
}
else
{
$RESULT = array();
$stmt->store_result();
for ( $i = 0; $i < $stmt->num_rows; $i++ )
{
$Metadata = $stmt->result_metadata();
$PARAMS = array();
while ( $Field = $Metadata->fetch_field() )
{
$PARAMS[] = &$RESULT[ $i ][ $Field->name ];
}
call_user_func_array( array( $stmt, 'bind_result' ), $PARAMS );
$stmt->fetch();
$result = new proxy_result();
$result->num_rows = count($RESULT);
$result->field_count = count($RESULT[0]);
$result->results = $RESULT;
//$RESULT->num_rows = count($RESULT);
}
return $result;
}
}