一尘不染

Mysqli get_result替代

php

我刚刚将所有SQL查询更改为使用mysqli的准备好的语句。为了加快此过程,我创建了一个函数performQuery,将其替换为mysql_query。它需要查询,绑定(如“
sdss”)和要传入的变量,然后执行所有准备好的语句。这意味着更改我所有的旧代码很容易。我的函数mysqli_result使用mysqli
返回一个对象get_result()

这意味着我可以从以下位置更改旧代码:

$query = "SELECT x FROM y WHERE z = $var";
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)){
    echo $row['x'];
}

$query = "SELECT x FROM y WHERE z = ?";
$result = performQuery($query,"s",$var);
while ($row = mysql_fetch_assoc($result)){
    echo $row['x'];
}

这在localhost上可以正常工作,但是我的网络托管服务器没有可用的mysqlnd,因此get_result()不起作用。不能安装mysqlnd。

从这里出发的最佳方法是什么?我可以创建一个替代的函数get_result()吗?


阅读 315

收藏
2020-05-26

共1个答案

一尘不染

这是基于相同原理的更整洁的解决方案:

function get_result( $Statement ) {
    $RESULT = array();
    $Statement->store_result();
    for ( $i = 0; $i < $Statement->num_rows; $i++ ) {
        $Metadata = $Statement->result_metadata();
        $PARAMS = array();
        while ( $Field = $Metadata->fetch_field() ) {
            $PARAMS[] = &$RESULT[ $i ][ $Field->name ];
        }
        call_user_func_array( array( $Statement, 'bind_result' ), $PARAMS );
        $Statement->fetch();
    }
    return $RESULT;
}

使用mysqlnd, 您通常可以执行以下操作:

$Statement = $Database->prepare( 'SELECT x FROM y WHERE z = ?' );
$Statement->bind_param( 's', $z );
$Statement->execute();
$Result = $Statement->get_result();
while ( $DATA = $Result->fetch_array() ) {
    // Do stuff with the data
}

而且 没有mysqlnd

$Statement = $Database->prepare( 'SELECT x FROM y WHERE z = ?' );
$Statement->bind_param( 's', $z );
$Statement->execute();
$RESULT = get_result( $Statement );
while ( $DATA = array_shift( $RESULT ) ) {
    // Do stuff with the data
}

因此用法和语法几乎相同。主要区别在于替换函数返回结果数组,而不是结果对象。

2020-05-26