Guide informatique hardware En1heure.com
Articles phares : Quelle alimentation PC | Choisir son ecran LCD PC

Chercher un sujet :

}; ???

Itseasy est un petit projet Open Source de CMS sans base de données. Son but est d'être accessible et rapide.
Participez au développement et / ou suivez son cours à travers cette section ;o)
Site officiel : Itseasy | Démonstration en ligne

Messages: 17
Inscription: Ven Oct 15, 2004 6:14 pm
}; ???MessagePosté: Lun Déc 13, 2004 9:29 pm

J'étais en train de regarder le codage d'un script pour un chat pgp (PhpMyChat), et je suis tombé sur un code que j'avais jamais vu auparavent :

if(condition1 == condition2) {
//action
};

C'est bien sur le "};" qui m'a interloqué, au derniere nouvelle pour fermer un bloc un simpl } suffit.

Sur de moi, j'abandonne la lecture de ce script vu qu'il était codé bizarrement.

Puis je tombe sur du code Iteasy, et je retombe nez à nez face à un "};" (ligne 47 de header.php).

D'un coup, d'un seul, j'étais plus très sur de moi sur le fait que "};" était une faute.

Donc, je le demande ici, "};" ça existe ?? et ça apporte quoi face au "}" simple ??

++
Avatar de l’utilisateur
Administrateur
Messages: 1614
Inscription: Ven Mar 26, 2004 7:16 am
Localisation: /var/www/
}; ???MessagePosté: Mar Déc 14, 2004 2:39 pm

Bonjour !
Le }; provient d'une fatigue accumulée :lol:
En fait normalement seul le } est correct mais comme le }; n'est pas signalé comme erreur je ne l'avais même pas vu !
Merci pour l'info.

Messages: 17
Inscription: Ven Oct 15, 2004 6:14 pm
}; ???MessagePosté: Mar Déc 14, 2004 8:06 pm

Ca me rassure alors ;o)

Les }; ça n'existe pas

Donc ligne 22 de 0sys_connexion_administration.php, y'a la meme erreur aussi ;o)

Et dans 0admin_header.php, donc y'a aussi pleins de petite erreur ;o)

Tiens d'ailleurs, un truc qui m'ennerve fortement :
le "exit();" !!

Par exemple ce code dans le 0admin_header.php (en ayant corriger les };)

