Les fonctions et les includes

Fermé
geoffreyvp - 16 févr. 2014 à 21:35
 geoffreyvp - 16 févr. 2014 à 23:19
Bonjour a tous,

voila je reprend le codage php recemment après un long temps d'absence , et je dois avouer que ca fait du bien de reprendre un peu les codes en main

Par contre , créant un nouveau site web , je tombe sur une erreur qui me semble particulière. En tout cas, je n'ai jamais eu ca avant ...

Voila le soucis en bref :

J'ai une page "index.php" qui a une variable "$newstitle[$valuetraduction]"
J'ai une autre page "fonctions.php" qui contient l'ensemble de mes fonctions crées
et une page "traduction.php" qui contient l'ensemble des traductions pour mon site

Le problème est le suivant :

J'ai dans ma page "traduction.php" un tableau sous la variable "$newstitle" qui contient des données.

Ma page fonctions.php contient elle la valeur de "$valuetraduction" dans une fonction "up" qui me sert a ne pas retaper l'entete constamment. (la variable est obtenue en fonction du lien avec un $_GET). Dans cette fonction up , un "include" pour la page traduction.php est fait.

Essayant de recuperer ces variables, j'appelle donc simplement la fonction up (en ayant bien inclus la page fonctions.php), et là, magie, mais je me retrouve avec les 2 variables non assignées ...

Alors que si je deplace la requete de la page index.php à fonctions.php , la ca marche...

Est ce que la fonction "include" aurait une portée ?

Merci d'avance pour vos réponses :)

geof

ps : voici certains codes qui peuvent surement etre utiles

la fonction "up"

function up()
{
session_start();
include('include/traduction.php');
$currentpage = $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];
if(isset($_GET['lang']))
{
$lang = strtoupper($_GET['lang']);
}
else
{
$lang = 'FR';
}
if($lang == 'FR' OR $lang == 'fr')
{
$valuetraduction = 1;
}
elseif($lang == 'AN' OR $lang == 'an')
{
$valuetraduction = 2;
}
elseif($lang == 'NL' OR $lang == 'nl')
{
$valuetraduction = 3;
}
else
{
echo '<head><meta charset="utf-8"></head>
<body>Nous avons eu un problème , Cliquez ici pour rafraichir votre page -> <a href="index.php?lang=FR">Ici</a><br />
We hebben een probleem gehad, click hier om te updaten the pagina -> <a href="index.php?lang=NL">Hier</a><br />
We got a problem, click here for refresh the page -> <a href="index.php?lang=AN">Here</a></body>';
exit();
}
echo '<!DOCTYPE html>
<html lang="'.$lang.'">
<head>
<meta charset="utf-8">
<title>**** - '.$lang.'</title>
<link rel="stylesheet" href="design.css" />
</head>
<body>
<div id="page">
<div id="entete">
<div id="choicelanguage" onmouseover="getElementById(\'choicelanguagefull\').style.display = \'block\';" onmouseout="getElementById(\'choicelanguagefull\').style.display = \'none\';">? '.$lang.'</div>
<div id="choicelanguagefull" onmouseover="getElementById(\'choicelanguagefull\').style.display = \'block\';" onmouseout="getElementById(\'choicelanguagefull\').style.display = \'none\';"><a href="http://'.$currentpage.'?lang=FR"><img src="img/language/fr.png" width="50" height="25" /> FR</a><br /><a href="http://'.$currentpage.'?lang=NL"><img src="img/language/nl.png" width="50" height="25" /> NL<br /><a href="http://'.$currentpage.'?lang=AN"><img src="img/language/an.png" width="50" height="25" /> AN<br /></div>
</div>
<div id="menuline"><div id="menuaccueil"><a href="index.php?lang='.$lang.'"><input id="buttonlink" type="button" value="'.$menu1[$valuetraduction].'"/></a></div><div id="magasinmenu"><a href="shop.php?lang='.$lang.'"><input id="buttonlink" type="button" value="'.$menu2[$valuetraduction].'" /></a></div><div id="contactmenu"><a href="contact.php?lang='.$lang.'"><input id="buttonlink" type="button" value="'.$menu3[$valuetraduction].'" /></a></div><div id="wheremenu"><a href="where.php?lang='.$lang.'"><input id="buttonlink" type="button" value="'.$menu4[$valuetraduction].'" /></a></div><div id="sectionrestante"><a href="index.php?lang='.$lang.'"><input id="buttonlink" type="button" value="'.$menu5[$valuetraduction].'" /></a></div></div>
';


la page index.php


<?php
include('functions.php');
up();
?>
<div id="defil">
</div>
<div id="news">
<div id="titlenews"><?php echo $newstitle[$valuetraduction]; ?></div>
</div>
<?php
down();
?>

la page traduction.php


<?php
//General
$menu1 = array('Accueil','Accueil','Home','Home');
$menu2 = array('Catalogue','Le Catalogue','The Catalogue','De Webcataloog');
$menu3 = array('Contact','Contactez nous','Contact us','Contacteer Ons');
$menu4 = array('endroit','Où nous trouver ?','How To Find Us ?','Waar Vindt U Ons ?');
$menu5 = array('Soldes','Soldes','Sales','Promoties');
//index
$newstitle = array('titre','Tenez vous au courant','Stay informed','blijf op de hoogte');
//Catalogue
//Emplacement
//Contact
//Reste
?>

2ème PS : faites pas attention a certaines erreurs de structure, je corrige ca plus tard (le session_start après le include par exemple ^^)

2 réponses

Utilisateur anonyme
16 févr. 2014 à 22:53
Bonsoir

Je ne suis pas sûr d'avoir tout compris de tes explications, mais si ton tableau $newstitle est défini dans traduction.php, et que traduction.php est inclus à l'intérieur de la fonction up(), alors sans le mot-clé global, $newstitle est une variable locale à la fonction up. Donc rien d'étonnant à ce que $newstitle ne soit pas connu en dehors de la fonction up(), que ce soit sans fonctions.php ou index.php.
Même chose pour ta variable $valuetraduction qui est elle aussi locale à up().
Il suffit d'ajouter une déclaration
global $valuetraduction,$newstitle;
dans up() et ça devrait mieux marcher.

2ème PS : Qu'est-ce qui empêche un session_start d'être après un include ?
0
Aaaah mais oui je suis bete ^^ merci de ton aide :-)

Pour le ps , normalement un session start se met avant tout code , hors la ce n'est pas le cas :-)
C'est pas une erreur mais ca ne se rapporte pas aux regles de codage
0
ah bon ? ah ben autant pour moi alors , je pensais que c'etait pour n'importe quel donnees :) fin en soit ca change pas grand chose ^^
0
Utilisateur anonyme
16 févr. 2014 à 23:11
normalement un session start se met avant tout code
Non, non et archi non.
Le session_start() fait appel aux en-têtes HTTP et doit donc être utilisé avant l'envoi des données. Mais on peut exécuter tout le code php qu'on veut avant, tant qu'il n'envoie pas de données.
Il faut donc en particulier l'appeler avant <!doctype><html> etc, comme toutes les fonctions qui font appel aux en-têtes : header('location'), fonctions sur les cookies...
0