(Mal)utilizando mysqli orientado a objetos

Awer
04 de Febrero del 2005
Hola, qué tal.

A ver si me podéis echar una mano con este problema. Tengo una página PHP (index.php) con las siguientes líneas:



...
$sentenciaSQL = "SELECT * FROM articulo ORDER BY fecha DESC";
$bd = new GestionBDMySql();
$bd->conecta();
$registros = $bd->ejecutaSQL($sentenciaSQL);
while ($registro = $bd->devuelveSiguienteRegistro($registros)) {
...
}
...


Al cargar la página, salta el siguiente error:


Fatal error: Call to a member function fetch_assoc() on a non-object in C:\[...]\GestionBDMySql.php on line 24


El archivo GestionBDMySql.php es un fichero PHP que contiene, exclusivamente, la definición de una clase con el mismo nombre (GestionBDMySql).
Aquí tenéis el código de dicho script:

<?php
class GestionBDMySql {
private $conexion;
/////////////////
/////////////////
function __get($con) {
return $this->conexion;
}
/////////////////
function conecta() {
$this->conexion = new mysqli("servidor", "usuario", "clave");
$this->conexion->select_db("bd");
}
/////////////////
function desconecta() {
$this->conexion->close();
}
/////////////////
function devuelveNumeroRegistros($registros) {
return $registros->num_rows();
}
/////////////////
function devuelveSiguienteRegistro($registros) {
return $registros->fetch_assoc(); <--- Ésta es la línea 24
}
/////////////////
function ejecutaSQL($cadenaSQL) {
return $this->conexion->query($cadenaSQL);
}
/////////////////
function liberaRegistros($registros) {
$registros->free();
}
}
?>

Supongo, según el mensaje de error, que el intérprete PHP no reconoce a la variable $registros como un conjunto de registros (dicho de otra forma, no lo considera un objeto). En la tabla articulo hay registros, por lo que evitamos un valor NULL. ¿Se os ocurre cuál puede ser el motivo del fallo?

Añadir que el error lo da, como podéis ver, dentro de la función devuelveSiguienteRegistro($registros), con lo que el problema no se encuentra en la falta de reconocimiento del archivo GestionBDMySql.php o del módulo mysqli.dll (por ejemplo, la línea $bd->conecta(); funciona sin problemas).

Muchas gracias por adelantado.

eth0
04 de Febrero del 2005
Podrías haber dicho que estás usando otra clase para hacer la conexión a la base de datos:

$this->conexion = new mysqli("servidor", "usuario", "clave");

¿Por qué no miras mejor la documentación de la clase mysqli?

geobasis
04 de Febrero del 2005
Para recorrer un conjunto de registros mejor en el while $registro = mysql_fetch_objetc o fetch_array y no te hagas lios eso hace lo que tu estas intentando simular un recordset de Ado, cualquier duda escibeme a mi mail [email protected].