PHP - Paso de argumentos [Problema]

 
Vista:

Paso de argumentos [Problema]

Publicado por JAI-MAN (2 intervenciones) el 13/01/2009 20:37:15
Hola a todos quienes me lean xD

Tengo una colsulta. Necesito hacer un filtro de páginas y acciones (Agregar, Eliminar, Editar) según el usuario que se ha ingresado a la página.
He creado tres funciones dentro de una clase (Control_Class.php) las que deberían encargarse de devolver al final del proceso si el usuario tienen o no el accesos a aquello que se le pregunte...
Mi problema es el siguiente:
Cuando hago la prueba para ver si mi invento ( xD ) funciona, a pesar que me contesta como debiese, me arroja unos Warnings. Pero no logro entender por qué los arroja.

Si alguien puede decirme a qué deben se los agradecería mucho :) y, si es muy complejo, indicarme qué hacer para solucionarlo.

Adjunto los detalle que creo necesitan para poder responderme

De antemano, les agradezco el que le dediquen un poco de su tiempo para ayudarme.

Este es el código de las funciones que cree:_______________________________________________________

<?php
class Control{
private $SQL;
private $query;
private $ke;
private $donde;
private $condicion;
static private $ctrl = NULL;

function Control(){
$this->SQL = MySQL::getInstancia();
session_start();
}

public function opControl($idRUT,$pag,$accion){
$ke = "GRP.ID_USERSGROUP,GRP.NOMBREGRUPO";
$donde = "adm_usersgroup GRP,adm_roles R";
$cond = "GRP.ID_USERSGROUP=R.ID_USERSGROUP AND R.ID_RUT=".$idRUT."'";

$Q = $this->SQL->select($ke,$donde,$cond);

/*Linea 73*/ if(strcmp($this->findPages($Q,$pag,$accion))==0){ return 'true'; }
return 'false';
}

public function findPages($GRP,$pag,$accion){
/*Linea 77*/ if($row = mysql_fetch_row($GRP)){
$ke = "O.ID_PROCESO,A.ACTIVO";
$donde = "adm_opsis O, adm_access A, adm_usersgroup GRP";
$cond = "O.ID_PROCESO=A.ID_PROCESO AND GRP.ID_USERSGROUP=A.ID_USERSGROUP AND GRP.ID_USERSGROUP=".$GRP[0]." AND O.NOMBREPROCESO='".$pag."'";

if(strcmp($pag,$accion)==0){
if($row = mysql_fetch_row($query)){ return 'true'; }
}
else if(strcmp($this->findAccion($GRP,$this->SQL->select($ke,$donde,$cond),$accion))==0){ return 'true'; }
}
return 'false';
}

public function findAccion($GRP,$idPag,$accion){
if($row = mysql_fetch_row($idPag)){
$ke = "A.ACTIVO";
$donde = "adm_opsis O, adm_access A, adm_usersgroup GRP";
$cond = "O.ID_PROCESO=A.ID_PROCESO AND GRP.ID_USERSGROUP='".$GRP[0]."' AND O.REFIDPROCESO='".$idPag[0]."' AND O.NOMBREPROCESO='".$accion."'";
$group = "O.ID_PROCESO";

$query = $this->SQL->select($ke,$donde,$cond);
if($row = mysql_fetch_row($query)){ return 'true'; }
}
return 'false';
}
}
?>
_______________________________________________________________________________________

Desde fuera las llamo así:__________________________________
<?php
include("ClassControl_Class.php");
include("ClassMySQL_Class.php");

$sql = MySQL::getInstancia();
$verif = Control::getInstancia();
session_start();

if(strcmp($verif->opControl($_SESSION['usuario'],'Usuarios','Agregar'),'true')==0){
echo("El Usuario puede agregar a otros usuarios");
}
?>
______________________________________________________

Esto es lo que desde la web me responden:___________________________________
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in D:[...]PHPClassControl_Class.php on line 77

Warning: Wrong parameter count for strcmp() in D:[...]PHPClassControl_Class.php on line 73
El Usuario puede agregar a otros usuarios
______________________________________________________________________

Según entendí me reclama, creo, por la variable que contiene la consulta que mandé a pedir al pasarla por parámetro... ¿Es este tipo de variables ($Q) una especie de array o son matrices?
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

RE:Paso de argumentos [Problema]

Publicado por WEBNESS (73 intervenciones) el 14/01/2009 17:40:29
Pues el primer warning a mi me sale siempre que el query me queda mal hecho, o cuando la sentencia sql logicamente esta bien hecha pero erroneamente le mando parametros para armarla dinamicamente igual todo puede estar bien, pero la consulta puede que no arroje datos. para verificar que la consulta arrojo datos usa: mysql_num_rows($q)

