J'ai honte mais bon...

Eléphant du PHP | 53 Messages

17 juil. 2007, 16:42

Salut,

J'ai une erreur "headers already sent". Alors je sais ce que c'est, je sais ce qu'il faut faire et ne faut pas faire pour l'éviter. Mais là impossible de voir où est mon erreur ... si vous pouviez me dire : "C'est là l'erreur gros naze..!" cela m'arrangerais :(

Voici donc le code (une identification classique à base de session ...
<?php
include_once('include/bdd.php');
if($_POST["login"] != "" && $_POST["mdp"] != "")
{
	$login     = $_POST["login"];
	$pass      = $_POST["mdp"] ;
	$bdd = new bdd();
	$result = $bdd->cls_bdd_affichage("SELECT * FROM sj_utilisateur WHERE login_sj_utilisateur='".$login."' AND mdp_sj_utilisateur='".$pass."'");
	$result = mysql_fetch_object($result) ;
	$bdd->cls_bdd_ending();
	if(is_object($result))
	{
		session_start() ;
		$_SESSION["login"] = $login ;
		header("Location admin_principale.php") ;
	}
	else
	{
		echo"<meta http-equiv=\"Refresh\" content=\"0;URL=erreur.html\">";
	}
}//fin if
?>
le fichier bdd : (c'est lui visiblement gène le header)
<?php
include_once ('path.php');
class bdd{
	function cls_bdd_connexion_serveur(){
		@mysql_connect(HOST, USER, PASS);
		@mysql_select_db(BDD);
	}//fin de la fonction connexion_serveur
	function cls_bdd_ending(){	
		mysql_close();
	}//fin de la fonction cls_bdd_ending	
	function cls_bdd_message_erreur($type,$id){
		switch($type) :
			case "host" :
				echo "01 : Erreur de connexion avec le serveur : $id";
			break;			
			case "bdd" :
				echo "02 : Erreur de connexion avec la base de données : $id";
			break;				
		endswitch;		
	}//fin de la fonction cls_bdd_message_erreur
	function cls_bdd_affichage($query){	
		bdd::cls_bdd_connexion_serveur();
		$result = mysql_query($query);
		return $result;
	}//fin de la fonction
}//fin de la class BDD
?>	
et le fichier path qui lui ne contient rien de bien intéressant :
<?php
define("USER","xx");
define("PASS","xx");
define("HOST","xx");
define("BDD","xx");
?>
Merci de me dire quoi si vous avez vu quelques choses.

@+ Thegritch

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 juil. 2007, 16:46

Dans les différents fichiers inclu, tu n'as pas d'espace après le code (après ?>) ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

17 juil. 2007, 16:47

Non j'y ai pensé mais pas d'espace superflux.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

17 juil. 2007, 16:59

J'ai une erreur "headers already sent".
Poste l'erreur en question, le message devrait contenir le fichier et la ligne où l'output a démarré.

Eléphant du PHP | 53 Messages

17 juil. 2007, 17:25

Voici le code :

Code : Tout sélectionner

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /include/bdd.php:30) in /admin_login.php on line 13 Warning: Cannot modify header information - headers already sent by (output started at /include/bdd.php:30) in /admin_login.php on line 15
La ligne 30 est la dernière du fichier.
La ligne 13 : session_start
La ligne 15 : header()

@+ Thegritch[/php]

ViPHP
ViPHP | 4674 Messages

17 juil. 2007, 17:26

Je connais ton erreur espèce de gros naze ;-)

J'ai nommé ça le caractère invisible lol. Mais c'est peut-être le BOM, je ne suis pas sûr.
Ouvres ton fichier avec un éditeur Hexadécimal. Et au tout début, tu auras 3 caractères à la :-#. Supprimes les, et tout ira bien.

Je ne me rappelle plus de la combinaison, et n'arrive plus à reproduire l'erreur ... Mais tu verras, ce sont les 3 premiers caractères de ton fichier (et évidement, il ne s'affiche pas dans le navigateur, sinon ce n'est pas drôle).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 juil. 2007, 17:29

Bonjour,

Tu as oublié les deux-points après Location dans ta commande Header...
 header("Location admin_principale.php");
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
ViPHP | 4674 Messages

17 juil. 2007, 17:38

Oublier les deux points ne génère pas d'erreur, si ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 53 Messages

17 juil. 2007, 17:46

Bonjour,

=> J'ai corrigé le ":" après Location
=> J'ai ouvert avec un éditeur hexadécimal les fichiers sans rien voir au début :(

Je vais hôter les include et refaire la connexion à la BDD dans le fichier et l'extraire petit a petit pour voir d'où provient l'erreur ... se sera long mais je trouverais :)

Mais n'hésitais pas si vous avez des soluc !! je suis preneur.

Edit : non ... le locate fonctionne bien mais bon autant être rigoureux.

@+ TheGritch

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

17 juil. 2007, 18:01

Il y a sûrement un saut de ligne à la fin du fichier. Si ton fichier finit par un ?> retire-le complètement, il est facultatif.

Mammouth du PHP | 505 Messages

17 juil. 2007, 19:44

Si je puis me permettre, à toi et tout les gros naze de ton espèce, il y a un truc tout bête pour savoir où est le caractère parasite. C'est de le gentiment demander à php.

if(headers_sent($file, $line)) {
 echo "gros naze, un caractère a été emis dans le fichier $file en ligne $line";
}

Mammouth du PHP | 19672 Messages

17 juil. 2007, 21:55

Petit truc : à la fin de ton fichier de classe de connexion tout comme le fichier de configuration, vire complètement le "?>" : c'est la méthode adoptée dans le Zend Framewok précisément pour être sur de ne pas envoyer un espace parasite. Comme ces fichiers ne sont pas sensés envoyer de données vers le navigateur et qu'ils ne contiennent pas de HTML, la fermeture est complètement facultative.

Autre détail : vire les "@" devant tes fonctions MySQL : ces cache-misère sont une abomination pour un développeur. S'il y a des erreurs, on les affiche et on les corrige, on ne les glisse pas discrètement sous le t@pis :P

Ensuite, dans ta classe de connexion, on voit par exemple ceci :
//...
echo "01 : Erreur de connexion avec le serveur : $id"; 
//...
Je suggère la chose suivante : crée une propriété de classe $erreurs (=array() de préférence) et ajoute une méthode getErreurs() qui te renvoie le contenu s'il y en a et remplace le code mentionné par :
//...
$this->erreurs[] = "01 : Erreur de connexion avec le serveur : $id"; 
//...
Allez une dernière pour la route, mais d'autres pourront avantageusement s'en inspirer : fais des concaténations propres :
//...
$this->erreurs[] = "01 : Erreur de connexion avec le serveur : ". $id .";"; 
//...
Bon dev :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 53 Messages

18 juil. 2007, 09:24

Un grand merci à vous tous.

Effectivement, le "?>" (de fin donc) généré un espace parasite. (invisible sur mon éditeur).
Cyrano je reprend tes conseils pour la déclaration des erreurs.

En faite le code de base pour la connexion mysql est :
@mysql_connect(HOST, USER, PASS) or die ('erreur');
        @mysql_select_db(BDD) or die ('erreur'); 
Mais au moment où j'ai envoyé le code sur le forum j'avais dans l'idée de mettre une fonction a la place du "DIE" :wink:

[RESOLU] donc...

I'll be back with new hard questions ! HAHAHAHAHAAH *rire evil*

@+ Et merci