session

A

Anonyme

Invité
Bonjour

Je déclare une session et je me vois retourner :

"Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /var/www/free.fr/1/1/xx/nomdufichier) in /var/www/free.fr/1/1/xx/nomdufichier on line 123"

et "Warning: Cannot modify header information - headers already sent by (output started at /var/www/free.fr/1/1/xxx/nomdufichier) in /var/www/free.fr/1/1/xxx/nomdufichier.php on line 124"


merci d'avance de votre aide

Albert
 
Halbert a dit:
Bonjour

Je déclare une session et je me vois retourner :

"Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /var/www/free.fr/1/1/xx/nomdufichier) in /var/www/free.fr/1/1/xx/nomdufichier on line 123"

et "Warning: Cannot modify header information - headers already sent by (output started at /var/www/free.fr/1/1/xxx/nomdufichier) in /var/www/free.fr/1/1/xxx/nomdufichier.php on line 124"


merci d'avance de votre aide

Albert
Y'aurait-il des espace au début de ta pages?
ou encore dans ton fichier php.ini change le settings pour:

Bloc de code:
output_buffering=On

Marc-André
 
Marc-André a dit:
Y'aurait-il des espace au début de ta pages?
ou encore dans ton fichier php.ini change le settings pour:

Bloc de code:
output_buffering=On

Marc-André

Bonjour et merci

pas de blanc en début de page.

Exciuse mon ignorance mais je n'ai pas de fichier php.ini : quel est ce fichier ?

Albert
 
Halbert a dit:
Bonjour et merci

pas de blanc en début de page.

Exciuse mon ignorance mais je n'ai pas de fichier php.ini : quel est ce fichier ?

Albert

Dans le répertoire

/etc

il y a un fichier d'initialisation de php il se nomme par défaut php.ini.default

fais en une copie que tu nommera php.ini comme cela tu garde toujours le fichier php.ini.default en backup ;) ensuite fais une recherche de output_buffering à l'intérieur de php.ini par défaut elle est Off change la valeur pour On sauve le fichier et redémarre ta machine ou le service web le tout devrait (je dis bien devrait :D :D ) fonctionner.


Marc-André
 
Marc-André a dit:
Dans le répertoire

/etc

il y a un fichier d'initialisation de php il se nomme par défaut php.ini.default

fais en une copie que tu nommera php.ini comme cela tu garde toujours le fichier php.ini.default en backup ;) ensuite fais une recherche de output_buffering à l'intérieur de php.ini par défaut elle est Off change la valeur pour On sauve le fichier et redémarre ta machine ou le service web le tout devrait (je dis bien devrait :D :D ) fonctionner.


Marc-André

Je ne comprends pas, je n'ai pas de dossier "/etc" , j'ai fait une recherche avec spotlight sur "php.ini.default" : rien !

Albert
 
Halbert a dit:
pas de blanc en début de page
Ce n'est pas seulement les blancs qui peuvent poser problème, c'est toute donnée qui est envoyée au client avant l'utilisation de session_start().

Petit rappel de fonctionnement du protocole HTTP. Quand deux machines échangent des données en HTTP, chaque échange commence par un envoi d'entête donnant des informations sur le document qui est envoyé (son type mime, sa langue, son jeu de caractères, etc). Ces entêtes ne doivent être envoyés qu'une seule fois par échange.

La fonction PHP session_start() envoie des entêtes au client, notamment pour indiquer au client de créer un cookie de session. Seulement, si avant cette fonction tu envoies d'autres données, le serveur va automatiquement envoyer des entêtes par défaut (car chaque échange doit débuter par des entêtes). Du coup, ton serveur envoie des entêtes, puis les quelques données qui se trouvent avant ta fonction session_start(), et quand il tombe sur session_start() il va vouloir envoyer à nouveau des entêtes. Et c'est là que tu te manges le poétique message d'erreur que tu donnes.

Ces données qui provoquent l'envoi des entêtes par défaut peuvent être de simples chaînes de caractères envoyées avec "print" ou "echo", ou par l'intermédiaire d'une fonction. Ca peut aussi être des espaces blancs, des tabulations ou des retours à la ligne qui sont présent dans le fichier PHP avant l'ouverture de la balise "<?php".

