entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Consultas SQL en PHP 7

Estoy migrando una aplicación de PHP5 a PHP7. Estoy teniendo varios problemas al compilar, y uno de ellos es el siguiente:

Tengo un archivo que hace la conexión a la BD:

<?php
    require_once ($_SERVER['DOCUMENT_ROOT']. '/App/config/config.php');

    class Database{
        private $conexion;
        private $db;

        public function conectar(){
            /* Conexión con MySQL */
            $this->conexion = mysqli_connect(host, username, password);

            /* Para las tildes */
            //mysqli_query("SET NAMES 'utf8'");

            if (!$this->conexion){
                DIE("Error al conectar con MySQL: " . mysqli_error());
            }

            /* Conexión con la BBDD */
            $this->db = mysqli_select_db($this->conexion, dbname);
            if (!$this->db){
                DIE("Error al conectar con la base datos: " . dbname);
            }

            return true;
        }

        public function desconectar(){
            if ($this->conexion) {
                mysqli_close($this->conexion);
            }
        }
    }
?>

Y cuando hago una consulta para listar una serie de elementos:

<?php
    require_once ($_SERVER['DOCUMENT_ROOT']. '/App/models/Equipo.php');
    require_once ($_SERVER['DOCUMENT_ROOT']. '/App/config/database.php');

    class EquipoDAO{
        public function listarEquipos(){
            /* Comprobamos la conexión a la BBDD */
            $db = new DataBase();

            if($db->conectar()) {
                $sql = "SELECT * FROM Equipo";
                $result = mysqli_query($sql); ----------------->Aquí tengo el error

Me está dando un error:

Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\wamp64\www\App\daos\EquipoDAO.php on line 12

¿Qué me puede estar fallando?

Gracias de nuevo!

1 Respuesta

1voto

carlossevi Puntos63580

Te falla porque la función mysqli_query() espera como mínimo 2 parámetros y tu solo le estás poniendo 1.

Aquí tienes un enlace a la documentación oficial: http://php.net/manual/es/mysqli.query.php

0voto

danielreales7 comentado

Si obtengo en esta variable:

> $db = new DataBase();

E intento poner:

$result = mysqli_query($db->conexion,$sql);

Me sigue dando error. ¿Puede que me esté equivocando al obtener los datos de la otra clase?
No estoy entendiendo muy bien el manejo de las variables privadas en otros archivos y como obtenerlas en este.

Muchas gracias!

1voto

carlossevi comentado

mysqli_query(mysqli $link , string $query) tiene dos parámeros mínimos:

  • $link es un objeto del tipo mysqli, el devuelto por las funciones mysqli_connect() o mysqli_init() durante la creación de la conexión.
  • $query es un objeto del tipo string, que es la consulta SQL.

En tu caso $db es del tipo DataBase, que es una clase definida por ti, y según el código de arriba $db->conexion sí que debería devolver el objeto correcto siempre que se haya ejecutado antes $db->conectar().

¿Puedes poner el código actual y el nuevo mensaje de error?

1voto

danielreales7 comentado

Me da el siguiente error:

 Fatal error: Uncaught Error: Cannot access private property Database::$conexion in C:\wamp64\www\EjercicioFinal\daos\EquipoDAO.php on line 12

El código es el siguiente:

<?php
    require_once ($_SERVER['DOCUMENT_ROOT']. '/EjercicioFinal/models/Equipo.php');
    require_once ($_SERVER['DOCUMENT_ROOT']. '/EjercicioFinal/config/database.php');

    class EquipoDAO{
        public function listarEquipos(){
            /* Comprobamos la conexión a la BBDD */
            $db = new DataBase();

            if($db->conectar()) {
                $sql = "SELECT * FROM Equipo";
                $result = mysqli_query($db->conexion,$sql);

                if($result) {
                    // Si hay registros
                    if(mysqli_num_rows($result) !== 0) {
                        while($row = mysqli_fetch_array($result)) {
                            $equipo = new Equipo();

                            $equipo->setId($row['id']);
                            $equipo->setNombre($row['nombre']);

                            $equipos[] = $equipo;
                        }   
                    }else{
                        $equipos = null;
                    }
                }

                $db->desconectar();
            } else {
                echo "Error al conectar con la base de datos<br />";
            }

            return $equipos;
        }

        public function buscarEquipoPorId($id){
            /* Comprobamos la conexión a la BBDD */
            $db = new DataBase();

            if($db->conectar()) {
                $sql = "SELECT * FROM Equipo where id = '$id'";
                $result = mysqli_query($sql);

                $equipo = new Equipo();

                if($result) {
                    // Si solo hay un registro
                    if(mysqli_num_rows($result) !== 0 && mysqli_num_rows($result) == 1) {
                        while($row = mysqli_fetch_array($result)) {
                            $equipo->setId($row['id']);
                            $equipo->setNombre($row['nombre']);
                            $equipo->setEstadio($row['idEstadio']);
                        }
                    }else{
                        $equipo = null;
                    }
                }

                $db->desconectar();
            } else {
                echo "Error al conectar con la base de datos<br />";
            }

            return $equipo;
        }

    }
?>

Más abajo hay otros errores, pero cuando solvente este podré solucionar los demás.

1voto

carlossevi comentado

¡Claro! No me había fijado en tu código original que la definición de conexion es private. Aquí tienes más información: http://php.net/manual/es/language.oop5.visibility.php

Puedes hacer que conexion sea accesible o bien hacer un método getter para accederla.

1voto

danielreales7 comentado

Listo! Puse la definición como public tenías razón!

Mil gracias.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta