Control de usuarios para hacer filtros

48 views
Skip to first unread message

Jose Puertas

unread,
Sep 21, 2015, 4:38:58 AM9/21/15
to ZnetDK
Hola Pascal mi intención es averiguar el user_id del usuario que se ha logueado para poder hacer consultas y filtrar los resultados, he pasado esta funcion a mi controlador y luego he intentado ver si el resultado era óptimo, y no me retorna ningún dato, a ver en qué me he equivocado/omitido:


Controlador:
El espacio de nombres está indicado antes con el use....


static public function getUserId($loginName) {
        $jugadorDAO = new jugadorDAO();
        $jugadorDAO->setFilterCriteria($loginName);
        try {
            $userRow = $jugadorDAO->getResult();
            $userName = $userRow['user_id'];
            
        } catch (\PDOException $e) {
            \General::writeErrorLog("ZNETDK ERROR", "USR-008: unable to query the user name for the login name '$loginName'! (".
                    $e->getCode().")", TRUE);
            $userName = NULL;
        }
        return $userName;
    }


la llamo desde la vista:

<div id="zdk-jugadores" class="zdk-action-bar" data-zdk-dialog="dlg_jugadores" data-zdk-datatable="table_jugadores" data-zdk-action="jugadoresctrl:getUserId" >

y se deberia mostrar aqui:
    <p><?php echo $userName; ?></p>

pero no me hace nada, no sé el porqué, parece que está todo correcto , ah este es el modelo:

    protected function initDaoProperties() {
        $this->table = "jugadores";
        $this->IdColumnName = "id_jugador";
        $this->query = "select jugadores.*, posicion.nombre_posicion , posicion_1.nombre_posicion as nombre_posicion_1, posicion_2.nombre_posicion as nombre_posicion_2,  equipos.nombre_equipo from jugadores ";
        $this->query .= "left join posiciones as posicion using (id_posicion) ";
        $this->query .= "left join posiciones as posicion_1 on jugadores.id_posicion_1 = posicion_1.id_posicion ";
        $this->query .= "left join posiciones as posicion_2 on jugadores.id_posicion_2 = posicion_2.id_posicion ";
        $this->query .= "left join equipos using (id_equipo) ";
        $this->filterClause = "where lower(nombre_jugador) like lower(?)";
        
    }

Saludos

Pascal Martinez

unread,
Sep 21, 2015, 8:21:53 AM9/21/15
to ZnetDK
Hola José,

Lo que entiendo es que quieres mostrar en una vista el nombre que corresponde al usuario conectado.
1) El método 'getUserId' no es una acción de controlador porque una acción no tiene parámetros y siempre tiene que devolver un objeto de tipo \Response.
Puedes obtener el login ID del usuario conectado llamando el método \UserSession:getLoginName().
Para devolver a tu vista datos que resultan del DAO, tienes que usar el objeto de tipo \Response como en el ejemplo que sigue:
static protected function action_username() {
   $myResponse
=new\Response();
   $myResponse
->username = 'José';
   $myResponse
->success = TRUE;
   
return $myResponse;
}

2) Desde tu vista, para llamar una acción de tu controlador y mostrar los datos que devuelve, lo haces por ejemplo con un formulario como sigue:

<form id="get_username_form" class="zdk-form" data-zdk-action="mycontroller:username">
    <button class="zdk-bt-yes" type="submit">Get user name</button>
</form>
<h3 id="display_username"></h3>
<script>
    $(document).ready(function() {
        $('#get_username_form').zdkform({
            complete: function (context, response) {
                $('#display_username').text(response.username);
            }
        });
    });
</script>


Dime si es mas claro ahora.

Pascal MARTINEZ


Jose Puertas

unread,
Sep 21, 2015, 4:17:51 PM9/21/15
to ZnetDK
Hola pascal, lo de mostrar el user por pantalla era sólo para probar que la función hacia lo correcto, mi intención es localizar el user_id del usuario actualmente logueado y conectado a la aplicación para con ese parámetro poder hacer filtros del tipo:

$this->filterClause = "where user_id = $userName;

y asi mostrar los registros que se corresponden con el usuario conectado.

Saludos