Voilà quelques exemples qui peuvent provoquer cette erreur.

D'abord le cas classique : une chaîne de caractère est envoyé au client, donc avec des entêtes, puis l'appel à session_start() provoque l'erreur car session_start() envoie à nouveau des entêtes.
Bloc de code:
<?php
echo "hello world";

session_start();
...
?>

Plus subtil : avant l'ouverture de la balise PHP, il y a un retour à la ligne. Ce caractère est envoyé au client, ce qui oblige le serveur à envoyer des entêtes. Puis, dans le script PHP, l'appel à session_start() envoie de nouveau des entêtes : erreur.
Bloc de code:
<?php
session_start();
...
?>

Enfin, autre cas : une fonction qui envoie des données au client est appelée avant session_start(), et on a donc à peu près le même cas de figure que dans le premier exemple.
Bloc de code:
<?php
function foo() {
   print "hello world";
}

foo();

session_start();
...
?>

Dans ton cas, tu as vraisemblement des données qui sont donc envoyées au client avant l'appel à session_start(). Vérifie bien tout le code que tu as avant ton session_start() (appels de fonctions, d'include, etc.).
 
  • J’aime
Réactions: molgow
sylver a dit:
Ce n'est pas seulement les blancs qui peuvent poser problème, c'est toute donnée qui est envoyée au client avant l'utilisation de session_start().

Petit rappel de fonctionnement du protocole HTTP. Quand deux machines échangent des données en HTTP, chaque échange commence par un envoi d'entête donnant des informations sur le document qui est envoyé (son type mime, sa langue, son jeu de caractères, etc). Ces entêtes ne doivent être envoyés qu'une seule fois par échange.

La fonction PHP session_start() envoie des entêtes au client, notamment pour indiquer au client de créer un cookie de session. Seulement, si avant cette fonction tu envoies d'autres données, le serveur va automatiquement envoyer des entêtes par défaut (car chaque échange doit débuter par des entêtes). Du coup, ton serveur envoie des entêtes, puis les quelques données qui se trouvent avant ta fonction session_start(), et quand il tombe sur session_start() il va vouloir envoyer à nouveau des entêtes. Et c'est là que tu te manges le poétique message d'erreur que tu donnes.

Ces données qui provoquent l'envoi des entêtes par défaut peuvent être de simples chaînes de caractères envoyées avec "print" ou "echo", ou par l'intermédiaire d'une fonction. Ca peut aussi être des espaces blancs, des tabulations ou des retours à la ligne qui sont présent dans le fichier PHP avant l'ouverture de la balise "<?php".

Voilà quelques exemples qui peuvent provoquer cette erreur.

D'abord le cas classique : une chaîne de caractère est envoyé au client, donc avec des entêtes, puis l'appel à session_start() provoque l'erreur car session_start() envoie à nouveau des entêtes.
Bloc de code:
<?php
echo "hello world";

session_start();
...
?>
Plus subtil : avant l'ouverture de la balise PHP, il y a un retour à la ligne. Ce caractère est envoyé au client, ce qui oblige le serveur à envoyer des entêtes. Puis, dans le script PHP, l'appel à session_start() envoie de nouveau des entêtes : erreur.
Bloc de code:
<?php
session_start();
...
?>
Enfin, autre cas : une fonction qui envoie des données au client est appelée avant session_start(), et on a donc à peu près le même cas de figure que dans le premier exemple.
Bloc de code:
<?php
function foo() {
   print "hello world";
}

foo();

session_start();
...
?>
Dans ton cas, tu as vraisemblement des données qui sont donc envoyées au client avant l'appel à session_start(). Vérifie bien tout le code que tu as avant ton session_start() (appels de fonctions, d'include, etc.).

Un retour à la ligne !!!! C'était ça !!!!! Merci beaucoup pour ce cours très clair.
Je débute sur "les sessions"

Cela dit, quel est ce fichier "php.ini" que je n'ai pas ?

