Problèmes headers() une fois en ligne

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problèmes headers() une fois en ligne

par minik » 17 déc. 2008, 17:06

Apparemment le problème est résolu, les espaces en début de code étaient du à des espaces que j'avais mit après ma balise de fermeture php dans mon fichier de config...

Je vais tester si toute ma partie admin fonctionne puis je ferai mon identification!

En tout cas merci pour cette aide, ça ma bien fait avancé puis j'aurai bien appris ! :D

par sadeq » 17 déc. 2008, 17:01

Tu peux enlever les ./ car c'est facultatif si les fichiers que tu inclues sont dans le même dossier. Par contre, cela est déroutant pour PHP quand il s'agit d'un script inclus qui lui même fait des include() ou require() d'autres scripts.
C'est un peu tordu, car l'inclusion fait hériter le chemin de base du script qui a commencé l'inclusion. surtout, si toutes les inclusions font référence à des chemin relatifs :boire4:

Pour info, include() fait la même chose que require() ou require_once().

Revenons à notre problème.

Enlève tous les echos que tu as ajouté pour ne pas fausser le test et concentre toi maintenant sur le script en question. Voici le script que tu dois tester:
<?php
require("../data.php");
//session_start();
   
   if(isset($_POST["titre"])){
      if(!empty($_POST["titre"]))
         $titre = $_POST["titre"];/* récupere les valeur ds le formulaire*/
      else
      $titre = "";
   }
   if(isset($_POST["texte"])){
      if(!empty($_POST["texte"]))
         $texte = $_POST["texte"];
      else
      $texte = "";
   }
   
   $datemaj = strftime("%Y-%m-%d");
   
   $reqinsert = 'INSERT INTO news (news_id, titre, texte, dateP) VALUE (\'\',\''.$titre.'\',\''.$texte.'\',\''.$datemaj.'\')';
   
   //echo $reqinsert;
   
   if(!empty($_POST["titre"]) AND !empty($_POST["texte"])){
      mysql_query($reqinsert)or die(mysql_error());

      include("news.php"); // <-- objet du test

      exit();
   }
   
?> 
Que vois-tu après exécution?

par minik » 17 déc. 2008, 16:50

Je suis sur et certain que la page est dans le même dossier et quel affiche bien quelque chose.
J'ai aussi essayer de mettre l'url entière.

Je viens d remarquer que les espaces était du à mon fichier config ou à son require().

Par contre chose que je ne comprends pas, dans mon data(endroit ou j'ai ma connexion à la db et ou j'ai mes fonctions), j'appelle mon fichier config php par require("config.php"); et cela fonctionne.

J'ai essayé de mettre require("./config.php"); pour corriger l'url relative et je tombe sur une page blanche avec mon echo que j'ai placé juste avant ce require()

par sadeq » 17 déc. 2008, 16:38

Le include() qu'on a ajouté doit t'afficher la page "news.php". Si c'est pas le cas alors il y a deux cas :
  • 1. soit cette page "news.php" n'affiche rien
    2. soit cette page "news.php" n'est pas située dans le bon chemin relatif que tu indique par ça "./" c'est à dire le dossier en cours
Es-tu sûr que cette page "news.php" existe bien dans le même dossier que le script en question et qu'elle affiche quelque chose?

As-tu testé en accédant directement à cette page par son url http sur ton navigateur?

par minik » 17 déc. 2008, 16:21

Voila ce que j'ai dans le code source :

Code : Tout sélectionner

avant les sauts de ligne coucou, je suis avant include :-)
J'ai mit un echo() avant mon require("../data.php"); et j'ai une ligne avant les espace.
Mais je n'arrive pas à trouvé ou est le problème!

Sinon je ne vois pas se que le include à changé...

par sadeq » 17 déc. 2008, 16:13

Trés bien, on sait formellement que l'exécution arrive jusqu'à header() et Apparemment, les erreurs n'ont pas été activées. Sinon on aurait eu un message d'erreur sur header() car un echo est fait juste avant. :?
Mais, continuons pour vérifier le chemin d'accès à la page "news.php" modifie ton script en mettant un include() au lieu d'un header(). Comme ça:
if(!empty($_POST["titre"]) AND !empty($_POST["texte"])){
      mysql_query($reqinsert)or die(mysql_error());

      echo "coucou, je suis avant include :-)"; // pour le débug      

      include('./news.php');
      exit();
   }

par minik » 17 déc. 2008, 16:04

Voilà j'ai ajouter le echo et j'en ai mit un apres aussi.