Pascal Martinez

unread,
Sep 22, 2015, 3:04:22 AM9/22/15
to ZnetDK
Hola José,

Para obtener el login ID del usuario conectado, llama desde tu controlador el método \UserSession:getLoginName();

Si es el nombre del usuario que quieres, puedes llamar el método \UserManager::getUserName(\UserSession::getLoginName());
 
Si tienes dudas sobre tu petición SQL declarada en tu DAO, puedes probarla directamente en MySQL.

Dime si te ayuda.

Pascal

Jose Puertas

unread,
Sep 22, 2015, 7:09:50 AM9/22/15
to ZnetDK
Hola Pascal , lo he hecho de la siguiente manera:

controlador:

namespace app\controller;

use app\model\tjugadorDAO;

class tjugadoresctrl extends \AppController {

    static protected function action_lister() {
        $tjugadorDAO = new tjugadorDAO();
        $userId  =  UserSession::getLoginName(); // localizo el nombre del usuario activo
        $tjugadorDAO->setFilterCriteria($userId); // aplico el filtro por usuario activo
        $tjugadores = array();
        while ($row = $tjugadorDAO->getResult()) {
            $tjugadores[] = $row;
        }
        /* Réponse retournée au contrôleur principal */
        $response = new \Response();
        $response->rows = $tjugadores;
        $response->success = true;
        return $response;
    }
}


y este es el dao:

namespace app\model;
 
class tjugadorDAO extends \DAO {
 
    protected function initDaoProperties() {
        $this->table = "jugadores";
        $this->IdColumnName = "id_jugador";
        $this->query = "select jugadores.*, posicion.nombre_posicion , posicion_1.nombre_posicion as nombre_posicion_1, posicion_2.nombre_posicion as nombre_posicion_2,equipos.nombre_equipo from jugadores ";
        $this->query .= "left join posiciones as posicion using (id_posicion) ";
        $this->query .= "left join posiciones as posicion_1 on jugadores.id_posicion_1 = posicion_1.id_posicion ";
        $this->query .= "left join posiciones as posicion_2 on jugadores.id_posicion_2 = posicion_2.id_posicion ";
        $this->query .= "left join equipos using (id_equipo) ";
        $this->query .= "left join zdk_users using (id_equipo) ";
        $this->query .= "where equipos.user_id = $tjugadores ";
        
 
    }
 
}


pero sigue sin funcionar.

Saludos

Pascal Martinez

unread,
Sep 22, 2015, 4:28:34 PM9/22/15
to ZnetDK
José,

Cuando dices que sigue sin funcionar, tienes un mensaje de error?
Has probado tu péticion SQL en MySQL?

Veo que falta el '\' (backslash) delante UserSession ==> \UserSession

Pascal

Jose Puertas

unread,
Sep 22, 2015, 4:40:38 PM9/22/15
to ZnetDK
Hola Pascal, pues ahora que lo comentas me da el siguiente error:

"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 - /home/u365395512/public_html/club/engine/core/dao.php(150)"

Saludos

Pascal Martinez

unread,
Sep 23, 2015, 4:39:13 AM9/23/15
to ZnetDK
Hola José,

El mensaje MySQL te da la solución.
En tu DAO, tu petición SQL no se termina correctamente: 

$this->query .= "where equipos.user_id = $tjugadores ";

Tu variable $tjugadores no existe. Quizas tendrias que cambiarla por un signo de interrogación?

Pascal

Jose Puertas

unread,
Sep 23, 2015, 5:32:14 AM9/23/15
to ZnetDK
Hola Pascal, es cierto al parecer la variable no tiene el valor que yo deseo para la consulta, aunque he modificado y sigue sin funcionar:

controlador:

namespace app\controller;

use app\model\tjugadorDAO;

class tjugadoresctrl extends \AppController {

    static protected function action_lister() {
        $tjugadorDAO = new tjugadorDAO();
        $userId  =  \UserSession::getLoginName();
        $tjugadorDAO->setFilterCriteria($userId);
        $tjugadores = array();
        while ($row = $tjugadorDAO->getResult()) {
            $tjugadores[] = $row['user_id'];
        }
        /* Réponse retournée au contrôleur principal */
        $response = new \Response();
        $response->rows = $tjugadores;
        $response->success = true;
        return $response;
    }
}
dao:

