8797 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je suis dans une mouise inextricable. Je travaille actuellement sur un nouveau projet, et comme toujours, j'expérimente un peu pour mieux maîtriser le PHP (la voie du samouraï-codeur!... passons Smiley sweatdrop ).
Il se trouve que j'ai régulièrement des problèmes avec la fonction include et le fichier-type vars.php, d'habitude je m'en sors plus ou moins, mais là j'aimerais que ça fonctionne comme la doc prétend que c'est supposé fonctionner.

Voici mon problème:
J'ai un certain nombre de variables à récupérer, et j'en ai besoin pour toutes mes pages. J'ai donc créé un fichier vars.php chargé de récupérer ces variables, et je l'inclus là où il faut.
Au début, je pensais que l'inclure dans le head général suffisait pour qu'elles soient récupérables dans tous les fichiers inclus par la suite, mais je me rends compte que ce n'est pas le cas. J'ai donc essayé d'inclure le fichier dans tous les fichiers où j'aurais besoin de faire appel à ces variables, mais ça ne fonctionne pas! Aucune variable n'est récupérée de cette façon (et pourtant elles sont bien transmises).

Evidemment, j'ai exploré google et épluché tous les tutos et toutes les docs possibles (ou presque, n'exagérons rien), dont les documents présents sur Alsa, mais je n'ai trouvé aucune réponse ou solution à mon problème...

Quelqu'un aurait il une idée?

Je ne met pas de code dans l'ouverture du sujet, ne sachant ce qu'il sera nécessaire de montrer,

Cordialement,

Smoke
Modifié par Smoke (08 May 2009 - 15:16)
Salut,

Smoke a écrit :
Je ne met pas de code dans l'ouverture du sujet, ne sachant ce qu'il sera nécessaire de montrer
Ben si tu commences tes pages par <?php include_once('vars.php') ?> il faut nous donner le code de... vars.php Smiley lol
ptdr bien vu Smiley lol Smiley lol
<?php
	switch($_GET['part']){
			case 'wr':
				$part='wr';
			break;
			case 'exh':
				$part='exh';
			break;
			default:
				$part='wr';
			break;
		}
	if($_POST['access']){
		$access=$_POST['access'];
	}elseif($_GET['access']){
		$access=$_GET['access'];
	}
	$root=$_GET['root'];
	$branch=$_GET['branch'];
	$part=$_GET['part'];
	$perso=$_SESSION;
?>
A priori il manque un session_start();

Sinon je suppose que tu as déjà fait un debug
echo '<pre>';
print_r($_GET);
echo '</pre>';
echo '<pre>';
print_r($_POST);
echo '</pre>';
Et après ça il faudra aussi montrer ton formulaire...
t'as bien fait de me parler du session_start, je l'avais pas mis partout où j'voulais, j'ai donc comblé les vides^^
Ceci dit, vu que le include ne fonctionne pas, le problème ne se situe même pas encore sur le session start, puisque j'ai pas encore eu l'occasion de créer de session Smiley lol

pour le debug, c'est tout fait, je sais que j'récupère bien mes variables

Ensuite, il ne s'agit pas de formulaires pour ces variables, mais d'url^^ type:
index.php?part=exh&root=professional
Smoke a écrit :
pour le debug, c'est tout fait, je sais que j'récupère bien mes variables
Ben alors où est (précisément) le problème ?
le problème est que ça me les renvoi pas partout! Smiley lol

je récupère les variables dans le premier fichier, index.php. Mais j'inclus vars.php dans des fichiers contenant uniquement des classes POO, pour me servir de ces fameuses variables, sauf qu'à partir de mes classes je n'arrive pas à accéder à ces variables, alors que ça m'arrangerait bien Smiley smile
Smoke a écrit :
le problème est que ça me les renvoi pas partout! Smiley lol

je récupère les variables dans le premier fichier, index.php. Mais j'inclus vars.php dans des fichiers contenant uniquement des classes POO, pour me servir de ces fameuses variables, sauf qu'à partir de mes classes je n'arrive pas à accéder à ces variables, alors que ça m'arrangerait bien Smiley smile
Ben tu aurais pu commencer par là non ? Smiley rolleyes

Lire Portée des variables.

