Quelle est cette erreur PHP ?

WRInaute passionné
Bonjour,

Voilà, j'ai une erreur PHP que je n'ai jamais rencontrée :


Code:
Parse error: syntax error, unexpected '?' in /homez.42/monsite/scripts/annuaire-formulaire.php on line 1130
Je ne vois aucun problème à la ligne 1130. Qu'est-ce que ce "unexpected ?" veut dire ?

Je ne comprends pas, d'autant plus que c'est sur un hébergement que j'utilise pour les tests et que ça fonctionne bien sur l'autre site.

Avez-vous une idée :?:
 
WRInaute accro
Meeuuuhhh a dit:
Bonjour,

Voilà, j'ai une erreur PHP que je n'ai jamais rencontrée :


Code:
Parse error: syntax error, unexpected '?' in /homez.42/monsite/scripts/annuaire-formulaire.php on line 1130

Le truc, c'est qu'il n'y a pas de ligne 1130. Donc en général c'est un ;} qui manque. Mais là, c'est un "unexpected ?" ...

Je ne comprends pas, d'autant plus que c'est sur un hébergement que j'utilise pour les tests et que ça fonctionne bien sur l'autre site.

Avez-vous une idée :?:

Une balise php mal fermée ?
 
WRInaute passionné
Salut UsagiYojimbo,

En fait je me suis trompé de fichier mea culpa... Il y a 1266 lignes.

Mais à la 1130 je ne vois aucune erreur. Et je ne sais pas ce que signifie ce "unexpected ?", je ne trouve rien sur google.

**edit**

j'édite le premier poste.
 
WRInaute accro
Bonjour

"To expect" en Anglais, signifie: "s'attendre à".

"Unexpected" signifie: "non prévu", ou "inattendu".

Celà signifie simplement que le point d'interrogation "unexpected" correspond à quelque choses auquel ne s'attendait pas l'interpréteur php, qui interprète le contenu du script php du début à la fin, et que donc ce point d'interrogation est le point de départ, d'une faute de syntaxe par rapport à la syntaxe du langage PHP.

A la ligne indiquée, il devrait y avoir un point d'interrogation, et tu devrais pouvoir diagnostiquer facilement l'erreur de syntaxe.

Pour info, parfois les numéros de lignes indiquées par les messages d'erreur, ne sont pas strictement exacts, mais sont exacts pratiquement toujours, avec une très faible marge d'erreur.