namespace app\model;

class tjugadorDAO extends \DAO {

    protected function initDaoProperties() {
        $this->table = "jugadores";
        $this->IdColumnName = "id_jugador";
        $this->query = "select jugadores.*, posicion.nombre_posicion , posicion_1.nombre_posicion as nombre_posicion_1, posicion_2.nombre_posicion as nombre_posicion_2,equipos.nombre_equipo from jugadores ";
        $this->query .= "left join posiciones as posicion using (id_posicion) ";
        $this->query .= "left join posiciones as posicion_1 on jugadores.id_posicion_1 = posicion_1.id_posicion ";
        $this->query .= "left join posiciones as posicion_2 on jugadores.id_posicion_2 = posicion_2.id_posicion ";
        $this->query .= "left join equipos using (id_equipo) ";
        $this->query .= "left join zdk_users using (user_id) ";
        $this->query .= "where equipos.user_id = (?)";
    }

}

Saludos

Jose Puertas

unread,
Sep 25, 2015, 4:51:47 PM9/25/15
to ZnetDK
Hola Pascal, he modificado quitando el array y no me hace el filtro, pero tampoco me da ningún error, ¿sabes qué puede estar fallando?

namespace app\controller;

use app\model\tjugadorDAO;

class tjugadoresctrl extends \AppController {

    static protected function action_lister() {
        $tjugadorDAO = new tjugadorDAO();
        $userId  =  \UserSession::getLoginName();
        $tjugadorDAO->setFilterCriteria($userId);
                while ($row = $tjugadorDAO->getResult()) {
            $tjugadores = $row['user_id'];
        }
        /* Réponse retournée au contrôleur principal */
        $response = new \Response();
        $response->rows = $tjugadores;
        $response->success = true;
        return $response;
    }
}
dao:

namespace app\model;

class tjugadorDAO extends \DAO {

    protected function initDaoProperties() {
        $this->table = "jugadores";
        $this->IdColumnName = "id_jugador";
        $this->query = "select jugadores.*, posicion.nombre_posicion , posicion_1.nombre_posicion as nombre_posicion_1, posicion_2.nombre_posicion as nombre_posicion_2,equipos.nombre_equipo from jugadores ";
        $this->query .= "left join posiciones as posicion using (id_posicion) ";
        $this->query .= "left join posiciones as posicion_1 on jugadores.id_posicion_1 = posicion_1.id_posicion ";
        $this->query .= "left join posiciones as posicion_2 on jugadores.id_posicion_2 = posicion_2.id_posicion ";
        $this->query .= "left join equipos using (id_equipo) ";
        $this->query .= "left join zdk_users using (user_id) ";
        $this->query .= "where equipos.user_id = ?";
    }

}

Saludos

Pascal Martinez

unread,
Sep 26, 2015, 10:30:13 AM9/26/15
to ZnetDK
Hola José,

Tu controlador me parece correcto.
Dos pistas como te lo dije antes, tienes que probar tu petición SQL en MySQL cambiando el ? por el valor que transmites desde tu controlador. Si no devuelve nada, tienes que corregir tu petición SQL.

Otra pista, en tu controlador, temporalmente para hacer una prueba, inicializa tu variable $userId directamente con el valor que piensas que te devuelve el método \UserSession::getLoginName(); para estar seguro que no te equivocas de tipo de dato.

Mas generalmente, tendrías que depurar tu código PHP ejecutando tu aplicación en paso a paso con xdebug (funciona con notepad++, eclipse, netbeans...), sino no podrás identificar el origen de tu problema.

Saludos,

Pascal MARTINEZ. 

Jose Puertas

unread,
Sep 26, 2015, 4:47:01 PM9/26/15
to ZnetDK
Hola Pascal, he comprobado como me decias el sql y en phpadmin da correcta la solución, creo que no encuentro el problema en el dao, te paso las tablas afectadas a ver qué es lo que está pasando.

