Mysqli get_result另类

Tim*_*imm 13 php mysqli

我刚刚使用mysqli将所有sql查询更改为准备好的语句.为了加快这个过程,我创建了一个performQuery替换的函数(被称为)mysql_query.它接受查询,绑定(如"sdss")和传入的变量,然后执行所有perpared语句.这意味着更改所有旧代码很容易.我的函数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'];
}
Run Code Online (Sandbox Code Playgroud)

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

这在localhost上工作正常,但我的web托管服务器没有mysqlnd可用,因此get_result()不起作用.安装mysqlnd不是一个选项.

从这里出发的最佳方式是什么?我可以创建一个替换的功能get_result(),以及如何?

Sop*_*rus 29

这是一个基于相同原则的更简洁的解决方案:

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;
}
Run Code Online (Sandbox Code Playgroud)

使用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
}
Run Code Online (Sandbox Code Playgroud)

没有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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 像魅力<3 (4认同)

lx.*_*lx. 7

我遇到了同样的问题并使用mysqli :: get_result的错误答案中提供的代码解决了它

我的功能现在看起来像这样(为清楚起见,错误处理被剥离):

  function db_bind_array($stmt, &$row)
  {
    $md = $stmt->result_metadata();
    $params = array();
    while($field = $md->fetch_field()) {
        $params[] = &$row[$field->name];
    }
    return call_user_func_array(array($stmt, 'bind_result'), $params);
  }

  function db_query($db, $query, $types, $params)
  {
    $ret = FALSE;
    $stmt = $db->prepare($query);
    call_user_func_array(array($stmt,'bind_param'),
                         array_merge(array($types), $params));
    $stmt->execute();

    $result = array();
    if (db_bind_array($stmt, $result) !== FALSE) {
      $ret = array($stmt, $result);
    }

    $stmt->close();
    return $ret;
  }
Run Code Online (Sandbox Code Playgroud)

用法如下:

  $userId = $_GET['uid'];
  $sql = 'SELECT name, mail FROM users WHERE user_id = ?';
  if (($qryRes = db_query($db, $sql, 'd', array(&$userId))) !== FALSE) {
    $stmt = $qryRes[0];
    $row  = $qryRes[1];

    while ($stmt->fetch()) {
      echo '<p>Name: '.$row['name'].'<br>'
             .'Mail: '.$row['mail'].'</p>';
    }
    $stmt->close();
  }
Run Code Online (Sandbox Code Playgroud)