mysqlnd

Alternativa para métodos do drive mysqlnd

Share Button

Eu estava usando no localhost dois métodos do drive mysqlnd, que são: get_result e fetch_assoc.

Acontence que se o seu servidor não possui esse drive, irá dar uma mensagem de erro como estas:

Fatal error: Call to undefined method mysqli_stmt::get_result()
Fatal error: Call to undefined method mysqli_stmt::fetch_assoc()

Procurando na internet achei no manual do PHP uma alternativa para esses métodos. O link para o comentário está aqui.

Mas ela não me servia visto retornar uma Array com índices numéricos, e não uma Array associativa, que eu queria. Por isso adaptei ela para funcionar como o método fetch_assoc.

Vamos ver o código

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}

$servidor = 'endereço do servidor';
$usuario = 'nome do usuário';
$senha = 'senha';
$banco = 'banco de dados';

Aqui definimos uma função que será usada mais tarde para transformar um objeto em Array. Também atribuímos à variáveis os dados do banco de dados: endereço, usuário, senha e nome do banco de dados.

$mysqli = new mysqli($servidor, $usuario, $senha, $banco);
if (mysqli_connect_errno()) trigger_error(mysqli_connect_error());

if($mysqli -> connect_errno > 0){
    die('Sem conexão com banco de dados [' . $mysqli->connect_error . ']');
}

Aqui atribuímos à variável $mysqli um objeto mysqli com os dados anteriores, para trabalharmos com ela mais adiante.

class iimysqli_result
{
	public $stmt, $nCols, $colsNames;
}

function iimysqli_stmt_get_result($stmt)
{
	$metadata = mysqli_stmt_result_metadata($stmt);
	$ret = new iimysqli_result;
	if (!$ret) return NULL;

	$ret->nCols = mysqli_num_fields($metadata);
	$ret->stmt = $stmt;
	
	$ret->colsNames = Array();
	$colsNames = mysqli_fetch_fields($metadata);
	foreach($colsNames as $n) {
		$nn = stdToArray($n);
		$ret->colsNames[] = $nn['name'];
	}

	mysqli_free_result($metadata);
	return $ret;
}

function iimysqli_result_fetch_assoc(&$result)
{
	$ret = array();
	$code = "return mysqli_stmt_bind_result(\$result->stmt ";

	for ($i=0; $i<$result->nCols; $i++) {
		$colName = $result -> colsNames[$i];
		$ret[$colName] = NULL;
		$code .= ", \$ret['" .$colName ."']";
	}

	$code .= ");";
	if (!eval($code)) {
		return NULL;
	}

	if (!mysqli_stmt_fetch($result->stmt)) {
		return NULL;
	}

	return $ret;
}

Aqui estão as funções iimysqli_stmt_get_result e iimysqli_result_fetch_assoc, alternativas aos métodos get_result e fetch_assoc respectivamente.

$sql = "SELECT * FROM nome_da_tabela";
if ($stmt = $mysqli->prepare($sql)) {
	$stmt->execute();
	$result = iimysqli_stmt_get_result($stmt);
	while ($r = iimysqli_result_fetch_assoc($result)) {
		print_r($r);
	}
}

Aqui está o uso das funções iimysqli_stmt_get_result e iimysqli_result_fetch_assoc. Você pode perceber que é a mesma coisa que usar os métodos, mas funciona sem o mysqlnd.

Share Button

Warning: count(): Parameter must be an array or an object that implements Countable in /home/filipeteixeira/www/blog/wp-includes/class-wp-comment-query.php on line 399