lo que quiero con esta consulta es:
recojo el login_name del usuario conectado, busco su user_id y con el user_id debo mostrar todos los jugadores que pertenezcan a los equipos cuyo user_id sea igual al user_id que me ha devuelto con este dao:

namespace app\model;

class tjugadorDAO extends \DAO {

    protected function initDaoProperties() {
        $this->table = "jugadores";
        $this->IdColumnName = "id_jugador";
        $this->query = "select jugadores.*, posicion.nombre_posicion , posicion_1.nombre_posicion as nombre_posicion_1, posicion_2.nombre_posicion as nombre_posicion_2,  equipos.nombre_equipo,  equipos.user_id, zdk_users.login_name, zdk_users.user_id from jugadores ";
        $this->query .= "left join posiciones as posicion using (id_posicion) ";
        $this->query .= "left join posiciones as posicion_1 on jugadores.id_posicion_1 = posicion_1.id_posicion ";
        $this->query .= "left join posiciones as posicion_2 on jugadores.id_posicion_2 = posicion_2.id_posicion ";
        $this->query .= "left join equipos using (id_equipo) ";
        $this->query .= "where equipos.user_id = ?";
    }

}

y asi estan configuradas las tablas afectadas:

CREATE TABLE `zdk_users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Internal User id',
  `login_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `login_password` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `expiration_date` date NOT NULL COMMENT 'Expiration date of the password',
  `user_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `user_surname` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci ,
  `user_email` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `full_menu_access` tinyint(1) NOT NULL COMMENT 'Does the user have access to the full menu?',
  `user_enabled` tinyint(1) NOT NULL COMMENT 'Is user enabled ? enabled (true), disabled (false))',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `login_name` (`login_name`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Table of users' AUTO_INCREMENT=1 ;

  CREATE TABLE IF NOT EXISTS `equipos` (
  `id_equipo` int(11) NOT NULL AUTO_INCREMENT ,
  `nombre_equipo` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
  `id_categoria` int(11) NOT NULL  ,
  `user_id` int(11) NOT NULL  ,
  `id_club` int(11) NOT NULL  ,
  PRIMARY KEY (`id_equipo`) 
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  AUTO_INCREMENT=1 ;
 
CREATE TABLE IF NOT EXISTS `jugadores` (
  `id_jugador` int(11) NOT NULL AUTO_INCREMENT ,
  `id_equipo` int(11) NOT NULL ,
  `id_categoria` int(11) NOT NULL ,
  `id_posicion` int(11) NOT NULL ,
  `id_posicion_1` int(11) NOT NULL ,
  `id_posicion_2` int(11) NOT NULL ,
  `nombre_jugador` varchar(40) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
  `apellidos` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
   PRIMARY KEY (`id_jugador`) 
  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  AUTO_INCREMENT=1 ; 
  
  
ALTER TABLE `equipos`

  ADD CONSTRAINT `zdk_equipo_entrenador` FOREIGN KEY (`user_id`) REFERENCES `zdk_users` (`user_id`),
  ADD CONSTRAINT `zdk_equipo_categoria` FOREIGN KEY (`id_categoria`) REFERENCES `categorias` (`id_categoria`);
  
  ALTER TABLE `jugadores`
  ADD CONSTRAINT `zdk_jugador_equipo` FOREIGN KEY (`id_equipo`) REFERENCES `equipos` (`id_equipo`),
  ADD CONSTRAINT `zdk_jugador_categoria` FOREIGN KEY (`id_categoria`) REFERENCES `categorias` (`id_categoria`);

Saludos

Pascal Martinez

unread,
Sep 27, 2015, 9:49:49 AM9/27/15
to ZnetDK
Hola José,

Lo siento pero no puedo ayudarte mas a propósito de este problema.
Te invito de nuevo a depurar el código fuente de tu controlador para identificar la origen de tu problema.

Tienes ahora un nuevo articulo en este foro de discusión para configurar NetBeans y depurar código PHP.

Buena suerte en tus investigaciones.

Pascal MARTINEZ

Jose Puertas

unread,
Oct 7, 2015, 8:05:00 AM10/7/15
to ZnetDK
Muchas gracias, a ver si hay suerte.

Saludos
Reply all
Reply to author
Forward
0 new messages