PHP - Fatal error: Call to a member function fetchArray() on boolean in

   
Vista:

Fatal error: Call to a member function fetchArray() on boolean in

Publicado por alek (4 intervenciones) el 17/05/2017 21:11:01
Hola antes de empezar debo mencionar que apenas estoy comenzando con php y que agradezco de antemano cualquier ayuda u orientacion que me puedan dar.

Y bueno entrando ya en tema lo que estoy haciendo es un curso de php y en el estoy desarrollando como ejemplo una aplicacion que me permite guardar favoritos, y dentro de la aplicacion hay una script para crear usuarios nuevos el script trabaja bien pero ahora que estoy tratando de controlar un poco mas mi aplicacion estoy tratando de aplicar rangos de usuario.

estoy usando una base de datos sqlite3, la cuestion es que al modificar el codigo estoy haciendo un while y al ejecutarlo me marca un Fatal error: Call to a member function fetchArray() on boolean in C:\wamp\www\favoritosOnline\crearusuario.php on line 31

Este es el codigo que tengo escrito:
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
<?php
session_start();
 
$contador = 0;
 
//Obtener variables
$usuario = $_POST['usuario'];
$contrasena = $_POST['contrasena'];
$nombre = $_POST['nombre'];
$apellido = $_POST['apellido'];
$edad = $_POST['edad'];
 
// Crear Conexion
//clase constructora de la base de datos
class BaseDatos extends SQLite3{
  function __construct(){
    $this->open('favoritos.db');
  }
}
//se crea la nueva instancia donde se carga la clase base de datos en la variable $db con una estructura de control if para checar si se crea la base de datos o da error
$db = new BaseDatos();
if (!$db) {
  echo "<p>ERROR al abrir la base de datos favoritos</p>";
}
 
$consulta = "SELECT * FROM usuarios";
 
//Ejecutar consulta
$resultado=$db->exec($consulta);
 
while ($fila = $resultado->fetchArray(SQLITE3_ASSOC)) {
  if($fila['usuario'] == $usuario){
 
  $contador++;
 
  }else{}
}
 
if ($contador ==0) {
//Consulta
/*Privilegios de usuario
1=administrador
2=controlador
3=usuario registrado
4=usuario invitado
*/
$consulta = <<<sql
INSERT INTO usuarios VALUES('$usuario','$contrasena','$nombre','$apellido','$edad','3')
sql;
 
//Ejecutar consulta
$resultado=$db->exec($consulta);
 
//Y vuelvo
echo '
<html>
  <head>
    <meta http-equiv="REFRESH" content="0;url=index.php">
  </head>
</html>
';
}else{echo "El nombre de usuario que has elegido ya existe. Elige otro";}
//Cerrar dase de datos
$db->close();
 
?>

la verdad no se que es lo que tenga mal espero puedan ayudarme a resolver el problema.
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 kip

Fatal error: Call to a member function fetchArray() on boolean in

Publicado por kip (863 intervenciones) el 17/05/2017 21:19:11
Hola, el problema esta en el metodo que usas para ejecutar la query, si nos dirigimos a la documentacion:

1
$resultado=$db->exec($consulta);

PDO::exec() ejecuta una sentencia SQL en una única llamada a la función, devolviendo el número de filas afectadas por la sentencia.

PDO::exec() no devuelve resultados de una sentencia SELECT. Para una sentencia SELECT que sólo se necesita ejecutar una vez en el programa, se debe considerar el uso de PDO::query(). Para una sentencia que se deba ejecutar en múltiples ocasiones, preparar un objeto PDOStatement con PDO::prepare() y ejecutarlo con PDOStatement::execute().


Puedes en su lugar usar PDO::query() http://php.net/manual/es/pdo.query.php

1
$resultado=$db->query($consulta);

Intentalo y nos cuentas
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

Fatal error: Call to a member function fetchArray() on boolean in

Publicado por alek (4 intervenciones) el 18/05/2017 00:22:41
Hola, gracias por responder

La verdad nunca he usado PDO podrias ponerme un ejemplo de como debe quedar el codigo usando PDO?
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

Fatal error: Call to a member function fetchArray() on boolean in

Publicado por alek (4 intervenciones) el 18/05/2017 02:38:13
Bueno no encontre una opcion para editar mi comentario anterior asi que aqui tuve que hacer un nuevo comentario espero no haya ningun problema.

No habia leido bien lo que me escribiste, ya me habias dado la respuesta.

hice lo que comentaste solo cambien exec por query y todo esta funcionando bien muchisimas gracias
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
Imágen de perfil de kip

Fatal error: Call to a member function fetchArray() on boolean in

Publicado por kip (863 intervenciones) el 18/05/2017 19:26:12
Lo siento, recien me doy cuenta que no estas usando PDO si no mas bien la extension SQLite3, que por cierto en tu caso la solucion es la misma que PDO, es por eso que te ha funciondo, veamos que dice la documentacion de exec() como metodo de SQLite3:

http://php.net/manual/es/sqlite3.exec.php
Ejecuta una consulta que no devuelve resultados en una base de datos dada.

No es tan explicita como la definicion que da PDO pero puede etenderse.
Pero es en la parte de los valores devueltos donde nos damos cuenta el porque te dice el error del boolean:

Devuelve TRUE si la consulta tuvo éxito, FALSE en caso de error.


En fin, tal como lo hiciste debes ejecutar SQLite3::query() http://php.net/manual/es/sqlite3.query.php

Devuelve un objeto de la clase SQLite3Result si la consulta devuelve resultados.

Ya que este si devuelve el conjunto de resultados para poder obtenerlos con fetchArray
Disculpa la confusion de mi parte.
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

Fatal error: Call to a member function fetchArray() on boolean in

Publicado por alek (4 intervenciones) el 18/05/2017 22:13:48
bueno igual con tu comentario lo pude solucionar asi que mil gracias.
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
Revisar política de publicidad