Soit tu passes tes variables en paramètres soit tu fais :
<?php
$a = 'aaa';
class test {
	public function test() {
		global $a;
		echo '<p>a = '.$a.'</p>';
	}
}
new test();
?>
j'ai commencé par là, mais c'était pas aussi clair que ma dernière explication Smiley cligne je l'admet Smiley lol

je vais tenter le coup des global, est-ce que je peux le faire dans mon fichier vars?

genre

           global $root=$_GET['root'];
	global $branch=$_GET['branch'];
	global $part=$_GET['part'];


ça fonctionnerait ça?
Smoke a écrit :
jça fonctionnerait ça?
Non et pour 2 raisons... mais comme c'est bien de faire ses propres tests et découvertes je te laisse chercher. Smiley murf
ça fonctionne pas Smiley lol

alors, ce que j'ai compris:
global se met dans la fonction où on a besoin de la fameuse variable, pour en définir la portée, ça ne va donc pas avec l'attribution de la valeur
Smoke a écrit :
global se met dans la fonction où on a besoin de la fameuse variable
Yep.
Smoke a écrit :
ça ne va donc pas avec l'attribution de la valeur
Yep.

Plus précisément on ne peut pas faire global $var = valeur;

Il faut 2 lignes :
global $var;
$var = valeur;

Modifié par Heyoan (07 May 2009 - 18:42)
hum ça ne fonctionne pas...

voici mes fichiers:

index:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title> Waffle and Rabbit Actsociation </title>
<meta name="description" content="Free Web tutorials" />
<meta name="keywords" content="" />
<meta name="author" content="W[&amp;]R" />
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1" />
<link rel='stylesheet' href='style.css' type='text/css'/>
<?php
	session_start();
	include_once('vars.php');
	include_once('dbPlug.php');
	include_once('tools.php');
	switch($part){
		case 'wr':
			$style="<link rel='stylesheet' href='styleWR.css' type='text/css'/>";
		break;
		case 'exh':
			$style="<link rel='stylesheet' href='styleEXH.css' type='text/css'/>";
		break;
		default:
			$style="<link rel='stylesheet' href='styleWR.css' type='text/css'/>";
		break;
	}
	echo $style;
	$element=new element();
	echo "\n";
?>
</head>
<body class='-<?=$part?>'>
	<div>
<?php
	$element->head();


vars.php:
global $root; global $branch; global $part;
	switch($_GET['part']){
			case 'wr':
				$part='wr';
			break;
			case 'exh':
				$part='exh';
			break;
			default:
				$part='wr';
			break;
		}
	if($_POST['access']){
		$access=$_POST['access'];
	}elseif($_GET['access']){
		$access=$_GET['access'];
	}
	$root=$_GET['root'];
	$branch=$_GET['branch'];
	$part=$_GET['part'];
	$perso=$_SESSION;


tools:


<?php
include_once('vars.php');
class element {
	function head(){
		$fCorps="\n\t<div>";
			echo ( $root and $branch ) ? '<p>variables!</p>' : '<p>pas variables!</p>';
			if($root and $branch and $_POST ){
				switch($root){
					case 'access':
						include_once('access.php');
						switch($branch){
							case 'getIn':
								$fCorps.="<p>red</p>";
								$fCorps.=TRT::getIn();
							break;
						}
					break;
					case 'notebox':
						include_once('notebox.php');
					break;
				}
			}else{
				$fCorps.="<p>Elite...$_GET[root] $root $_GET[branch] $branch</p>";
			}
		$fCorps.="\n\t</div>";
		echo $fCorps;
	}



j'ai mis que le code concerné/nécessaire

je ne vois pas où est l'erreur ^o) Smiley bawling
Smoke a écrit :
alors, ce que j'ai compris:
global se met dans la fonction où on a besoin de la fameuse variable,
...ou dans la class !
hum j'allais justement te faire part de mes petites avancées Smiley lol

je commence à avoir des résultats, mais j'suis plutôt mécontent, j'pensais que ça fonctionnerait plus simplement ^o).

Donc, il faut que je passe par la classe, avec les constructeurs je suppose? J'ai toujours été une bille avec eux :s

dis moi jusqu'à quel point j'me trompe:

class maClasse{
 function maClasse(){
   global $root, $branch, $part;
 }
function robert(){
 echo $root.$branch;
 }
}

Modifié par Smoke (08 May 2009 - 02:07)
Bonjour,