Je tombe toujours sur ma page blanche mais cette fois avec le texte ecrit.

Voici ce que j'ai en code source :

Code : Tout sélectionner

coucou, je suis avant header :-)Apres le headers

par sadeq » 17 déc. 2008, 15:58

ok, maintenant, tu ajoutes l'echo suivant dans le if et avant le header() de notre fameux script:
   if(!empty($_POST["titre"]) AND !empty($_POST["texte"])){
      mysql_query($reqinsert)or die(mysql_error());

      echo "coucou, je suis avant header :-)"; // pour le débug      

      header('Location: ./news.php');
      exit();
   } 

par minik » 17 déc. 2008, 15:49

J'ai ajouté l'instruction en début de script et cela ne me pointe aucune erreurs.
Apparemment, il y aurai des espaces mais je ne sais pas d'où il viennent !

J'ai ajouté ça en début de fichier juste avant le require().

par sadeq » 17 déc. 2008, 15:21

Tu peux enlever ton lien.

D'après phpinfo(), le paramétrage de php indique que les erreurs sont désactivées:
display_errors Off Off

Donc, une fois en ligne, si ton script commet des erreurs le serveur ne t'envoie pas de messages d'erreurs.

Pour forcer les serveur à t'envoyer les erreurs, tu dois donc ajouter l'instruction suivante au début du script :
ini_set ("error_reporting", E_ALL);
Cette directive ini_set() activera les erreurs pour le temps d'exécution de ton script seulement et n'agira pas sur la configuration du serveur.

C'est comme ça qu'on fait pour déboguer un programme en ligne. Car les serveurs en ligne évitent d'activer les erreurs en mode production pour ne pas gêner les utilisateurs.

Donc, fais ça et ré-exécute ton script pour voir l'erreur.

par minik » 17 déc. 2008, 14:46

Voici ma page pour tester ma partie admin.

Je ne sais pas si je peux mais ça ne devrais pas posé de problème vu que c'est encore en développement et que je n'ai pas encore mit la page de login...

Lien

Attention, j'ai mit un phpinfo() au début de cette page pour voir les détails du serveur (même si je pige rien).
Si vous voulez que je l'enlève, dites-le.

par sadeq » 17 déc. 2008, 14:36

OUi, tous ce qui peut afficher quelque chose, même un espace ou du code html. Mais généralement quand on commet ce genre d'erreur (afficher quelque chose avant header()) un message d'avertissement s'affiche en disant que le "Header is already sent" ce qui n'est pas le cas pour toi à moins que les erreurs soient désactivées sur le serveur de ton hébergeur.

par minik » 17 déc. 2008, 14:04

Je ne savais pas pour les include() et require() mais qu'est ce que je dois vérifier dedans?

Si il y a des echo() ou uprint()? Ou autre chose?

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par sadeq » 17 déc. 2008, 11:56

Bonjour,

Pour la question des espaces et affichages avant header(), il faut vérifier pour ça aussi tous les fichiers qui sont inclus par un include() ou require(). Et c'est vrai dans ton cas, puisque ton script commence par un require(), tu dois vérifier le fichier inclus:

Rappel de ton script :
<?php
require("../data.php");
//session_start();
?>
<?php
   
   if(isset($_POST["titre"])){
      if(!empty($_POST["titre"]))
         $titre = $_POST["titre"];/* récupere les valeur ds le formulaire*/
      else 
....
Autre remarque: Evite de couper les blocs de PHP en plusieurs morceaux si ce n'est pas nécessaire d'insérer du code HTML entre ces blocs.

Cette remarque est vrai pour le script ci-dessus. Il faut alors fusionner les 2 blocs php comme ça:
<?php
require("../data.php");
//session_start();
   
   if(isset($_POST["titre"])){
      if(!empty($_POST["titre"]))
         $titre = $_POST["titre"];/* récupere les valeur ds le formulaire*/
      else 
....

par minik » 17 déc. 2008, 10:15

Bonjour,

De retour au travail avec ce maudit problème...
Je n'ai pas de ligne blanche ni de ligne qui se crée une fois la page chargée.

Edit : Je vient de remarqué en regardant mon code source de ma page que j'ai quelques espaces qui se créent dans les pages où j'ai du php.
Même dans celle ou il n'y a pas de headers().

Et je ne comprends pas pourquoi j'ai ces espaces...

Édit 2 : je dois devenir fou parce que je n'avais pas remarqué l'option dans le web developper "code source généré", j'avais afficher le code source seul...
Avec le code source généré, je n'ai plus d'espace avant ma balise html.