Albert
 
Halbert a dit:
Je ne comprends pas, je n'ai pas de dossier "/etc" , j'ai fait une recherche avec spotlight sur "php.ini.default" : rien !

Albert

À partir du finder menu aller choisir "Aller au dossier" ou encore "shift+pomme+g" ensuite dans la fenêtre taper /etc/ enter Click! Boum! :D

P.S. J'opte tout de même pour que tu vérifie encore ton code la fonction header devrait toujours être en début et il ne doit pas y avoir d'espace dans ton code avant le session_start()....


Marc-André
 
Halbert a dit:
Un retour à la ligne !!!! C'était ça !!!!! Merci beaucoup pour ce cours très clair.
Je t'en prie :)

Halbert a dit:
Cela dit, quel est ce fichier "php.ini" que je n'ai pas ?
C'est le fichier de configuration utilisé par PHP pour activer/désactiver différentes options de fonctionnement. En général, c'est plutôt réservé à l'administrateur système, car c'est très technique.

De plus, d'après ton message d'erreur initial, tu es hébergé chez Free. Dans ce cas, tu n'auras pas accès à ce fichier de configuration, car Free ne te laisse pas modifier ce fichier pour des raisons de sécurité.

En fait, Marc-André te parlait du fichier php.ini qui se trouve sur ton mac, car Mac OS X est livré avec PHP. Il pensait certainement que tu faisais tourner ton site sur ton PHP en local, et c'est pour cela qu'il t'encourageait à modifier le php.ini. Pour l'instant, si tu continues de faire tourner ton site chez Free, ne te soucie pas de ce php.ini.
 
sylver a dit:
Je t'en prie :)


C'est le fichier de configuration utilisé par PHP pour activer/désactiver différentes options de fonctionnement. En général, c'est plutôt réservé à l'administrateur système, car c'est très technique.

De plus, d'après ton message d'erreur initial, tu es hébergé chez Free. Dans ce cas, tu n'auras pas accès à ce fichier de configuration, car Free ne te laisse pas modifier ce fichier pour des raisons de sécurité.

En fait, Marc-André te parlait du fichier php.ini qui se trouve sur ton mac, car Mac OS X est livré avec PHP. Il pensait certainement que tu faisais tourner ton site sur ton PHP en local, et c'est pour cela qu'il t'encourageait à modifier le php.ini. Pour l'instant, si tu continues de faire tourner ton site chez Free, ne te soucie pas de ce php.ini.

Ok merci beaucoup
 
Marc-André a dit:
À partir du finder menu aller choisir "Aller au dossier" ou encore "shift+pomme+g" ensuite dans la fenêtre taper /etc/ enter Click! Boum! :D

P.S. J'opte tout de même pour que tu vérifie encore ton code la fonction header devrait toujours être en début et il ne doit pas y avoir d'espace dans ton code avant le session_start()....


Marc-André

merci beaucoup.
 
sylver a dit:
Je t'en prie :)


C'est le fichier de configuration utilisé par PHP pour activer/désactiver différentes options de fonctionnement. En général, c'est plutôt réservé à l'administrateur système, car c'est très technique.

De plus, d'après ton message d'erreur initial, tu es hébergé chez Free. Dans ce cas, tu n'auras pas accès à ce fichier de configuration, car Free ne te laisse pas modifier ce fichier pour des raisons de sécurité.

En fait, Marc-André te parlait du fichier php.ini qui se trouve sur ton mac, car Mac OS X est livré avec PHP. Il pensait certainement que tu faisais tourner ton site sur ton PHP en local, et c'est pour cela qu'il t'encourageait à modifier le php.ini. Pour l'instant, si tu continues de faire tourner ton site chez Free, ne te soucie pas de ce php.ini.

J'abuse encore.. pour rappeller la session on tape juste
<?php session_start();
?>

J'ai un problème, les variables deviennent vides
Albert
 
Halbert a dit:
J'abuse encore.. pour rappeller la session on tape juste
<?php session_start();
?>

J'ai un problème, les variables deviennent vides
Albert