Smoke a écrit :
ptdr bien vu Smiley lol Smiley lol
<?php
	switch($_GET['part']){
			case 'wr':
				$part='wr';
			break;
			case 'exh':
				$part='exh';
			break;
			default:
				$part='wr';
			break;
		}
	if($_POST['access']){
		$access=$_POST['access'];
	}elseif($_GET['access']){
		$access=$_GET['access'];
	}
	$root=$_GET['root'];
	$branch=$_GET['branch'];
	$part=$_GET['part'];
	$perso=$_SESSION;
?>


pourquoi faire tout ceci alors que tu peux accéder directement à tes variables? Tu stockes des variables qui sont déjà stockées.

Smoke a écrit :
le problème est que ça me les renvoi pas partout! Smiley lol

je récupère les variables dans le premier fichier, index.php. Mais j'inclus vars.php dans des fichiers contenant uniquement des classes POO, pour me servir de ces fameuses variables, sauf qu'à partir de mes classes je n'arrive pas à accéder à ces variables, alors que ça m'arrangerait bien Smiley smile


essaye de faire une $_GET['part'] (ainsi que pour tes autres variables) depuis ton objet.


lire $_GET

php.net a écrit :

Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.


C'est ce que tu veux je crois Smiley ravi .
bzh a écrit :
essaye de faire une $_GET['part'] (ainsi que pour tes autres variables) depuis ton objet.
C'est vrai mais comme il y a des tests effectués en dehors de la classe (sur $part et $access) et que ces variables semblent servir ailleurs ce n'est pas forcément très logique de les refaire dans la classe... Smiley murf

De toutes façons il y a plein de méthodes pour faire cela et il faut voir en fonction du contexte (on peut également citer define ou $GLOBALS...)
Salut tous les deux : o) la forme?

bzh, ce que tu propose ne m'arrange pas trop. J'aimerais précisément éviter de retaper $_GET['mavar'] ou encore $_POST['mavar'] et de faire des traitements dessus un peu partout, c'est pour ça que j'veux les déclarer dans un fichier : o)

sinon, okay pour la doc, même si j'le savais déjà. Du coup j'ai une question (et j'pense aussi connaître la réponse, mais on sait jamais): si les variables get sont superglobales, pourquoi les affectations de valeurs obtenues en get ne le sont pas? genre: $root=$_GET['root'];
bon, la réponse à laquelle je pense: on affecte une valeur obtenue par une superglobale, mais la nouvelle variable ne l'est pas (j'ai bien compris?)

Heyoan, a priori les constantes correspondraient davantage à mes besoins, je suppose que dans le cas où j'aurais des contrôles et modifs à faire dessus, il me faudrait les faire avant de les déclarer en constantes, n'est-ce pas?

$GLOBALS pourrait aussi faire l'affaire, mais ça me laisserait avec la contrainte qui m'ennui, à savoir celle de répéter sans cesse une structure classique que je voudrais simplier :s
Smoke a écrit :
Salut tous les deux : o) la forme?
Oui ! Smiley biggrin

Smoke a écrit :
on affecte une valeur obtenue par une superglobale, mais la nouvelle variable ne l'est pas (j'ai bien compris?)
Oui.

Smoke a écrit :
Heyoan, a priori les constantes correspondraient davantage à mes besoins, je suppose que dans le cas où j'aurais des contrôles et modifs à faire dessus, il me faudrait les faire avant de les déclarer en constantes, n'est-ce pas?
Oui : par définition une fois qu'une constante a été définie on sait que sa valeur sera toujours... constante !
cool Smiley lol j'apprends bien^^
petite gêne: lors de l'utilisation d'une constante dans une chaîne, je suis obligé de concaténer
Ce n'est pas bien grave, vu les constantes en question, mais si un jour je dois procéder différement ça pourrait être problématique. Enfin, j'aviserais^^

Un grand merci à tous les deux pour votre aide Smiley lol en particulier à toi Heyoan pour ta patience : o) ce fut un plaisir de papotter avec vous pour régler ça^^

Bonne journée et à bientôt Smiley smile je m'en vais continuer mes scripts, et si j'suis dans la mouise à nouveau... ba vous serez forcément au courant Smiley lol

(comment on fait déjà pour mettre le statut en résolu?(: )
Modifié par Smoke (08 May 2009 - 15:15)