y en segundo caso, no es necesario que hagas el strcmp

simplemente tus funciones no deben regresar las cadenas "true" o "false" sino los booleanos true o false, por consiguiente deberian de quedar los condicionales mas o menos asi:

if($verif->opControl($_SESSION['usuario'],'Usuarios','Agregar'))
{
//puede hacer de todo
}
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

RE:Paso de argumentos [Problema]

Publicado por JAI-MAN (2 intervenciones) el 14/01/2009 19:57:18
Gracias por tu respuesta WEBNESS. Ya he logrado encontrar solución al problemilla. Procedo a comentar la solución propuesta :B

pero antes:
- Respecto a lo que me comentaste del strcmp()... Esto comencé a aplicarlo porque, en varias ocaciones, me pasó que tenía funciones que realizaban un <return true> o <return false>. Sin embargo desde el otro lado, o sea, quienes esperaban una de las 2 respuestas para poder tomar uno u otro camino, tomaban cualquiera de las 2 respuestas como un true y siempre se ivan por ese camino...
Asi que intenté ese método (strcmp) para ver si se solucionaba... Y así fue xD... Así que así lo hago ahora. :P

Bien... PROBLEMA:

En el código hay una línea, esta:
$Q = $this->SQL->select($ke,$donde,$cond);

después está esta otra línea:
/*Linea 73*/ if( strcmp( $this->findPages($Q,$pag,$accion) )==0 ){ return 'true'; }

Si se fijan, mando a llamar a la función findPages() y le mando, como uno de los parámetros, a $Q... ese es el problema...
findPages no me estaba entendiendo ese parámetro, no se bien por qué. Según lo que leí por ahí $Q viene siendo una variable de tipo "resource" ( o.O ), pero no logré averiguar si es posible enviar por parámetro a ese tipo de variables... solo se que a mi no me deja xD

¿SOLUCIÓN?

Simplemente lo evité (jejeje) haciendo esto:

Cambié la línea 73 por esto:
if($row=mysql_fetch_row($Q)){
if(strcmp($this->findPages($row,$pag,$accion),'true')==0){ return 'true'; }
}

O sea, mejor le envío el puntero del query en ves de enviar el propio query... Tan Tan...

Con eso, obviamente, hay que hacer unas modificaciones a las funciones... pero nada del otro mundo...

FUNCIONES CORREGIDAS:

public function opControl($idRUT,$pag,$accion){
//echo("Usuario: ".$idRUT."<br>Pag: ".$pag."<br>Acción: ".$accion."<br>");
$ke = "GRP.ID_USERSGROUP,GRP.NOMBREGRUPO";
$donde = "adm_usersgroup GRP,adm_roles R";
$cond = "GRP.ID_USERSGROUP=R.ID_USERSGROUP AND R.ID_RUT='".$idRUT."'";

$Q = $this->SQL->select($ke,$donde,$cond);

if($row=mysql_fetch_row($Q)){
if(strcmp($this->findPages($row,$pag,$accion),'true')==0){ return 'true'; }
}
return 'false';
}
public function findPages($GRP,$pag,$accion){
$ke = "O.ID_PROCESO,A.ACTIVO";
$donde = "adm_opsis O, adm_access A, adm_usersgroup GRP";
$cond = "O.ID_PROCESO=A.ID_PROCESO AND GRP.ID_USERSGROUP=A.ID_USERSGROUP AND GRP.ID_USERSGROUP=".$GRP[0]." AND O.NOMBREPROCESO='".$pag."'";

$Q = $this->SQL->select($ke,$donde,$cond);

if(strcmp($pag,$accion)==0){
if($row = mysql_fetch_row($Q)){ return 'true'; }
}else if($row = mysql_fetch_row($Q)){
if(strcmp($this->findAccion($GRP,$row[0],$accion),'true')==0){ return 'true'; }
}
return 'false';
}
public function findAccion($GRP,$idPag,$accion){
echo("Grupo: ".$GRP[0]."<br>Página N°: ".$idPag."<br>Acción: ".$accion."<br><br>");
$ke = "A.ACTIVO";
$donde = "adm_opsis O, adm_access A, adm_usersgroup GRP";
$cond = "O.ID_PROCESO=A.ID_PROCESO AND GRP.ID_USERSGROUP='".$GRP[0]."' AND O.REFIDPROCESO='".$idPag."' AND O.NOMBREPROCESO='".$accion."'";
$group = "O.ID_PROCESO";

$query = $this->SQL->select($ke,$donde,$cond,$group);

if($row = mysql_fetch_row($query)){ return 'true'; }
else{ return 'false'; }
}
-----------------
^o^
------------------
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