J'ai un petit problème qui me monte au nez
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...