6 Utilisateur(s) en ligne

Oltana.net 02 Décembre 2023 à 19:57:31 *
Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.


Connexion avec identifiant et mot de passe
Nouvelles:
Bascule sur SMF faite!
 
 
Accueil Aide Rechercher
Pages: [1]   Bas de page
Imprimer
Auteur Fil de discussion: [PHP] Récupérer une donnée dans une fonction  (Lu 27326 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« le: 26 Avril 2008 à 15:02:24 »

Bonjour.

J'ai un problème de récupération d'une variable à partir d'une fonction. Je vous explique : pour mon site, j'ai plusieurs modules qui ont besoin d'un système de pages (afin d'éviter d'arriver avec une page affichant 1000 articles par exemple :oO !

Voici les pages en question :

fonction.php
Code:
<?php
function pages($page$table$parametre)
{
/* affichage des liens vers les autres pages */
?>

<form method="post" action="" name="formulaire">
Nombre de donn&eacute;es par page :&nbsp;<input type="text" name="nb" maxlength="3" />&nbsp;<input type="submit" name="ok" value="Valider." />
</form>
<?php
//on afffiche un nombre déterminé de messages par page (par défaut, 15)

    
if(isset($_POST['ok'&#93;) and $_POST['nb'&#93;!="") { $msg = $_POST['nb'&#93;; }
else { $msg 15 ; }
    @
$pagen $_GET[$page&#93;;

    //page par défaut
    
if(!isset($_GET[$page&#93;) OR $_GET[$page&#93;="")
    
{
    
$pagen 1;
    }
 
    
//1er message de la page
    
$first_msg=($msg*$pagen)-$msg;
    
$retour=mysql_query("SELECT * FROM $table WHERE cat='$parametre'") or die("Erreur 1 &#58; " &#46;mysql_error());
    

    
//nombre total de messages
    
$nombre_total_de_message=mysql_num_rows($retour);
    
    
//nombre de pages
    
$nombre_de_page=ceil($nombre_total_de_message/$msg);
    if(
$pagen!=1)
{
    
//liste des pages
    
echo "<p align=\"center\"><u>Page &#58;</u><br /><br />";
    
    
//lien vers la page précédente
    
if($pagen 1)
    {
    
$pageprec $pagen-1;
    echo 
"<a title=\"Pr&eacute;c&eacute;dente\" href=\"&amp;$page=$pageprec\">&lt;&lt;&nbsp;Pr&eacute;c&eacute;dente</a>&nbsp;";
    }

    for(
$i=$i <= $nombre_de_page $i++)
    {
        
//numéros de pages
        
if(isset($_GET['site_p'&#93;) AND $i == $_GET['site_p'&#93;)
        
{
        echo 
"<strong>";
        }
        echo 
"(<a title=\"Afficher la page "&#46;$i&#46;"\" href=\"&amp;$page="&#46;$i&#46;"\">"&#46;$i&#46;"</a>)&nbsp;";
        
if(isset($_GET['site_p'&#93;) AND $i == $_GET['site_p'&#93;)
        
{
        echo 
"</strong>";
        }
    }    
    
    
//lien vers la page suivante
    
if($pagen $nombre_de_page)
    {
    
$pagesuiv $pagen+1;
    echo 
"<a title=\"Suivante\" href=\"&amp;$page=$pagesuiv\">Suivante&nbsp;&gt;&gt;</a>";
    }
    
    echo 
'</p>' ;
}
/* fin de l'affichage des liens vers les autres pages */
}
?>

Un morceau de la page du code qui me renvoi l'erreur
Code:
/*------------------NEWS SITE--------------
on veut voir les news du site
--------------------------------------------------*/
pages('site_p', 'news', 0);
$req = mysql_query('SELECT * FROM news LEFT JOIN cb_users ON news.id_aut=cb_users.usr_id WHERE (news.cat=0 and news.online=0) ORDER BY news.date DESC LIMIT '.$first_msg.', '.$msg.'') or die ("Impossible de sélectionner les données de la news concernée !<br />" .mysql_error());
$num = mysql_num_rows($req);
while ($list = mysql_fetch_assoc($req))
{
$contenu = clean($list['contenu'], STR_TODISPLAY + STR_MULTILINE + STR_PARSEBB);
$texte = unclean($contenu, STR_REMOVESPECIALCHARS);
?>
<h1><?php echo stripslashes($list['titre'&#93;);?></h1>
<div class="contenu">
<em>Le <?php echo date('d/m/y à h\hm'$list['date'&#93;);?></em>
<hr />
<p><?php echo $texte;?></p>
</div>
<pre class="auteur">Par <?php echo '<a href="&#46;/forum/index&#46;php?act=user&showprofile='&#46;$list['usr_id'&#93;&#46;'">'&#46;$list['usr_name'&#93;&#46;'</a>';?>.</pre>
<hr />

L'erreur retournée par EasyPHP
Citation
Notice: Undefined variable: first_msg in c:\documents and settings\divertissements\mes documents\création site web et +\sites_web\cocordia_aoc\pages\news.php on line 9

Notice: Undefined variable: msg in c:\documents and settings\divertissements\mes documents\création site web et +\sites_web\cocordia_aoc\pages\news.php on line 9
Impossible de sélectionner les données de la news concernée !
Erreur de syntaxe près de '' à la ligne 1

Si l'un de vous voit ce qui ne va pas, je lui en serait très reconnaissante s'il pouvait me dire où j'ai fait mon erreur.

Merci d'avance, Norore.
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
Patami
Administrateur
*****
Hors ligne Hors ligne

Messages: 599



Voir le profil WWW
« Répondre #1 le: 26 Avril 2008 à 18:25:03 »

salut

je n'ai jamais vu qu'on utilisait le @ devant une variable, d'ailleurs c'est mal de cacher les erreurs comme ça :p

attention par ailleurs à la sécu ..

de plus, une variable définie dans une fonction n'est utilisable que dans celle-ci. Tu peux par contre renvoyer des valeurs en utilisant return ..

je dois y aller, pas le temps de développer désolé. Je reviendrai demain :)
Journalisée

Votre site 100% configurable en un tour de main, c'est désormais possible avec KwsPHP
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #2 le: 26 Avril 2008 à 19:36:02 »

return :oO ! Bon, je vais tester ça, et pour l'erreur, tu as raison, j'ai juste bourriné un peu, faut que je revois l'erreur en question :haha !
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
Marmotte
Modérateur Global
*****
Hors ligne Hors ligne

Sexe: Homme
Messages: 554



Voir le profil WWW
« Répondre #3 le: 27 Avril 2008 à 10:11:03 »

Si tu veux il y a aussi les variables globales (tu mets "global $variable;" dans ta fonction pour la déclarer) mais c'est assez moyen généralement, mieux vaut un return ;)
Journalisée

Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #4 le: 27 Avril 2008 à 10:54:05 »

Ma question va paraître stupide mais... je le mets où le return Choqu&eacute; ?
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
Patami
Administrateur
*****
Hors ligne Hors ligne

Messages: 599



Voir le profil WWW
« Répondre #5 le: 27 Avril 2008 à 11:35:51 »

Il est préférable de ne pas utiliser echo dans une fonction. Il vaut mieux qu'elle renvoie une valeur que tu peux stocker dans une variable et qu'il t'est possible de manipuler dans ton script.

Exemple :

Code:
function test($var)
{
if ($var > 0)
{
echo 'test';
}
else
{
echo 'blabla';
}
}

test(3); //affiche le résultat directement

devient :

Code:
function test($var)
{
if ($var > 0)
{
$resultat = 'test';
}
else
{
$resultat = 'blabla';
}

return $resultat;
}

$texte = test(3); //résultat stocké, peut être utilisé plus loin et plusieurs fois dans le script
Journalisée

Votre site 100% configurable en un tour de main, c'est désormais possible avec KwsPHP
Marmotte
Modérateur Global
*****
Hors ligne Hors ligne

Sexe: Homme
Messages: 554



Voir le profil WWW
« Répondre #6 le: 27 Avril 2008 à 11:39:00 »

Pour répondre a la question, le return se place a la fin ;)

Le return en gros il quitte la fonction (et pas le programme complet...) en renvoyant une valeur...
exemple :
Code:
function addition($op1,$op2) {
return $op1+$op2;
echo 'test'; //Cette ligne ne sera jamais exécutée
}

$var=addition(1,2); //ici la variable prend la valeur 1+2=3
Journalisée

Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #7 le: 27 Avril 2008 à 11:48:22 »

Erf, plus ça va et plus je me perds là-dedans :s ! Je pense que je vais devoir conserver ma méthode, copié-collé-corrigé :oO !
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #8 le: 29 Avril 2008 à 14:35:53 »

Citation de: "Marmotte"
Pour répondre a la question, le return se place a la fin :huh: ?
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #9 le: 30 Avril 2008 à 10:54:39 »

Tu peux mettre plusieurs return dans la même fonction (avec des instructions conditionnelles), mais un seul sera utilisé pour chaque fonction.

Lorsque ta fonction est appellée, c'est comme si tu créait un environnement séparé pour cette fonction, càd sans lien avec les autres variables déjà définies ailleurs. Il y a quelques exception avec les superglobales, mais je ne me rappelle plus les rêgles d'utilisation.
Une variable à l'intérieur de la fonction ne peut pas être utilisée en dehors, et une variable hors de la fonction ne pourra pas être utilisée dans la fonction. De plus, la même fonction ne pourra pas réutiliser une variable avec des données antiérieures.

Ca veut dire que tu pourrais normalement utiliser dans une fonction une variable qui a le même nom qu'une autre en dehors de la fonction, sans affecter cette dernière. Mais ça veut aussi dire que tu ne peux pas utiliser sans autre une variable externe à la fonction. Tu dois l'appeller spécifiquement en utilisant 'global' devant le nom de la variable externe. Tu peux aussi, bien entendu, passer des valeurs en utilisant les arguments de la fonction.

De même, tu ne peux pas stocker une variable dans la fonction en comptant l'utiliser en-dehors ensuite (sauf, à nouveau, avec les superglobales ou en déclarant une fonction comme "globale", ce qui n'est pas conseillé). C'est pourquoi tu as à disposition l'instruction 'return' qui permet à ta fonction de renvoyer une valeur (ou n'importe quelles données contenues dans une variable).

Du point de vue extérieur, tu appelle ta fonction, qui exécute une action, et qui renvoie une valeur.
Code:
function fonction($param)
{
 global $var_externe; //Tu pourras réutiliser cette variable dans la fonction
 ... Traitement ... //On suppose que tu stockes les données dans une variable $data

return $data; //Termine, en passant, la fonction
echo $data; //Cette ligne ne sera jamais traitée puisque l'instruction 'return' a terminé la fonction.
}

$var = fonction(param);
Ici, tu assignes à $var ce que renvoie la fonction, donc $var aura la valeur qu'avait $data à l'intérieur de la fonction.
Il peut y avoir plusieurs 'return' dans une fonction, mais elle s'arrêtera au premier qu'elle rencontrera.
Concernant le 'global' en début de fonction, il vaut mieux l'utiliser uniquement pour récupérer la valeur d'une variable, mais sans toucher à la variable elle-même. Un passage en argument peut aussi bien faire l'affaire.
Personnellement, je ne l'utilise que pour des variables que j'utilise comme paramètres globaux pour un site. (Mais c'est une des nombreuses rêgles de programmation bizarres élaborées par mon esprit tordu)

Pour en revenir à ton problème, j'ai vu dans ton code l'appel à la fonction 'pages' suivant :
Code:
pages('site_p', 'news', 0);
suivi, un peu plus loin, d'un appel à une variable utilisée dans la fonction. Ca ne marchera pas, vu que comme on l'a vu, la variable $first_msg, qui est traitée dans la fonction n'est pas disponnible à l'extérieur de cette fonction.

Tu devras donc modifier cette ligne en
Code:
$data = pages('site_p', 'news', 0);
ce qui implique aussi un petit changement dans la fonction : Il faudra qu'elle puisse ne renvoyer qu'une variable, contenant toutes les autres (donc un tableau). Je ne sais pas si c'est la seule méthode en utilisant 'return', mais je n'en connais pas d'autre.
Ensuite au lieu d'accéder à $first_msg, tu utilisera à la place quelque chose comme $data['first_msg'].

En espêrant avoir pu t'aider ;)
PS: Je ne garantis pas l'exactitude syntaxique de mes exemples, étant un peu rouillé, mais le principe et le raisonnement sont corrects ^^
Journalisée


What isn't remembered never happened...
Norore
Animateurs
****
Hors ligne Hors ligne

Sexe: Femme
Messages: 369



Voir le profil WWW
« Répondre #10 le: 30 Avril 2008 à 14:06:41 »

Il faudrait donc, en fait, que je fasse ma requête de sélection dans la fonction, puis de récupérer les données grâce à un return :quoi
Journalisée

Citation de: Secondat de Montesquieu
Je me croirais le plus heureux des mortels si je pouvais faire que les hommes puissent se passer de leur préjugé.
superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #11 le: 30 Avril 2008 à 21:04:12 »

Mouais... c'est assez bizarrement énoncé en fait :8| )
Pour imager, il faut que tu imagines ta fonction comme une boite opaque (donc tu ne vois pas ce qui s'y passe à l'intérieur). Dans ton script, tu peux lui passer des arguments dont la nature est prédéfinie, et elle te renvoie des données (dont la nature est aussi prédéfinie) que tu peux stocker dans une variable.
Lorsque tu te trouves dans ton script, tu n'as pas besoin de faire attention à ce que fait ta fonction. Tu sais juste que, pour récupérer certaines données précises tu dois faire appel à une fonction précise, en lui passant certains paramètres, et qu'en retour elle te renverra des données que tu pourra ensuite stocker dans une variable, qui elle, aura aussi une structure connue.

Dans ce cas, la structure de la variable finale devra en fait permettre de contenir plusieurs variables que la fonction a traitées. L'un des meilleurs moyens que je connaisse, c'est une structure en tableaux (si tu veux, une variable contenant d'autres variables, accessibles par leur nom : $tableau['var1'], $tableau['var2'] etc)
Dans ta fonction, tu auras bien entendu un traitement séparé de toutes ces variables, que tu rassemblera ensuite dans un 'tableau de variables'. C'est ce tableau que tu retournera grâce à 'return'.

Code:
function pages(...)
{
 $page_courrante = ...;

$nbre_pages_totales = ...;

$nbre_messages = ...;

$autre_variable = ...;

// La phase de traitement est terminée, on va donc préparer toutes ces variables pour être passées à l'extérieur de la fonction

$tableau['page_courrante'] = $page_courrante;
$tableau['nbre_pages_totales'] = $nbre_pages_totales;
$tableau['nbre_messages'] = $nbre_messages;
$tableau['autre_variable'] = $autre_variable;

// On vient de mettre toutes les variables dans un seul tableau (donc dans une autre variable), prête à être retournées par la fonction

return $tableau;
}

// A l'extérieur de la fonction, dans le script

$data = pages(...);

// $data['page_courrante'] == $tableau['page_courrante'] (à l'intérieur de la f) == $page_courrante (à l'intérieur de la f). Idem pour les autres variables.

En étant un peu malin, on n'a pas besoin de passer par la fastidieuse phase de concaténation des variables avant le return, si on utilise directement le tableau sans passer par une variable intermédiaire ;)
Journalisée


What isn't remembered never happened...
Arphus
Posteur assidu
****
Hors ligne Hors ligne

Messages: 236



Voir le profil
« Répondre #12 le: 12 Mai 2008 à 05:39:37 »

Sans verser personne.  Il serait peut-être préférable de lire les notions bases de la programmation.
je te conseil http://www.siteduzero.com : section PHP -> Chapitre sur les fonctions: pour en savoir plus sur le fonctionnement des fonctions void ou "typé".

Cela pourrait t'aider grandement.

Bonne continuation
Journalisée




Pages: [1]   Haut de page
Imprimer
 
Aller à:  

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines