Fonction php : Return qui retourne rien

Guillaume22
Invité n'ayant pas de compte PHPfrance

22 nov. 2008, 19:39

Bonjour,

J'ai un petit problème qui me monte au nez :shock:
Contexte : je suis en train de créer un CMS. Les modules dialoguerons avec la BDD au moyen de deux fonction : une pour les exécution (exemple : INSERT INTO...) et une pour les affichage (SELECT *...).

Ces fonctions définissent si l'utilisateur à le droit ou non d'accéder à une donnée au moyen d'une colonne "chmod" commune à toute les tables.

Ainsi, pour afficher des informations d'une base de données, les modules appelle la fonction sql_mk_array('Requête') de cette manière :
$array = sql_mk_array('SELECT id FROM wsys_modules WHERE module_name="Nom"')
echo $array['id'];
Dans ce genre de situation, la fonction marche très bien. Elle va chercher la colonne chmod de la table "wsys_modules", vérifie que l'utilisateur a l'autorisation de voir la donnée, et la renvoie (ou non dans le cas contraire).

Deuxième cas, une boucle :
while ($array = sql_mk_array('SELECT id FROM wsys_modules'))
 {
   echo $array['id'] . '<br />';
 }
Dans le cas ou l'utilisateur peut lire toutes les données de la table, il n'y aura aucun problème, la fonction va tout retourner correctement. Cependant, dans le cas contraire (la colonne chmod interdit la lectures de données pour l'utilisateur sur la ligne X), toutes les lignes qui suivront X ne retourneront rien du tout. Même pas false, rien. Pourtant, en ajoutant quelques "echo" pour voir si les conditions était exécutés correctement, j'ai constaté que oui. Cependant, return ne fonctionne plus dès que la condition "else" est exécutée.

Voici la fonction :
//This function make a array whith a sql query
function sql_mk_array_hehehe($sql_query)
 {
   //If the query can't return a value, the program stop
   if (!preg_match("#^SELECT#i", $sql_query)) return false;
   
   //If no limit value, one is created
   static $SqlMkArray_limit;
   static $SqlMkArray_count_data;
   
   //If the data number has not been count
   static $SqlMkArray_num_data;
   $query            = mysql_query($sql_query);
   $SqlMkArray_num_data = mysql_num_rows($query);
   #echo '3-';
   
   if ($SqlMkArray_has_exit or !$SqlMkArray_limit or !$SqlMkArray_count_data)
    {
      $SqlMkArray_limit = 0;
      $SqlMkArray_count_data = 0;
      
      #echo 'hasexit-';
    }
   
   //The process is stoped when all the data asked have been read.
   if ($SqlMkArray_count_data >= $SqlMkArray_num_data)
    {      
      #echo 'Exit at 30:' . $SqlMkArray_count_data . ',' . $SqlMkArray_num_data . '<br />';
      //Delete the temp values
      $SqlMkArray_num_data = false;
      $SqlMkArray_limit    = false;
      $SqlMkArray_count_data = false;
      
      static $SqlMkArray_has_exit;
      $SqlMkArray_has_exit = true;
      
      #echo '4-';
      
      return false;
    }
   
   //Creat the chmod query
   $select_chmod        = preg_replace('#^SELECT .+ FROM#isU', 'SELECT chmod FROM', $sql_query);
   $query               = mysql_query($select_chmod . " LIMIT " . $SqlMkArray_limit . ",1");
   #echo $select_chmod . " LIMIT " . $SqlMkArray_limit . ",1<br />";
   $array               = mysql_fetch_array($query);
   
   //If the user can read the data, informations are returned
   if (sess_user_can($array['chmod'], 'r'))
    {
      //If the bug reporter is enable
      if (SYS_SQL_ERRORREPORT) $real_query = mysql_query($sql_query . " LIMIT " . $SqlMkArray_limit . ",1") or die (db_error_reporter($sql));
      else $real_query = @mysql_query($sql_query . " LIMIT " . $SqlMkArray_limit . ",1");
      
      #echo '5-';
         
      $real_array    = mysql_fetch_array($real_query);
      
      #echo 'if:' . $SqlMkArray_limit . ',' . $SqlMkArray_count_data . ',' . $real_array['id'] .'<br />';
      
      $SqlMkArray_limit++;
      $SqlMkArray_count_data++;
      
      #echo 'if1:' . $SqlMkArray_limit . ',' . $SqlMkArray_count_data . ',' . $real_array['id'] .'<br />';
   
      //Return the data
      return $real_array;
    }
    
   //Else, this information is canceled and it go to the next
   else
    {
      #echo 'else:' . $SqlMkArray_limit . ',' . $SqlMkArray_count_data . '<br />';
      $SqlMkArray_limit++;
      $SqlMkArray_count_data++;
      sql_mk_array_hehehe($sql_query);
    }
   
   #echo '7-';
   //Delete the temp values
   $SqlMkArray_num_data = false;
   $SqlMkArray_limit    = false;
   $SqlMkArray_count_data = false;
   
   //Stop the process
   return $real_array;
 }
Merci d'avance pour vos éclaircissement... :)

Guillaume22
Invité n'ayant pas de compte PHPfrance

22 nov. 2008, 20:05

J'ai trouvé de moi même la solution :
   //Else, this information is canceled and it go to the next
   else
    {
      #echo 'else:' . $SqlMkArray_limit . ',' . $SqlMkArray_count_data . '<br />';
      $SqlMkArray_limit++;
      $SqlMkArray_count_data++;
      sql_mk_array_hehehe($sql_query);
    } 
J'avais oublié le return avant la fonction sql_mk_array() :
   //Else, this information is canceled and it go to the next
   else
    {
      #echo 'else:' . $SqlMkArray_limit . ',' . $SqlMkArray_count_data . '<br />';
      $SqlMkArray_limit++;
      $SqlMkArray_count_data++;
      return sql_mk_array_hehehe($sql_query); //CETTE LIGNE.
    }