Parse error: syntax error, unexpected ''

Résolu
Bonjour,

J'ai cette erreur : Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\wamp\www\rs\pages\profile.php on line 23

Voici mon profile.php :
<?php
//-----------------------------
 //Profile.php 
//-----------------------------

include_once('body/header.php');
include_once('body/menu.php');
?>
<div class='info'>
<?php
if(!function_exists('recuperer_info_membre_choisi')){
 echo "ERREUR : La fonction recuperer_info_membre_choisi n'existe pas ! ";
}
$pseudo = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
$arr_infos = recuperer_info_membre_choisi($pseudo);

if(count($arr_infos)>0 && $pseudo != $_SESSION['pseudo']){

 foreach($arr_infos as $R) {
	if(demande_existe() == 0){
     echo "<div class='error'>
	          Vous n'êtes pas ami(e) avec ".$R['pseudo']."<br />
	         <a href='index.php?page=envoi&pseudo=<?php echo $info_membre_choisi['pseudo']; ?>'>Envoyer une invitation</a>
			</div>";		
	}
     echo"<img src='avatar/". $R['avatar']."' height='200' width='200' alt='avatar'>";
     echo "<p><strong>Email : </strong><em>".$R['email']."</em></p>";
     echo "<p><strong>Sexe : </strong><em>".$R['sexe']."</em></p>";
     echo "<p><strong>A propos de vous : </strong><em>".$R['apropos']."</em></p>";
 }
}else{
	header("Location:index.php?page=membre");	
}
?>
</div>


Que faire ? Merci d'avance :)

19 réponses

Résumé de la discussion

Une erreur de type parse error survient dans profile.php lorsque le code tente d'insérer du PHP dans une chaîne HTML, produisant une syntaxe inattendue et une référence à T_ENCAPSED_AND_WHITESPACE. Pour corriger, il faut sortir les appels PHP des chaînes HTML et utiliser des concaténations ou des variables claires, tout en sécurisant GET/POST avec isset et validation. D'autres réponses soulignent l'importance de récupérer le résultat avec fetch/fetchAll et d'ajouter un return dans la fonction qui vérifie l'existence des demandes d'ami, pour éviter les valeurs nulles. En cas de test, il est recommandé de commenter temporairement la redirection et d'observer le flux avec des échos afin de vérifier les paramètres PASSÉS.