...Suffit de chercher un point d'interrogation dans le code source, aux environs de la ligne indiquée.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
En fait, lorsque j'enlève ce passage, le reste du script fonctionne.
Code:
<?php
if(!empty($meta_title) AND $_GET['modif']!=8)
{
echo"A) Balise title  : $meta_title<p>"
;}
if(!empty($meta_keyword) AND $_GET['modif']!=8)
{
echo"B) Balise keywords : $meta_keyword<p>"
;}
if(!empty($meta_description) AND $_GET['modif']!=8)
{
echo"C) Balise description : $meta_description<p>"
;}
if(isset($_GET['modif']) AND $_GET['modif']==8)
{
echo'
Les trois champs ci-dessous doivent être relativement courts. 
<p>
<form action="annuaire-formulaire.php#8" method="post">
A) Indiquez ici le titre de votre page (balise méta "title"). Celui-ci s\'affichera en haut du navigateur :<br>
<textarea name="title" cols="50" rows="2">'.$meta_title.'</textarea>
<p>
B) Indiquez ici une série de mots-clefs à destination des moteurs de recherche (balise méta "keywords"). Séparez chaque mot-clef par une virgule. Choisissez vos mots-clefs en fonction de leur pertinence par rapport à votre activité et vos services.<br>
<textarea name="keyword" cols="50" rows="2">'.$meta_keyword.'</textarea>
<p>
B) Indiquez ici une brève description de votre site internet :<br>
<textarea name="description" cols="50" rows="2">'.$meta_description.'</textarea>
<p align="center">
<input type="hidden" name="clef" value="'.$clef.'">
<input type="submit" name="annuler" value="Annuler">
<input type="submit" name="modifier-8" value="Modifier">
</form>';}
if($_GET['modif']!=8)
{echo'
<form action="annuaire-formulaire.php?modif=8#8" method="post">
<p align="center">
<input type="hidden" name="clef" value="'.$clef.'">
<input type="submit" name="modifier" value="Modifier">
</form>
';}
?>

Je ne vois aucune erreur dans ce bout de code.
 
WRInaute accro
Oui, mais dans ton exemple la, c'est laquelle ta ligne 1130 ?

Ps : ton code est particulièrement illisible à cause d'un fort manque de retour à la ligne.
 
WRInaute passionné
L'erreur ne se trouve pas à la ligne 1130, car ce fichier est inclus dans l'autre. En tout cas, c'est ce bout de code qui génère l'erreur, quand je l'enlève, ça fonctionne bien.
 
WRInaute accro
Bonjour

Solution pour tester:

Tu mets le contenu du script inclus dans le script incluant au bon endroit ( où se trouve l'inclusion dans le script incluant ), ceci après avoir copié le script incluant dans un autre script, puis tu reteste en faisant: php -l nouveau_script.php

Ainsi, tu as le bon numéro de ligne, et roule Raoul...

Et puis ( si tu es sous Linux ), un petit passage de tes scripts par le programme indent bien paramétré, ne ferait pas de mal, pour les formatter de manière automatique...

A charge, de restaurer ensuite les balises <?php et ?> , ainsi que les affectations du type : point - signe égal ( .= ) , pour lesquelles ce passage à la moulinette indent, aura inséré un espace entre le point et le signe égal.

Pour corriger cela, sous l'éditeur vi ( attention d'abord à ce qu'il soit bien configuré pour le codage de caractères choisi, ISO8859-15 ou UTF-8 ), tu charge le script, puis tu appuies sur la touche Esc ou Echappement ( en haut à gauche du clavier ), puis tu fais sur le clavier, ceci:

:g/. =/s//.= /g

Donc, entre les deux premiers slashes ( / et / ) tu as un point, suivi d'un espace, suivi du signe égal.

Entre les deux derniers slashes, tu as: un point, suivi du signe égal, suivi d'un espace.

Quant tu entres celà au clavier sous vi, ce que tu entres au clavier s'affiche en bas de la fenêtre d'édition du fichier.

Evidemment, tu n'édites ce fichiers ( script php ) sous vi, qu'après avoir indenté ( = formatté ) ce script avec indent.

Après avoir entré la ligne ci-dessus, tu appuies sur la touche <Enter>, et toutes les corrections sont faites sur le code source.

Tu n'as plus qu'à sauvegarder le fichier, en faisant:

:w

Puis, appuyer sur la touche <Enter>

En ce qui me concerne, j'avoue à ma grande honte, que je connais pas d'autre logiciel que indent, pour formatter un fichier. Cependant, indent est spécialisé pour le code source du Langage C++, qui a une syntaxe très légèrement différente du PHP. Alors...

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute accro
Rebonjour

J'ai vu au moins un point d'interrogation dans ton code, et il me semble qu'il y a une faute, en tout cas de html:

<form action="annuaire-formulaire.php?modif=8#8" method="post">

Cette instruction ( donc ce code html ), est affiché entre deux simple quotes par une instruction echo, et les simples quotes semblent bien "nestées", c'est-à-dire appariées entre elles.

En ce qui concerne le code html, il me semble, qu'il est impossible de recevoir un paramètre "get" ( donc mis dans l'url ), dans un script accédé par un formulaire en mode "post".

Donc, si tu tiens à garder le mode "post" pour ce formulaire, tu peux toujours virer "?modif=8#8" , qui ne sert à rien.

Si tu veux transmettre ce paramètre en mode "post", la bonne solution est de l'indiquer dans le formulaire, comme paramètre "hidden", c'est-à-dire paramètre caché. A ce moment -là, le paramètre sera effectivement transmis en mode "post", comme désiré. Et là, pas besoin de point d'interrogation.

La syntaxe de ce paramètre "hidden" serait:

<input type="hidden" name="modif" value="8#8"></input>

J'adopte la balise </input> pour faire beau, pour la compatibilité XHTML 1.01... ;)

Si tu es en mode Transitional, tu peux ne pas mettre la balise fermante </input>

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute accro
Rebonjour

J'ajoute...

Au vu de ton script, tu reçois tes variables en mode "get" avec les super-globales $_GET[var]

Donc, ton formulaire doit être en mode "get", et non pas en mode "post".

Celà n'empêche pas, que la balise <form, doit avoir comme attribut "action", une url sans paramètre, donc sans point d'interrogation.

Les paramètres supplémentaires que tu veux transmettre de manière fixe, doivent être transmis comme paramètre "hidden" dans le formulaire.

Je conseille, comme petit livre sur la syntaxe HTML, le livre "HTML Précis et Concis", éditeur O'Reilly & Associates.

Des petis bouquins comme ça, c'est de l'or. ;)

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute accro
kazhar a dit:
Ps : ton code est particulièrement illisible à cause d'un fort manque de retour à la ligne.

L'indentation est franchement pas top, c'est clair (mais c'est peut-être du au copier-coller depuis le code source).
 
WRInaute accro
Meeuuuhhh a dit:
L'erreur ne se trouve pas à la ligne 1130, car ce fichier est inclus dans l'autre.
Comme les autres WRInautes qui essaient de t'aider, j'aimerais voir tes lignes 1129, 1130 et 1131, sauf si elles sont couvertes par le secret défense, évidemment. :lol:

Meeuuuhhh a dit:
En tout cas, c'est ce bout de code qui génère l'erreur, quand je l'enlève, ça fonctionne bien.
Cela ne me semble pas aussi simple.

Jean-Luc
 
WRInaute passionné
Je suis toujours bloqué dessus.

Pour ceux qui souhaitent absolument la ligne, c'est celle là :

Code:
{echo'CHECKED';}
echo'> <a href="http://www.monsite.com/'.$article.'.htm" target="_blank">'.$nom.'</a>
<br>
'

Ca va pas vous avancer beaucoup...
 
WRInaute passionné
Je me demande si ça n'est pas un problème lors de l'upload des fichiers.

Là subitement, ça refonctionne correctement... Or le FTP a buggé toute la journée. Un coup ça a fonctionné, ça s'affichait deux fois, un coup ça ne s'affichait qu'à moitié, un coup ça affiche le message d'erreur... Et là ça fonctionne...
 
WRInaute accro
Ah bon

Un tout petit conseil, pour valider les script php avant de les charger sur ton site:

Avoir un serveur ( Apache de préférence ) et un interpréteur PHP en local sur ton ordi, en vue de tester ton site en local, et aussi de pouvoir tester la validité syntaxique des scripts php, en faisant:

php -l script.php

Le programme php avec ce paramètre tiret l ( -l ), permet d'afficher les erreurs et warnings éventuels, dus à des erreurs dans le code source du script.

Ainsi, tu peux accélérer beaucoup la mise au point de ton/tes sites, ce qui rachète largement l'effort pour installer Apache/PHP sur ton ordinateur.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
Discussions similaires
Haut