Problème php "Erreur de syntaxe"

Résolu/Fermé
mikmuk Messages postés 156 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 17 janvier 2013 - Modifié par mikmuk le 1/06/2012 à 22:29
mikmuk Messages postés 156 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 17 janvier 2013 - 4 juin 2012 à 19:42
Bonjour,

d'après netbeans voici mon problème :

Syntax error: unexpected: End of File 
expected: exit, if, identifier, variable, echo, do, while, endwhile, for, endfor, foreach, endforeach, declare, enddeclare, switch, endswitch, case, default, break, continue, function, return, try, throw, use, global, unset, isset, empty, class, interface, array, {, }, include, include_once, eval, require, require_once, print, ';', +, -, !, ~, ++, --, @, new, endif, elseif, else, static, abstract, final, (, $


voici mon code php

<div id="contenu"> 
    <h1>Inscription validée !</h1> 
    <p>Nous vous remercions de vous être inscrit sur notre site, votre inscription a été validée !<br/> 
        Vous pouvez vous connecter avec vos identifiants <a href="connexion.php">ici</a><p> 
        <?php echo $sent; ?> 
    <div id="map"> 
        <a href="../index.php">Accueil</a> => <a href="inscription.php">Inscription 1/2</a> 
    </div> 

    <?php 
    if ($_SESSION['erreurs'] > 0) { 
        ?> 
        <div class="border-red"> 
            <h1>Note :</h1> 
            <p> 
                Lors de votre dernière tentative d'inscription, des erreurs sont survenues, en voici la liste :<br/> 
                <?php 
                echo $_SESSION['nb_erreurs']; 
                echo $_SESSION['pseudo_info']; 
                echo $_SESSION['mdp_info']; 
                echo $_SESSION['mdp_verif_info']; 
                echo $_SESSION['mail_info']; 
                echo $_SESSION['mail_verif_info']; 
                echo $_SESSION['date_naissance_info']; 
                echo $_SESSION['qcm_info']; 
                echo $_SESSION['captcha_info']; 
                ?> 
                Nous vous avons pré-rempli les champs qui étaient corrects.<br/> 
                Note : la partie QCM et image est entièrement à refaire, que vous vous soyez trompé ou non. 
            </p> 
        </div> 
        <?php 
    } 
    ?> 

    <h1>Formulaire d'inscription</h1> 
    <p>Bienvenue sur la page d'inscription de mon site !<br/> 
        Merci de remplir ces champs pour continuer.</p> 
    <form action="trait-inscription.php" method="post" name="Inscription"> 
        <fieldset><legend>Identifiants</legend> 
            <label for="pseudo" class="float">Pseudo :</label> <input type="text" name="pseudo" id="pseudo" size="30" value="<?php if ($_SESSION['pseudo_info'] == '') echo htmlspecialchars($_SESSION['form_pseudo'], ENT_QUOTES); ?>" /> <em>(compris entre 3 et 32 caractères)</em><br /> 
            <label for="mdp" class="float">Mot de passe :</label> <input type="password" name="mdp" id="mdp" size="30" value="<?php if ($_SESSION['mdp_info'] == '') echo htmlspecialchars($_SESSION['form_mdp'], ENT_QUOTES); ?>" /> <em>(compris entre 4 et 50 caractères)</em><br /> 
            <label for="mdp_verif" class="float">Mot de passe (vérification) :</label> <input type="password" name="mdp_verif" id="mdp_verif" size="30" value="<?php if ($_SESSION['mdp_verif_info'] == '') echo htmlspecialchars($_SESSION['form_mdp_verif'], ENT_QUOTES); ?>" /><br /> 
            <label for="mail" class="float">Mail :</label> <input type="text" name="mail" id="mail" size="30" value="<?php if ($_SESSION['mail_info'] == '') echo htmlspecialchars($_SESSION['form_mail'], ENT_QUOTES); ?>" /> <br /> 
            <label for="mail_verif" class="float">Mail (vérification) :</label> <input type="text" name="mail_verif" id="mail_verif" size="30" value="<?php if ($_SESSION['mail_verif_info'] == '') echo htmlspecialchars($_SESSION['form_mail_verif'], ENT_QUOTES); ?>" /><br /> 
            <label for="date_naissance" class="float">Date de naissance :</label> <input type="text" name="date_naissance" id="date_naissance" size="30" value="<?php if ($_SESSION['date_naissance_info'] == '') echo htmlspecialchars($_SESSION['form_date_naissance'], ENT_QUOTES); ?>" /> <em>(format JJ/MM/AAAA)</em><br/> 
        </fieldset> 
        <fieldset><legend>Charte du site et protection anti-robot</legend> 
            <?php 
            include('../includes/charte.php'); 
            ?> 

            <h1>Système anti robots :</h1> 

            <p>Qu'est-ce que c'est ?<br/> 
                Pour lutter contre l'inscription non désirée de robots qui publient du contenu non désiré sur les sites web, 
                nous avons décidé de mettre en place un systèle de sécurité.<br/> 
                Aucun de ces systèmes n'est parfait, mais nous espérons que celui-ci, sans vous être inaccessible sera suffisant 
                pour lutter contre ces robots.<br/> 
                Il est possible que certaine fois, l'image soit trop dure à lire, le cas échéant, actualisez la page jusqu'à avoir une image lisible.<br/> 
                Si vous êtes dans l'incapacité de lire plusieurs images d'affilée, <a href="../contact.php">contactez-nous</a>, nous nous occuperons de votre inscription.</p> 
            <label for="captcha" class="float">Entrez les 8 caractères (majuscules ou chiffres) contenus dans l'image :</label> <input type="text" name="captcha" id="captcha"><br/> 
            <img src="captcha.php" /> 
        </fieldset> 
        <div class="center"><input type="submit" value="Inscription" /></div> 
    </form> 
    <?php 
    if (mysql_query($insertion)) { 
        if (inscription_mail($mail, $pseudo, $mdp)) 
            $sent = 'Un mail de confirmation vous a été envoyé.'; 
        else 
            $sent = 'Un mail de confirmation devait être envoyé, mais son envoi a échoué, vous êtes cependant bien inscrit.'; 
        vidersession(); 
        $_SESSION['inscrit'] = $pseudo; 
        /* informe qu'il s'est déjà inscrit s'il actualise, si son navigateur 
          bug avant l'affichage de la page et qu'il recharge la page, etc. */ 
        ?> 
        <h1>Inscription validée !</h1> 
        <p>Nous vous remercions de vous être inscrit sur notre site, votre inscription a été validée !<br/> 
            Vous pouvez vous connecter avec vos identifiants <a href="connexion.php">ici</a><br/>. 
            <?php echo $sent; ?></p> 
</div>


Bon alors franchement j'ai beau chercher plusieurs fois je ne trouve vraiment rien X_X Si quelqu'un pouvait m'aider ce serait cool.

5 réponses

Utilisateur anonyme
1 juin 2012 à 22:50
Bonsoir

Il te manque au moins un } pour refermer le if (mysql_query($insertion)) {
Mais si c'est vraiment la fin de ton fichier, il manque aussi </body></html>
1
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
1 juin 2012 à 23:10
Réorganise ton code , il est passablement mal structuré et illisible.
0
mikmuk Messages postés 156 Date d'inscription dimanche 22 août 2010 Statut Membre Dernière intervention 17 janvier 2013 7
2 juin 2012 à 11:36
J'ai suivis un tutoriel pour ça donc déjà pour le réorganiser c'est mal parti :s ensuite je ne vois pas où je dois ajouter l'accolade mes connaissances en php sont assez limitées :/
0
mpmp93 Messages postés 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
3 juin 2012 à 12:48
Bonjour,

2 choses me chiffonnent:

1° ceci:

if (inscription_mail($mail, $pseudo, $mdp)) 
            $sent = 'Un mail de confirmation vous a été envoyé.'; 
        else 
            $sent = 'Un mail de confirmation devait être envoyé, mais son envoi a échoué, vous êtes cependant bien inscrit.';


devrait plutôt être comme ecci:

if (inscription_mail($mail, $pseudo, $mdp)) {
            $sent = 'Un mail de confirmation vous a été envoyé.'; 
        } else { 
            $sent = 'Un mail de confirmation devait être envoyé, mais son envoi a échoué, vous êtes cependant bien inscrit.'; 
}


je sais qu'on peut faire selpon la première manière, mais c'est déconseillé dans les bonnes pratiques...

2° ceci:

<?php 
    if ($_SESSION['erreurs'] > 0) { 
        ?> 
       ......code HteuMeulLeu.....
  <?php 
   }
?>


Ce serait mieux comme ceci:

<?php if ($_SESSION['erreurs'] > 0): ?> 
       ......code HteuMeulLeu.....
<?php endif; ?>



dans votre code, vous avez diu HTML qui contient du PHP qui contient du HTML....

dans ma version vous êtes en HTML, vous passez en PHP et vous revenez à du HTML...

C'est ce qui est préconisé comme bonne pratique par le créateur de PHP lui-même!

A+
0
Pour le 1° : ajouter des accolades quand il n'y a qu'une seule instruction n'apporte rien. Ça sert juste à entretenir la confusion que les accolades font partie de la syntaxe du if alors que ça n'a aucun rapport. De plus, c'est contradictoire avec ton 2°. La notion de "bonne pratique" n'est pas une justification par elle-même, si une pratique est meilleure qu'une autre il y a une raison et tu n'en donnes pas.

Pour le 2° : ce que tu proposes ne modifie en rien les imbrications du php / html. Tu as uniquement remplacé
{ }
par
: endif;
et strictement rien d'autre.
J'ignore où tu as vu que le créateur de PHP lui-même préconisait "cette bonne pratique" (tu as un lien ?). Dans le manuel en ligne de php, on n'en parle même pas au chapitre sur le 'if', il faut aller fouiller dans le chapitre sur les syntaxes alternatives pour trouver cette écriture :
https://www.php.net/manual/fr/control-structures.alternative-syntax.php
Et surtout, quel rapport avec le Syntax error: unexpected: End of File qui est la question posée ?
0
mpmp93 Messages postés 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
4 juin 2012 à 01:27
Bonsoir:

CITE: "J'ignore où tu as vu que le créateur de PHP lui-même préconisait "cette bonne pratique" (tu as un lien ?)."

...de sa bouche même, conférences PHP PARIS 2010 à La Villette.

A+
0
Utilisateur anonyme
4 juin 2012 à 09:02
Merci de cette précision, qui explique que j'ignorais où tu avais vu ça.
Si tu veux bien, peux-tu me préciser s'il disait :
1 - D'utiliser : endif; au lieu de { } ?
ou 2 - de remplacer
"diu HTML qui contient du PHP qui contient du HTML...." par une version où
"vous êtes en HTML, vous passez en PHP et vous revenez à du HTML..."

Si c'est le 1, te rappelles-tu quelle justification il donnait ? En tous cas, Il y a du boulot à faire dans la doc officielle PHP, et des habitudes à changer chez les programmeurs J'utilise toujours { } , et regarde toi-même ce que tu écris dans la 1ère "chose qui [te] chiffonne"
Si c'est le 2, pourquoi l'évoquer puisque ta proposition ne change absolument rigoureusement strictement rien ?
0
mpmp93 Messages postés 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
Modifié par mpmp93 le 4/06/2012 à 10:19
Bonjour

C'est la seconde solution: "vous êtes en HTML, vous passez en PHP et vous revenez à du HTML..."

Il le disait en anglais. C'était justifié par le fait qu'il était assez critique vis à vis des moteurs de templates en général, alors que PHP dispose justement de mécanismes permettant de se passer généralement des moteurs de templates.

Il expliquait qu'il avait conçu PHP initialement pour gérer un CV. Selon la nature du visiteur qui répondait à une première question, il reformait son VC de manière avantageuse par rapport au profil de son visiteur. Et le mécanisme décrit avec les if: endif; en était une des clés.

Dans la pratique, parce que je développe intensivement avec netBeans (avec Zend Studio c'est du même tonneau...), si vous faites ceci:

<table> 
  <?php 
   if ($montest) { 
       echo "<tr><td>ligne à afficher</td></tr>"; 
  }  
  ?> 
</table>


Vous êtes dans le cas typique où l'analyseur DOM intégré à netbeans ne verra pas que vous avez intégré une ligne <tr>...</tr> dans <table>

En faisant comme le préconise Rasmus Lerdorf (inventeur du PHP), c'est à dire comme ceci:

<table> 
  <?php if ($montest): ?> 
       <tr><td>ligne à afficher</td></tr> 
  <?php endif;  ?> 
</:table>


l'analyseur DOM de netbeans verra la structure HTML complète de votre tableau.

Les "best pratices" recommandées par des pointures en programmation PHP préconisent d'éviter l'inclusion de HTML dans du PHP. J'insiste sur le fait que c'est une recommandation. mais si on la suit, on évite la fragmentation du code en "poupée russe".

Donc, si on utilise bien PHP comme "moteur de template", voici ce qu'il est recommandé d'éviter:

echo "<td>".$valeur."</td>";


et on lui préférera:

<td><?php echo $valeur; ?></td> 


L'intérêt - et je le vois tous les jours - c'est qu'on détecte les erreurs de structuration dans le code HTML final.

En PHP on a deux approches:
- du code HTML qui contient du PHP: c'est le cas d'une page dite "template"
- du code PHP pur: c'est le cas d'une classe ou un groupe de fonctions

Un template minimal:

<?php 
include 'initialiseEnvironnement.php'; ?> 
?> 
<html> 
<head> 
<title><?php echo $titre; ?></title> 
</head> 
<body> 
  ...... 
</body> 
</html>


là je simplifie à l'extrême, mais c'est ainsi que fonctionne toutes les applis PHP orientées MVC. Les grosses applications professionnelles sont en MVC pur sur socle Zend Framework et dérivés.

Après rasmus lerdorf, il y a deux autres personnes qui ont aidé à la promotion de PHP. Ce sont les créateurs de ZEND. La société ZEND a mis au point Zend Framework. Je vous invite à vous y intéresser. par exemple la classe View, ici:
http://framework.zend.com/manual/fr/zend.view.html

Et sur cette page:
http://framework.zend.com/manual/fr/zend.view.scripts.html

vous avez un exemple dans la documentation de Zend Framework que je copie et colle ici:

    <?php if ($this->livres): ?> 
        <!-- La table des livres --> 
        <table> 
            <tr> 
                <th>Auteur</th> 
                <th>Titre</th> 
            </tr> 
            <?php foreach ($this->livres as $cle => $livre): ?> 
            <tr> 
                <td><?php echo $this->escape($livre['auteur']) ?></td> 
                <td><?php echo $this->escape($livre['titre']) ?></td> 
            </tr> 
            <?php endforeach; ?> 
        </table> 
    <?php else: ?> 
        <p>Aucun livre à afficher</p> 
    <?php endif; ?>


Vous voyez donc que je n'invente rien.

A+
0
Utilisateur anonyme
4 juin 2012 à 10:55
Très intéressant. Si je comprends bien ce que tu décris, il est préférable de laisser les éléments structurants (les balises) en html plutôt que de les mettre à l'intérieur d'un echo php car dans ce dernier cas, ils échappent aux contrôles faits par les outils comme netBeans et Zend Studio.
Je retiens l'idée, car elle s'applique aussi à mon simple éditeur texte (pspad) qui est capable d'associer les ouvertures et fermetures de balises. Il est vrai que n'étant pas un pro, mes applications ne sont jamais bien compliquées, et que je peux me permettre de perdre un peu de temps à débugger là où un pro a besoin d'être efficace. Car j'avoue être fainéant et souvent préférer un 'echo' unique à une partie de ping-pong entre html et php.

Mais je ne vois pas du tout le rapport avec la 2°chose qui te chiffonne :
<?php
if ($_SESSION['erreurs'] > 0) {
?>
......code HteuMeulLeu.....
<?php
}
?>
Ce serait mieux comme ceci:
<?php if ($_SESSION['erreurs'] > 0): ?>
......code HteuMeulLeu.....
<?php endif; ?>

On est bien d'accord que le SEUL changement, c'est de remplacer une paire d'accolades par un : et un endif ? Ça n'a aucun rapport avec l'élément important qui est le masquage des balises par le php.
Mais je ne suis qu'un amateur, je ne dois pas tout comprendre.

Autre remarque : je me demande si nous n'avons pas fait fuir mikmuk ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
2 juin 2012 à 12:17
L'accolade est à mettre après la dernière instruction concernée par le if (mysql_query($insertion)). Et quelles instructions sont concernées par le if, c'est à toi de le savoir car c'est toi qui sais ce que tu veux faire (je me trompe ?).
Je suppose qu'ici, c'est complètement à la fin (entre balises <?php et ?> quand même.
-1