8792 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

admettons qu'une page php ne fait rien d'autre que d'effectuer des requêtes et qu'elle finit par une redirection en javascript, est-ce que cette page doit quand même contenir les balises html head body, etc... ?

De manière générale est-ce qu'une page PHP doit-elle avoir systématiquement (sans exception) du code html à l'intérieur ?
Modifié par Sol (26 Jul 2006 - 15:29)
Absolument pas.

PHP sert à faire tout un tas de trucs, génération d'image, de code HTML, requêtes, et j'en passe, la génération de code HTML n'est qu'une de ses multiples possibilité.

(redirection javascript ? qu'est ce que ça vient faire la dedans ?)
Tu peux faire des traitements, et rediriger l'utilisateur vers une autre page grâce PHP et sa fonction header :
header('Location: mapage.php');
Ce sera mieux que javascript, car si l'utilisateur l'a désactivé il risque de se retrouver avec une page vide.
Modifié par 84mickael (26 Jul 2006 - 17:08)
Ok merci pour vos réponses.

84mickael a écrit :
Tu peux faire des traitements, et rediriger l'utilisateur vers une autre page grâce PHP et sa fonction header :
header('Location: mapage.php');
Ce sera mieux que javascript, car si l'utilisateur l'a désactivé il risque de se retrouver avec une page vide.


Ok je vais essayer ça.

Et un refresh avec la balise meta ça va aussi non ?
Sol a écrit :
Et un refresh avec la balise meta ça va aussi non ?
Non puisque tu seras obligé de mettre du HTML pour encadrer la balise meta, d'envoyer la page à l'utilisateur avant de lui retourner la véritable page.

Avec le PHP, tout se passe sur le serveur, c'est plus rapide, plus sûr et plus pertinent.
OK !

Si j'ai bien compris la fonction header doit être appelé en 1er dans une page html/php ?

dans ce cas comment faire si l'adresse de redirection dépend d'une variable calculée dans la page qui va être redirigée ?
Modifié par Sol (27 Jul 2006 - 12:00)
Les headers doivent être envoyé avant tout contenu, étant donné que tes variables et calculs ne sont pas du contenu envoyé, ça ne pose aucun souci.



$var = $_GET['page'];
header('location: ' . $var);


fonctionnera parfaitement par exemple.
hmm... pourquoi une variable n'est pas du "contenu" ?

ce que tu appelles contenu c'est du html alors ?
Modifié par Sol (27 Jul 2006 - 14:51)
Sol a écrit :
hmm... pourquoi une variable n'est pas du "contenu" ?
ce que tu appelles contenu c'est du html alors ?

Il ne doit y avoir aucun affichage (donc aucune donnée envoyée à l'utilisateur, logiquement du HTML) avant d'utiliser la fonction header.
c'est vrai que c'est plus rapide, on ne voit pas la page se recharger ! Smiley eek

Encore une toute petite question: quel que soit l'endroit où l'on place la fonction header dans la page, tout le code sera bien executé avant d'effectuer la redirection ?
Je ne suis pas certain mais je pense qu'il faut mettre le header une fois que tous les traitements ont été faits.
Quand je parlais de contenu, c'était HTML, XML, image, brocoli, n'importe quoi...

Les variable c'est pas vraiment du contenu ici.

Pour le header, tu dois le faire une fois tous les traitements fait, si tu mets le header avant les traitements, obligatoirement les traitements ne seront pas effectués, ça paraît logique Smiley sweatdrop
Olivier a écrit :
Pour le header, tu dois le faire une fois tous les traitements fait, si tu mets le header avant les traitements, obligatoirement les traitements ne seront pas effectués, ça paraît logique Smiley sweatdrop


est-ce que je rêve alors ?

je viens de tester j'ai mis la fonction header tout en haut de la page, et tous les traitements qui la suivent ont bien été effectués...

pas si logique que ça !
Modifié par Sol (28 Jul 2006 - 11:23)
Sol a écrit :


est-ce que je rêve alors ?

je viens de tester j'ai mis la fonction header tout en haut de la page, et tous les traitements qui la suivent ont bien été effectués...

pas si logique que ça !


Je demande à voir...

Quel code as-tu utilisé.
voici le code de la page en question:

<?php
	
	$erreur = false;
	
	include_once('../fonctions_php/fonctions.php');
	connexion();
	
	$id = $_GET['id'];
	
	// redirection
	if (!$erreur)
		header('location: ../fiche.php?id='.$id.'&modif=1');
	
	$login = getLogin($id);
	
/***********************************************
 SUPPRESSION DE L'ANCIENNE PHOTO (s'il y a)
***********************************************/

	if (photoIsSet($id))
	{
		$sql = "SELECT photo
			FROM `membre`
			WHERE id = ".$id;
				
		$res = mysql_query($sql) or die('Erreur SQL ! '.$sql.'<br />'.mysql_error());
		$ligne = mysql_fetch_array($res);
		$photo = "../".$ligne['photo'];
		
		unlink($photo);
	}


/***********************************************
 UPLOAD DU FICHIER
***********************************************/

	$nomDestination = 'photoid'.$id.'.'.extraitChamp($_FILES['photo']['type'],2,'/');
	
	$repertoireFromFiche = "../contenu/fiches_membres/".$login."/";
	$repertoireDestination = "../".$repertoireFromFiche;
	
	if (is_uploaded_file($_FILES['photo']['tmp_name']))
	{
		if (!rename($_FILES['photo']['tmp_name'], $repertoireDestination.$nomDestination))
		{	
			$erreur = true;
			echo "Le déplacement du fichier temporaire a échoué. <br />";
			echo "Vérifiez l'existence du répertoire ".$repertoireDestination;
		}
	}
	else
	{
		$erreur = true;
		echo "Le fichier n'a pu être uploadé";
	}

/***********************************************
 UPDATE DE LA BASE DE DONNEES
***********************************************/

	$contenuimg = $repertoireFromFiche.$nomDestination;
	$sql = "UPDATE `membre`
		SET photo='".$contenuimg."'
		WHERE id = ".$id;
			
	mysql_query($sql) or die('Erreur SQL ! '.$sql.'<br />'.mysql_error());


?>


que je place le


	// redirection

	if (!$erreur)

		header('location: ../fiche.php?id='.$id.'&modif=1');


comme dans l'exemple où tout en bas de la page, le code dans la page est bien executé.
Salut ...

Le code est exécuté, je veux bien, mais est-ce que la redirection a lieu ?

Si ce n'est pas le cas, c'est tout simplement que le test
if (!$erreur) ...
n'a pas fonctionné.

Ton serveur ne te renvoie pas d'erreurs ? la syntaxe de cette condition en particulier ne me semble pas correcte. J'aurais écrit soit
if (!$erreur) :
    header("Location: ../fiche.php...");
endif;
soit
if (!$erreur) {
    header("Location: ../fiche.php...");
}
S'il n'y a qu'une seule ligne dans le if, les accolades (ou autre) sont optionnelles (bien que moins propre comme code)

D'après la doc :
<?php
header("Location:  http://www.example.com/");  /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?> 


http://fr3.php.net/manual/en/function.header.php

Donc, a priori c'est que le code qui suit un "header" semble pouvoir être executé (ce que je trouve carrément étrange Smiley ohwell )
Modifié par Olivier (29 Jul 2006 - 01:59)
Sopo a écrit :
Salut ...

Le code est exécuté, je veux bien, mais est-ce que la redirection a lieu ?

Si ce n'est pas le cas, c'est tout simplement que le test
if (!$erreur) ...
n'a pas fonctionné.

Ton serveur ne te renvoie pas d'erreurs ? la syntaxe de cette condition en particulier ne me semble pas correcte. J'aurais écrit soit
if (!$erreur) :
    header("Location: ../fiche.php...");
endif;
soit
if (!$erreur) {
    header("Location: ../fiche.php...");
}



le redirection a bien eu lieu, et pas de message d'erreur, la syntaxe du if est correcte.

Olivier > Bon c'était juste pour savoir, je laisserai le header après mon code executé, même si au final c'est pas très clair ct'histoire... Smiley ohwell
Modifié par Sol (29 Jul 2006 - 09:46)
Il me semblait bien qu'il y avait une particularité à cette méthode header, c'est pour celà que j'avais émis une réserve. Je crois qu'il est recommandé d'utiliser la méthode exit, juste après chaque utilisation de la méthode header.
bonsoir

l'utilisation des en-têtes en PHP doit se faire avant l'affichage d'un code HTML.
si vous avez déjà un code PHP, et que vous placez un header(); n'importe où dans ce code, il n'y a pas de problème (mais attention à ce que ce soit bien propre Smiley murf ).
en revanche, si vous affichez du code automatiquement HTML (echo 'str';), l'utilisation de header(); doit être oublié pour la suite de votre code.
sauf si vous placez la page dans un tampon (buffer).
cette utilisation est courante et nous enlève les casses-têtes de ces redirections ou autres utilisations des en-têtes.
un exemple me parait plus simple :
un header mais pas de code HTML

$a = 1;
$b = 2;
if($a == $b)
    header('location: url');

un header et du code HTML après

$a = 1;
$b = 2;
if($a == $b)
    header('location: url');
else
    echo 'a est différent de b';

pas de probleme.
un header et du code HTML avant

$a = 1;
$b = 2;
if($a == $b)
    echo 'a est égal à b';
else
    header('location: url');


donc il faudrait placer un tampon pour que ce dernier code fonctionne.


ob_start();

$a = 1;
$b = 2;
if($a == $b)
    echo 'a est égal à b';
else
    header('location: url');

ob_end_flush();
ob_end_clean();


ob_start(); démarre la mise en tampon
ob_end_flush(); éteint le tampon et envoie les données
ob_end_clean(); détruit les données du tampon

ce dernier code est parfaitement correct, et évite le casse-tête de l'emplacement des header(); mais aussi pour l'utilisation des cookies (setcookie).
de plus il accélére légèrement la génération du document (il me semble)

pour plus d'informations
http://fr.php.net/manual/fr/ref.outcontrol.php
l'utilisation du manuel est la meilleur facon d'apprendre Smiley smile pour ma part c'est comme ca que j'ai fais Smiley langue


concernant la redirection, je conseille vivement header.
le meta refresh et le javascript n'est pas correct vis à vis du référencement, et comme la fait remarquer Sol, header est nettement plus rapide.


je vous souhaite de bonne nuit en perspective Smiley cligne
Modifié par HyWaN (29 Jul 2006 - 22:14)
Pages :