Bobot (l’IA à votre service)
  1. Ah je pense que vous avez raison ! je vais effacer les demandes sur ma bdd et reessayer
    1. Modérateur

      Le bouton "Envoyer une invitation" a disparu avec votre code ! or quand je remets l'ancien, il reapparait :(


      1 - L'ancien code était COMPLETEMENT FAUX !

      2 - ... Est-ce que pour le pseudo pour lequel tu regardes... une invitation a été envoyée ??
      1. Le bouton "Envoyer une invitation" a disparu avec votre code ! or quand je remets l'ancien, il reapparait :(
        1. Modérateur
          Bon.... je n'ai pas le temps d'attendre tes réponses pour ce soir ...
          donc voici le code final à obtenir :
          function demande_existe() {
           global $bdd; // déclaration globale de BDD
          
            //récupération des variables PROPREMENT !
            $pseudoSession = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
            $pseudoGet = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
          
            // je mets la requête dans une variable AVANT de l'utiliser
            // PS :  j'ai ajouté un ALIAS  (COUNT(id_invitation) as NB) afin de pouvoir plus facilement
            // utiliser le résultat de la requête...
            $sql = "SELECT COUNT(id_invitation) as NB
          	        FROM amis
                    WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                      OR  (pseudo_exp = :get_pseudo AND pseudo_dest = :session_pseudo)";
          
            // je place les  params dans une variable avant de l'utiliser :
            $params = array('get_pseudo' => $pseudoGet, 'session_pseudo' => $pseudoSession) ;
            
            $query = $bdd->prepare($sql);
            $query ->execute($params);  
            $result = $query->fetchall();
          	
            //on récupère le NB de ta requête...
             $nb = $result[0]['NB'];
            //On fait un RETURN pour envoyer le résultat vers ton code...
            return $nb;
          }
          

          Essaye de le comprendre... histoire d'être capable de t'en inspirer pour tes prochains codes !

          1. Modérateur
            Tu suis bien un tutoriel ... pour apprendre ... non ?
            On a déjà échangé pas loin de 200 messages (si ce n'est plus) pour te corriger tes autres fonctions..... tu devrais être en mesure de t'inspirer de tes codes précédents pour corriger celle là !

            On va changer un peu de méthode ... au lieu de te donner le code tout fait .... (ce qui n'a aucun intéret pour toi si tu souhaites apprendre....) je vais t'aider à corriger ton code.

            On va y aller par étape.

            Premièrement .. dans le code suivant :
            function demande_existe() {
            global $bdd; // déclaration globale de BDD
            
                $query = $bdd->prepare("SELECT COUNT(id_invitation) FROM amis
                WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                OR
                (pseudo_exp = :get_pseudo AND pseudo_dest = :session_pseudo)
                ");
            
                $query ->execute(array('get_pseudo' => $_GET['pseudo'], 'session_pseudo' => $_SESSION['pseudo']));  
            
            }
            


            tu sépares la requête et l'array de params de leur utilisation.
            => Tu n'as qu'à faire la même chose que dans le code que tu nous as posté ici : https://forums.commentcamarche.net/forum/affich-32103280-parse-error-syntax-error-unexpected#30
            1. ça me semble abstrait :(
            2. Modérateur
              @Zakarya93Bon ok... cette étape là .. je te la fait ...
              regarde bien .. pour être capable de le refaire par toi même :

              function demande_existe() {
              global $bdd; // déclaration globale de BDD
              
              // je mets la requête dans une variable AVANT de l'utiliser
              $sql = "SELECT COUNT(id_invitation) FROM amis
                  WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                  OR  (pseudo_exp = :get_pseudo AND pseudo_dest = :session_pseudo)";
              
              // je place les  params dans une variable avant de l'utiliser :
              $params = array('get_pseudo' => $_GET['pseudo'], 'session_pseudo' => $_SESSION['pseudo']) ;
                  $query = $bdd->prepare($sql);
              
                  $query ->execute($params);  
              
              }
              


              Etape 2 : Récupérer les variable proprement... via des ISSET ....; AVANT de les utiliser !
              Je te laisse essayer .... et là .. pour le coup .. ce n'est pas abstrait ... tu n'as qu'à regarder le code suivant pour t'en inspirer :https://forums.commentcamarche.net/forum/affich-32103280-parse-error-syntax-error-unexpected#30

              .
            3. $pseudo_exp = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
               $pseudo_exp = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;


              ?
            4. Modérateur
              @Zakarya93oui ... mais maintenant il faut les mettre dans ton code .... et donc .. remplacer les variables qui sont dans $params
            5. Modérateur
              par contre ... attention... tu as utilisé deux fois le meme nom de variable ...
          2. Modérateur
            1 - Tu ne suis aucun de mes conseils visiblement !
            • La requête et les params ne sont pas séparés de leur utilisation !
            • Tu utilises une variable GET et une variable SESSION ... SANS les avoir traité avant avec ISSET ...


            2 - ... il te manque un FETCH .. pour voir récupérer le contenu de ta requête

            3 - Il te manque un RETURN à la fin de ta fonction ... sinon.. ben... elle ne RETOURNE RIEN !

            Je te laisse déjà faire ces corrections là .
            Une fois qu'elles seront faites... reposte ton code modifié ....qu'on poursuive si ça ne fonctionne toujours pas !
            1. //la fonction qui va enregistrer l'invitation dans la bdd
              function enreg_invitation() {
               global $bdd;
               $pseudoSession = isset($_SESSION['pseudo'])?$_SESSION['pseudo']:NULL;
               $pseudoGet = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
              
               if($pseudoSession  && $pseudoGet ){
                  $sql = "INSERT INTO amis
                           (pseudo_exp,pseudo_dest,date_invitation,date_confirmation,active)
                    VALUES (:sessPseudo,:getPseudo,NOW(),'',0)";
              
              
                 $params = array(
                   ":sessPseudo" => $pseudoSession,
                   ":getPseudo" => $pseudoGet
                  );
                 $query = $bdd->prepare($sql);
                 $req = $query->execute($params);
               }else{
                echo " Erreur : Une des variables n'existe pas...";
               }
              }
            2. Modérateur
              C'est cette fonction là qui ne marche pas : function demande_existe() {
            3. Vous pouvez me donner le code svp je sais vraiment pas comment m'y prendre
          3. <?php
            //-----------------------------
            //Profile.func.php 
            //-----------------------------
            // la fonction qui va recuperer les informations de la personne choisie par l'utilisateur
            function recuperer_info_membre_choisi($pseudo = NULL) {
            global $bdd; // déclaration globale de BDD
            
            $result = array();
            
            $sql = "SELECT * FROM utilisateurs WHERE pseudo=:pseudo" ;
            $query = $bdd->prepare($sql);
            $query->execute(array(':pseudo' =>$pseudo));
            $result=$query->fetchall();
            
            return $result;
            }
            
            //la function qui va vérifier si une demande existe entre les deux membres
            function demande_existe() {
            global $bdd; // déclaration globale de BDD
            
                $query = $bdd->prepare("SELECT COUNT(id_invitation) FROM amis
                WHERE (pseudo_exp = :session_pseudo AND pseudo_dest = :get_pseudo)
                OR
                (pseudo_exp = :get_pseudo AND pseudo_dest = :session_pseudo)
                ");
            
                $query ->execute(array('get_pseudo' => $_GET['pseudo'], 'session_pseudo' => $_SESSION['pseudo']));  
            
            }
            1. Quand je vais dans ma bdd je vois bien que la demande en ami est prise en compte, mais normalement je devrais juste avoir la page du profil apres le clic non ?
              1. Modérateur
                Dans ce cas.. le souci est sur ta page profil....
              2. Modérateur
                Sûrement ta fonction demande_existe()

                Quel est son code ?
            2. Je parle de quand je clique sur "Envoyer l'invitation", rien ne se passe
              1. Modérateur
                Quand tu cliques sur "Envoyer l'invitation" .... rien ne se passe ??
                Pourtant ... tu arrives bien sur la page "envoie" ... (c'est ce qu'on a vérifié en y désactivant la redirection...)
                Donc il se passe bien quelque chose !
                Ensuite.. dans le code de ta page envoie... tu rediriges vers la page profil ... tu as peut être l'impression que rien ne se passe ... mais à mon avis c'est juste que ça va trop vite pour tu ne le vois !....
              2. Modérateur
                Oui et bien quoi ??
                Il se passe bien ce que je dis ......

                Donc.. c'est pas que ta redirection ne marche pas.... c'est autre chose...
                sûrement ta fonction enreg_invitation(); qui ne marche pas correctement !

                Au passage ... je trouve que les tutos que tu suis... ne sont pas terribles du tout...
                - Utilisation des variables POST /GET / SESSION sans ISSET ...
                - Des appels à des fonctions sans paramètres ....
                - Le fait qu'il soit en mysql et non en mysqli ou PDO ....

                Je pense sérieusement que ce n'est pas comme ça que tu vas correctement apprendre à coder !
                Il te manque les BASES du langage PHP .....
                La meilleur preuve .. tu n'es pas capable par toi même, de résoudre le moindre souci ( message d'erreur.....)
                Tu devrais vraiment suivre des tutos plus récents et mieux faits ... comme ceux du site openclassroom.

                Quoi qu'il en soit .. revenons à ton problème actuel :
                Quand tu cliques sur Envoyer une invitation ... est-ce que ça change quelque chose dans ta BDD ?
              3. @jordane45quand je vais dans ma bdd je vois bien que la demande en ami est prise en compte, mais normalement je devrais juste avoir la page du profil apres le clic non ?
            3. Oui c bien ce pseudo ! mais du coup j'ai décommenter les echo, j'ai mis ceci :

              <?php 
              enreg_invitation();
              $pseudo = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
              if($pseudo){
                header("Location:index.php?page=profile&pseudo=".$pseudo);
                exit();
              }else{
                echo "<br> ERREUR ! Aucun Pseudo passé en paramètre!! ";
              }
              ?>


              mais je ne suis pas redirigé, meme problème :(
              1. Modérateur
                Pourtout... dans ta barre d'adresse ... tu as bien :
                http://localhost/rs/index.php?page=profile&pseudo=xzak47

                ... c'est donc que la redirection a fonctionné.....

                En quoi ... selon toi... la redirection n'a pas marché ?
                A quoi le vois tu ?
                N'est tu pas sur la page profil ?
                N'est-ce pas le profil de xzak47 qui apparait ??

                ....
            4. c'est affiché : page ENVOI : OK !
              Pseudo = xzak47
              1. Modérateur
                ok donc ça fonctionne visiblement...

                Le pseudo qui s'affiche .. c'est bien celui sur lequel tu veux être redirigé dans ta page profil ?

                Si oui... tu peux remettre la redirection...
                Sinon.. c'est que tu n'utilises pas la bonne variable dans ton invitation !
            5. Modérateur
              Que t'ai-je dis par rapport à l'utilisation des variables GET / POST / SESSION ... ????

              TOUJOURS .. les traiter avec ISSET ... AVANT de les utiliser !

              
              <?php 
              enreg_invitation();
              $pseudo = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
              if($pseudo){
                header("Location:index.php?page=profile&pseudo=".$pseudo);
                exit();
              }else{
                echo "<br> ERREUR ! Aucun Pseudo passé en paramètre!! ";
              }
              ?>
              
              


              Eventuellement... le temps des tests .. tu peux commenter la redirection et voir si tu arrives bien sur la page... en ajoutant un echo par exemple..

              <?php 
              $pseudo = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
              //---------------------------------------------------------//
              //le temps des tests :
              //---------------------------------------------------------//
              echo "<br> page ENVOI : OK ! ";
              echo "<br> Pseudo = "$pseudo;
              //---------------------------------------------------------//
              enreg_invitation();
              
              if($pseudo){
               // header("Location:index.php?page=profile&pseudo=".$pseudo);
                exit();
              }else{
                echo "<br> ERREUR ! Aucun Pseudo passé en paramètre!! ";
              }
              ?>
              
              


              Cordialement,
              Jordane
              1. Merci pour ces explications détaillés.
                J'obtiens alors : Parse error: syntax error, unexpected '$pseudo' (T_VARIABLE), expecting ',' or ';' in C:\wamp\www\rs\pages\envoi.php on line 7
              2. Modérateur
                désolé ...Un point manquant à la ligne
                echo "<br> Pseudo = ".$pseudo;
                
            6. Oui ! envoi.php :
              <?php 
              enreg_invitation();
              header("Location:index.php?page=profile&pseudo=".$_GET['pseudo']);
              ?>
              1. Modérateur
                On est bien d'accord que ton souci .. c'est le lien
                 <a href='index.php?page=envoi&pseudo=xzak47'>Envoyer une invitation</a>


                Tu as quoi dans ta page ENVOI ?
                Je pense que le souci vient de là ....

                1. <!DOCTYPE html>
                  <html>
                      <head>
                        <link rel='stylesheet' href='css/style.css'>
                      </head>
                      <meta charset="UTF-8" >
                      <body>
                            <div id='content'>
                            ??<div class='header'>
                  Bienvenue jean<p><a href="index.php?page=logout">Se déconnecter</a></p>
                  </div>?<div class='menu'>
                         <ul>
                              <li><a href="index.php?page=membre">Accueil</a></li>
                        <li><a href="index.php?page=update">Changer vos informations</a></li>
                        <li><a href="index.php?page=liste_membre">les membres</a></li>
                        <li><a href="">Vos amis</a></li>
                        <li><a href="">Invitations</a></li>
                        <li><a href="">Messages</a></li>
                        <li class="nbr">2 membres</li>
                         </ul>
                  </div><div class='info'>
                  <div class='error'>
                             Vous n'êtes pas ami(e) avec xzak47<br />
                            <a href='index.php?page=envoi&pseudo=xzak47'>Envoyer une invitation</a>
                     </div><img src='avatar/CR7.jpg' height='200' width='200' alt='avatar'><p><strong>Email : </strong><em>   xxxxx@gmail.com</em></p><p><strong>Sexe : </strong><em>Homme</em></p><p><strong>A propos de vous : </strong><em>En cours de développement</em></p></div>    </div>
                      </body>


                  (Adresse mail supprimée par la modération)
                  1. Rien ne change, j'ai un petit chargement puis rien. J'ai : http://localhost/rs/index.php?page=profile&pseudo=xzak47
                    1. Modérateur
                      Tu peux nous donner le code source de la page générée ? ( clic droit dans ton navigateur... afficher le code source...)
                  2. Salut !

                    Tu fais un echo d'echo, pourquoi ??? Tout simplement :

                    <?php
                    //-----------------------------
                     //Profile.php 
                    //-----------------------------
                    
                    include_once('body/header.php');
                    include_once('body/menu.php');
                    ?>
                    <div class='info'>
                    <?php
                    if(!function_exists('recuperer_info_membre_choisi')){
                     echo "ERREUR : La fonction recuperer_info_membre_choisi n'existe pas ! ";
                    }
                    $pseudo = isset($_GET['pseudo'])?$_GET['pseudo']:NULL;
                    $arr_infos = recuperer_info_membre_choisi($pseudo);
                    
                    if(count($arr_infos)>0 && $pseudo != $_SESSION['pseudo']){
                    
                     foreach($arr_infos as $R) {
                    	if(demande_existe() == 0){
                         echo "<div class='error'>
                    	          Vous n'êtes pas ami(e) avec ".$R['pseudo']."<br />
                    	         <a href='index.php?page=envoi&pseudo=".$info_membre_choisi['pseudo']."Envoyer une invitation</a>
                    			</div>";		
                    	}
                         echo"<img src='avatar/". $R['avatar']."' height='200' width='200' alt='avatar'>";
                         echo "<p><strong>Email : </strong><em>".$R['email']."</em></p>";
                         echo "<p><strong>Sexe : </strong><em>".$R['sexe']."</em></p>";
                         echo "<p><strong>A propos de vous : </strong><em>".$R['apropos']."</em></p>";
                     }
                    }else{
                    	header("Location:index.php?page=membre");	
                    }
                    ?>
                    </div>
                    1. Modérateur
                      Le nom de la variable non plus n'est pas bon :-)
                    2. Ah oui en effet :)
                  3. Modérateur
                    Tu fais à chaque fois la même erreur .....

                    Tu es DEJA dans un ECHO ... et toi tu REMETS un echo...
                         echo "<div class='error'>
                    	          Vous n'êtes pas ami(e) avec ".$R['pseudo']."<br />
                    	         <a href='index.php?page=envoi&pseudo=<?php echo $info_membre_choisi['pseudo']; ?>'>Envoyer une invitation</a>
                    			</div>";	
                    

                    Forcément ..ça ne marche pas !

                    Ensuite.... d'où sors tu la variable $info_membre_choisi ??? si tu regardes bien le code ... c'est $R qu'il faut utiliser ...!

                    bref...Corrige ainsi :
                         echo "<div class='error'>
                    	          Vous n'êtes pas ami(e) avec ".$R['pseudo']."<br />
                    	         <a href='index.php?page=envoi&pseudo=".$R['pseudo']."'>Envoyer une invitation</a>
                    			</div>";	
                    

                    1. Je vois mes erreurs oui...
                      plus de messages d'erreur mais quand je clique sur "envoyer une invitation", je suis pas redirigé sur le profil du membre
                    2. Modérateur
                      @Zakarya93Tu es redirigé sur la page envoi .... après... je ne sais pas ce que contient cette page .....

                      Quand tu cliques sur le lien... tu as quoi dans la barre d'adresse de ton navigateur qui apparait ?