Tu peux aller voir ce petit aide mémoire sur les session

juste ici


Marc-André
 
Halbert a dit:
merci, j'avais vu cette page. Je dois récupérer une valeur de variable d'un formaulaire, je dois faire une faute quelquepart
Albert

Haaa les fautes ;)


Tu peux toujours nous montrer ton code.

Le mieux pour voir si les variables sont là et que c'est la bonne information c'est de les afficher une fois débugger tu enlève l'affichage.
du genre:
<?=$Ta_Variable ?>


Marc-André
 
Marc-André a dit:
Haaa les fautes ;)


Tu peux toujours nous montrer ton code.

Le mieux pour voir si les variables sont là et que c'est la bonne information c'est de les afficher une fois débugger tu enlève l'affichage.
du genre:
<?=$Ta_Variable ?>


Marc-André
Alors voilà, mais je ne suis sûr de rien :

<?php session_start();

connexion à ma base de données puis :


$sql = "SELECT * FROM "matable" WHERE Nom LIKE '$nom'";

$req = mysql_query($sql) or die('Erreur SQL : <br />'.$sql);


$_SESSION['nom'] = $data['nom'];
$_SESSION['prenom'] = $data['prenom'];
etc....

?>

La variable nom étant récupérée dans un formulaire.

J'ai bon ?

Albert
 
Pour récupérer ta valeur tu fais un GET ou un POST?

$nom=$_POST['nom'];

SELECT * FROM matable WHERE matable.nom="$nom"

Avant de faire un select je te conseil de faire afficher la variable $nom dans ta page voir si ca vient du formulaire avant ou si c'est ta requête qui ne fonctionne pas de cette manière tu élimine des possiblilité.

Et je te conseil grandement de faire un fichier include pour la connexion à ta base de données au lieu de toujours te connecter dessus

tu sauve un fichier que tu appel à chaque page.

<?php
$username="username";
$password="password";
$database="tabd";
mysql_connect(localhost,$username,$password);
mysql_select_db($database) or die( "Connexion impossible sur la base de donnees");
?>

et dans chaque page à la première ligne tu insère un truc du genre:
<?
include '../include/include.php';
?>

Marc-André
 
Marc-André a dit:
Pour récupérer ta valeur tu fais un GET ou un POST?

$nom=$_POST['nom'];

SELECT * FROM matable WHERE matable.nom="$nom"

Avant de faire un select je te conseil de faire afficher la variable $nom dans ta page voir si ca vient du formulaire avant ou si c'est ta requête qui ne fonctionne pas de cette manière tu élimine des possiblilité.

Et je te conseil grandement de faire un fichier include pour la connexion à ta base de données au lieu de toujours te connecter dessus

tu sauve un fichier que tu appel à chaque page.

<?php
$username="username";
$password="password";
$database="tabd";
mysql_connect(localhost,$username,$password);
mysql_select_db($database) or die( "Connexion impossible sur la base de donnees");
?>

et dans chaque page à la première ligne tu insère un truc du genre:
<?
include '../include/include.php';
?>

Marc-André

get, pourquoi ?
 
Marc-André a dit:
Pour récupérer ta valeur tu fais un GET ou un POST?

$nom=$_POST['nom'];

SELECT * FROM matable WHERE matable.nom="$nom"

Avant de faire un select je te conseil de faire afficher la variable $nom dans ta page voir si ca vient du formulaire avant ou si c'est ta requête qui ne fonctionne pas de cette manière tu élimine des possiblilité.

Et je te conseil grandement de faire un fichier include pour la connexion à ta base de données au lieu de toujours te connecter dessus

tu sauve un fichier que tu appel à chaque page.

<?php
$username="username";
$password="password";
$database="tabd";
mysql_connect(localhost,$username,$password);
mysql_select_db($database) or die( "Connexion impossible sur la base de donnees");
?>

et dans chaque page à la première ligne tu insère un truc du genre:
<?
include '../include/include.php';
?>

Marc-André

Je me permets de reposer la question : pour rappeller la session on tape juste
<?php session_start();
?>

Albert