我刚刚将所有SQL查询更改为使用mysqli的准备好的语句。为了加快此过程,我创建了一个函数performQuery,将其替换为mysql_query。它需要查询,绑定(如“ sdss”)和要传入的变量,然后执行所有准备好的语句。这意味着更改我所有的旧代码很容易。我的函数mysqli_result使用mysqli 返回一个对象get_result()。
performQuery
mysql_query
mysqli_result
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()吗?
这是基于相同原理的更整洁的解决方案:
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 }
因此用法和语法几乎相同。主要区别在于替换函数返回结果数组,而不是结果对象。