if(!isset($_SESSION['ip_utilisateur'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
if($_SESSION['ip_utilisateur'] != $_SERVER['REMOTE_ADDR']) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
if(!isset($_SESSION['hash_acces_utilisateur'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
if($_SESSION['hash_acces_utilisateur'] != $hash_acces) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
if(!isset($_GET['sid'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
if($_GET['sid'] != session_id()) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
if(!isset($_SESSION['user_agent'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
if($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
exit();
}
@ob_start("ob_gzhandler");
...

Ce code par exemple, il aurait pas été plus logique, a la place d'utiliser des if en gogo et des exit() dans chaque, de coder avec la fameuse technique du if - elseif - else : logique non ? car quand on veut faire un autre test si le premier était faux, on met un elseif.

Donc ça donnerais :
if(!isset($_SESSION['ip_utilisateur'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
elseif($_SESSION['ip_utilisateur'] != $_SERVER['REMOTE_ADDR']) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
elseif(!isset($_SESSION['hash_acces_utilisateur'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
elseif($_SESSION['hash_acces_utilisateur'] != $hash_acces) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
elseif(!isset($_GET['sid'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
elseif($_GET['sid'] != session_id()) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
elseif(!isset($_SESSION['user_agent'])) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
elseif($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
else {
@ob_start("ob_gzhandler");
.....
}

Avec ce type de codage on voit toute de suite mieux les relations entre chaque test.

Je vois pas vraiment pk y'a des exit(); dans tout les sens, et pas que dans vos script.
Pour moi quand y'a un exit(); c'est que simplement l'imbrication des conditions (ou/et boucles) a été mal faite et que donc on ne peut arreter un script sans l'intervention d'un exit();
Alors qu'un if () {} et en else{} réponde dans la grande majorité des cas à cette demande.
Mais apparement le "else" est souvent oublié, et donc apres le test "if" qu'il rentre ou pas, le prog continue et affiche ce qui ne devrait pas afficher, donc le codeur rajoute un exit() au moins il est tranquille.
Mais si a la base il avait mis un else en toute logique ça serait jamais arrivé

++


EDIT :
En relisant le code, j'ai vu une simplification supplémentaire :
if(!isset($_SESSION['ip_utilisateur'] ||
$_SESSION['ip_utilisateur'] != $_SERVER['REMOTE_ADDR'] ||
!isset($_SESSION['hash_acces_utilisateur']) ||
$_SESSION['hash_acces_utilisateur'] != $hash_acces ||
!isset($_GET['sid']) ||
$_GET['sid'] != session_id() ||
!isset($_SESSION['user_agent'])
|| $_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']) {
$titre_page = "Autorisation refusée";
require("./0sys_autorisation_refusee.php");
}
else {
@ob_start("ob_gzhandler");
.....
}

Ca fait un énorme if, mais on gagne pas mal de ligne et donc de la place.
Avatar de l’utilisateur
Administrateur
Messages: 1614
Inscription: Ven Mar 26, 2004 7:16 am
Localisation: /var/www/
}; ???MessagePosté: Mar Déc 14, 2004 8:22 pm

Hello !
Oui carrément tu as raison !
Merci je ferai les modifs ;)
Par contre kékitonfait mes exit(); ? :mrgreen:

Messages: 17
Inscription: Ven Oct 15, 2004 6:14 pm
}; ???MessagePosté: Mar Déc 14, 2004 8:28 pm

D'ailleurs dans le meme style (j'écris dans une nouveau message, car on risque de plus rien comprendre sinon)

dans 0admin_afficher_masquer_statistiques.php :
if($afficher_stats == "0") {
$nouvelle_configuration = str_replace("afficher_stats = \"0\"", "afficher_stats = \"1\"", $configuration);
$handle = fopen("./0sys_config.php","w+");
fwrite($handle,$nouvelle_configuration);
echo "<h1>Opération éffectuée</h1>
<p>Les statistiques de bas de pages sont maintenant affichées.</p>";
}
if($afficher_stats == "1") {
$nouvelle_configuration = str_replace("afficher_stats = \"1\"", "afficher_stats = \"0\"", $configuration);
$handle = fopen("./0sys_config.php","w+");
fwrite($handle,$nouvelle_configuration);
echo "<h1>Opération éffectuée</h1>
<p>Les statistiques de bas de pages sont maintenant désactivées.</p>";
}

Vu que logiquement, si la premiere condition est réalisé, la deuxieme ne le sera jamais, il faut mettre elseif à la place du 2° if.
Au moins quand le premier test est vrai, le parser zappera direct le test de l'autre en voyant que c'est un elseif (donc à tester que si les test précédent sont faux).
En mettant un autre if, tu obliger le parser à vérifier si la condition est vrai ou pas. Donc plus de travail pour lui.

D'ailleurs un autre truc bizarre, mais ne connaissant pas suffisament iteasy, je peux pas etre sur, mais apparament la varaiable $afficher_stats devrait etre de type entier (et oui meme si on déclare pas les types, ils existe quand meme ;o). Or ici, on teste si $afficher_stats == "0", mais en mettant des "", ça indique que c'est une chaine de caractère.
Logiquement, il est plus pratique de manipuler des entiers, donc peut etre qu'il serait mieux d'enlever les "".

Il serait aussi justicieux de regrouper des informations communes.

Mais je sais toujours pas tout viens $afficher_stats. Passage par URL ?
Donc en tout ça donnerais :

if($afficher_stats == 0 || $afficher_stats == 1) {
$handle = fopen("./0sys_config.php","w+");
echo "<h1>Opération éffectuée</h1>
<p>Les statistiques de bas de pages sont maintenant ";
if($afficher_stats == 0) {
$nouvelle_configuration = str_replace("afficher_stats = 0", "afficher_stats = 1", $configuration);
echo "affich.</p>";
}
elseif($afficher_stats == 1) {
$nouvelle_configuration = str_replace("afficher_stats = 1", "afficher_stats = 0", $configuration);
echo "désactiv"; // Pousser à bout l'amélioration ;o)
}
echo "ées.</p>";
fwrite($handle,$nouvelle_configuration);
}

Y'a surement pas tout qui est bon a prendre ;o) mais y'a surement des trucs interessant dans ce que je dis ;o)

Messages: 17
Inscription: Ven Oct 15, 2004 6:14 pm
}; ???MessagePosté: Mar Déc 14, 2004 8:33 pm

vanquish a écrit:Hello !
Oui carrément tu as raison !
Merci je ferai les modifs ;)
Par contre kékitonfait mes exit(); ? :mrgreen:


Je l'ai hait ;o)

J'aime pas les exit() pour 2 raisons :
1°) J'ai jamais appris à programmer dans n'importe quel langage avec ce genre de (pseudo) astuce.
2°) On croit justement que c'est une astuce, c'est pratique, tu fout un exit() et ça arrete ton script d'un coup. Mais il arrive souvent par exemple qu'on mette à la fin des page php un require("footer.php"); qui permet de finir un page php avec les balise de fermeture html.
Mais le preobleme quand y'a un exit(); c'est qu'on saute tout ça. Donc les pages crées par des scripts ayant exécutés un exit() seront des pages pas fini, et donc pas conforme aux standards vu qu'il manquera au minimun un </body></html> et souvent bien plus.

++
Avatar de l’utilisateur
Administrateur
Messages: 1614
Inscription: Ven Mar 26, 2004 7:16 am
Localisation: /var/www/
}; ???MessagePosté: Mer Déc 15, 2004 8:21 am

Pas dans Itseasy !

Messages: 17
Inscription: Ven Oct 15, 2004 6:14 pm
}; ???MessagePosté: Mer Déc 15, 2004 2:37 pm

C'est possible mais je trouve que les exit(); poussent bug

DOnc je les évite

Retourner vers Développement technique d'Itseasy



Chercher un sujet :


cron