PHP - Error en la función fetch_assoc()

 
Vista:

Error en la función fetch_assoc()

Publicado por pedro (1 intervención) el 31/01/2017 01:22:25
!Hola a todos estoy siguiendo el tutorial POO Y MVC EN PHP pasteado en la sección cursos y manuales de la web del programador aquí el link. http://www.lawebdelprogramador.com/cursos/PHP/8501-POO-y-MVC-en-PHP.html
y puse en practica el ejemplo de ABM de usuarios mostrado en el tutorial, creando la BD y la tabla, con los nombres y atributos correspondientes al ejercicio, pero al momento de poner en ejecución el archivo abm_example.php, presenta el siguiente error:

"Fatal error: Call to a member function fetch_assoc() on a non-object", en referencia a el procedimiento get_results_from_query() de la clase abstracta DBAbstractModel,

Aqui el código del procedimiento:
1
2
3
4
5
6
7
8
9
#Traer resultados de una consulta en un array
    protected function get_results_from_query(){
    	$this->open_connection();
    	$result = $this->conn->query($this->query);
    	while ($this->rows[] = $result->fetch_assoc());
    		$result->close();
    		$this->closed_connection();
    		array_pop($this->rows);
    }

acá dejo el código de los tres archivos que componen el ejercicio. Agradezco de antemano cualquier colaboración que me ayude a corregir y por ende a comprender mejor el porque de este error.

código completo del ejercicio:

Archivo db_abstract_model.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
abstract class DBAbstractModel {
private static $db_host = 'localhost';
private static $db_user = 'usuario';
private static $db_pass = 'contraseña';
protected $db_name = 'mydb';
protected $query;
protected $rows = array();
private $conn;
# métodos abstractos para ABM de clases que hereden
abstract protected function get();
abstract protected function set();
abstract protected function edit();
abstract protected function delete();
# los siguientes métodos pueden definirse con exactitud
# y no son abstractos
# Conectar a la base de datos
private function open_connection() {
$this->conn = new mysqli(self::$db_host, self::$db_user,
self::$db_pass, $this->db_name);
}
# Desconectar la base de datos
private function close_connection() {
$this->conn->close();
}
# Ejecutar un query simple del tipo INSERT, DELETE, UPDATE
protected function execute_single_query() {
$this->open_connection();
$this->conn->query($this->query);
$this->close_connection();
}
# Traer resultados de una consulta en un Array
protected function get_results_from_query() {
$this->open_connection();
$result = $this->conn->query($this->query);
while ($this->rows[] = $result->fetch_assoc());
$result->close();
$this->close_connection();
 array_pop($this->rows);
}
}
?>

Archivo usuarios_model.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
require_once('db_abstract_model.php');
class Usuario extends DBAbstractModel {
public $nombre;
public $apellido;
public $email;
private $clave;
protected $id;
function __construct() {
$this->db_name = 'book_example';
}
public function get($user_email='') {
if($user_email != ''):
$this->query = "
SELECT id, nombre, apellido, email, clave
FROM usuarios
WHERE email = '$user_email'
";
$this->get_results_from_query();
endif;
if(count($this->rows) == 1):
foreach ($this->rows[0] as $propiedad=>$valor):
$this->$propiedad = $valor;
endforeach;
endif;
}
public function set($user_data=array()) {
if(array_key_exists('email', $user_data)):
$this->get($user_data['email']);
if($user_data['email'] != $this->email):
foreach ($user_data as $campo=>$valor):
$$campo = $valor;
endforeach;
$this->query = "
INSERT INTO usuarios
(nombre, apellido, email, clave)
VALUES
('$nombre', '$apellido', '$email', '$clave')
";
$this->execute_single_query();
endif;
endif;
}
public function edit($user_data=array()) {
foreach ($user_data as $campo=>$valor):
$$campo = $valor;
endforeach;
$this->query = "
UPDATE usuarios
SET nombre='$nombre',
apellido='$apellido',
clave='$clave'
WHERE email = '$email'
";
$this->execute_single_query();
}
public function delete($user_email='') {
$this->query = "
DELETE FROM usuarios
WHERE email = '$user_email'
";
$this->execute_single_query();
}
function __destruct() {
unset($this);
}
}
?>

Archivo abm_example.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
require_once('usuarios_model.php');
# Traer los datos de un usuario
$usuario1 = new Usuario();
$usuario1->get('user@email.com');
print $usuario1->nombre . ' ' . $usuario1->apellido . ' existe<br>';
# Crear un nuevo usuario
$new_user_data = array(
'nombre'=>'Alberto',
'apellido'=>'Jacinto',
'email'=>'albert2000@mail.com',
'clave'=>'jacaranda'
);
$usuario2 = new Usuario();
$usuario2->set($new_user_data);
$usuario2->get($new_user_data['email']);
print $usuario2->nombre . ' ' . $usuario2->apellido . ' ha sido creado<br>';
# Editar los datos de un usuario existente
$edit_user_data = array(
'nombre'=>'Gabriel',
'apellido'=>'Lopez',
'email'=>'marconi@mail.com',
'clave'=>'69274'
);
$usuario3 = new Usuario();
$usuario3->edit($edit_user_data);
$usuario3->get($edit_user_data['email']);
print $usuario3->nombre . ' ' . $usuario3->apellido . ' ha sido editado<br>';
# Eliminar un usuario
$usuario4 = new Usuario();
$usuario4->get('lei@mail.com');
$usuario4->delete('lei@mail.com');
print $usuario4->nombre . ' ' . $usuario4->apellido . ' ha sido eliminado';
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Error en la función fetch_assoc()

Publicado por xve (6935 intervenciones) el 31/01/2017 08:57:08
Hola Pedro, puede ser que no te devuelve ningún registro por que la consulta (query) de algún error?

Prueba a hacer un echo de $result haber que te devuelve...
1
echo $result;
Según el error, no debería de devolverte un objeto, sino que creo que te devuelve false.

También revisa que te de devuelve $this->query y ejecuta la consulta en phpmyadmin, haber si funciona correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Error en la función fetch_assoc()

Publicado por pedronet (1 intervención) el 02/02/2017 21:38:43
Muy bueno el aporte, hice la prueba de las consulta en la BD y funcionaron bien, y con el código
1
echo $result ;
, me dio como resultado falso por lo que comencé a buscar y encontré un error de sintaxis en una de las variables que se pasa como argumento en los procedimientos set y get de la clase Usuario; reilase las correcciones y todo funciona bien Gracias por la ayuda!.

Hago la aclaración de que el código que mostré sobre el ejercicio esta correcto y no presenta errores, puesto que lo copie directamente desde el pdf del tutorial.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar