If ou switch, lequel choisir

WRInaute impliqué
Bonjours, dans mon code php, j'ai une série de IF qui vérifie s'il y a des erreurs après la validation d'un formulaire. En voici un exemple.
Code:
extract($_POST);
		$errors = 0;
		$errorlist = "";
		if (trim($title) == "") { $errors++; $errorlist .= "- Le titre du téléchargement est exigé.<br>"; }
		if (trim($url) == "") { $errors++; $errorlist .= "- L'url du téléchargement est exigé.<br>"; }
		if (trim($count) == "") { $errors++; $errorlist .= "- Le compteur du téléchargement est exigé.<br>"; }
		if (trim($picture) == "") { $errors++; $errorlist .= "- L'url de l'image du téléchargement est exigé.<br>"; }
		if (trim($content) == "") { $errors++; $errorlist .= "- La description du téléchargement est exigé.<br>"; }
ETC

J'aimerai savoir si c'est préférable de remplacer les if par un switch (sans le break), ou est ce que ca revient au meme dans ce cas.

Ca me donnerai un truc de ce genre:

Code:
		extract($_POST);
		$errors = 0;
		$errorlist = "";
		
		switch (true) {
		case (trim($title) == ""): $errors++; $errorlist .= "- Le titre du téléchargement est exigé.<br>";
		case (trim($url) == ""): $errors++; $errorlist .= "- L'url du téléchargement est exigé.<br>";
ETC

D'habitude je sais qu'un switch est plus éfficace quand il y a une multitude de elseif, mais ici avec des simple if en série, est nécéssaire. Merci pour ceux qui m'apporteront des précisions.
 
WRInaute passionné
Ce que tu as écris n'est pas équivalent :)
Avec un switch sans break, si title="", tu va avoir errors=5, quelque soit le contenu des autres variables.
Plutot qu'un long discourt, voir http://www.php.net/switch (la partie 3).

Sinon, switch ou if, dans le cas général, ça a le même résultat. Faut toujours mettre le cas le plus fréquent en premier, ça évite les tests inutiles.
 
Nouveau WRInaute
sur le plan technique ... le switch est plus optimisé car il n'accede qu'une seule fois à la variable et le compare avec chaque case, alors que le if va a chaque fois accéder et comparer les deux variables ...

mais bon je sais pas si c'est intéressant d'optimiser du PHP xD

mais dans votre cas l'utilisation d'un switch est inefficace ... (sur le point de vue de l'optimisation ...)
 
WRInaute accro
On se demande même pourquoi il y a un switch vu qu'on passe partout. Le switch sert justement à choisir la bonne branche et ne pas exécuter le reste 0_o
 
WRInaute discret
je dirais si tu a plus un if, elseif et else garde cette structure si tu commence à avoir plus de 2,3 else if au milieu il est plus sain de passer au switch car tu grapille quelque micro-seconde de génération.
 
WRInaute accro
Il y une difference infime entre if et switch en temps machine, de nombreux tests l'on maintes fois demontrés. On peut au mieux gratter quelque milliemes quand on test le cas le plus fréquent en premier.

On peut donc conclure que c'est idem
 
WRInaute accro
Eu si bien sure, je dis juste que c'est surtout un manque de logique ici.

Première chose que j'ai appris, le if else.

Ensuite, quand on voit qu'on a trop de if elseif ... pour des choses assez indépendantes basées sur le contenu d'une variable, alors seulement, on passe à un switch.

Enfin, avant d'avoir la logique, faut au moins comprendre la définition du if et du switch, voir la différence fondamentale et les cas les plus courants. Mais bon, ..., tout le monde ne se donne pas cette peine avant de se plonger réellement dans un langage et c'est bien dommage ! Ca pourrait éviter pas mal de questions assez (vraiment) basiques :mrgreen:.

Ca dépend aussi de la qualité des cours qu'on a suivi ou lus évidemment. On a pas tous la chance de tomber sur les mieux expliqués ou les plus structurés pour apprendre :)
 
WRInaute accro
je suis d'accord avec toi, mais dans ce cas, autant revoir tout le code, beaucoup d'erreurs... de débutant 8)
****
inutile voir dangereux sur certain serveur -> extract($_POST);
empty() va bien + vite que ($title == "")
<BR> est obsolète
.
..
 
WRInaute impliqué
suite

Par quoi tu remplacerais le <br>, est qu'il y a d'autres amélioration possible?

Sinon j'ai une autre question à te poster. Dans une page, faut t'il mieu éxecuter 2 fois la meme requete
comme ceci:

Code:
SELECT champ 1, champ 2 from table;

fonction() {

SELECT champ 3, champ 4 from table;

}


Ou pense tu qu'il est préférable de selectionner tous les champs directement au départ comme ceci:

Code:
SELECT * from table;

fonction() {

global $table;

}


Je selectionne tous pour des raisons technique, sinon j'aurai forcement pris seulement champ 1 à 4 . Donc c'est pour savoir est ce que c'est plus rapide de faire 2 requetes qui selectionnent juste le nécéssaire, ou c'est mieu d'en faire 1 seul qui prend tout d'un coup.

Ah oui aussi, tu dis empty() va bien + vite que ($title == "") , je suis entièrement d'accord, mais le porblème c'est qu'on peu pas cumuler un trim et un empty. TU aurais peut etre une solution?
 
WRInaute accro
-trim et empty sont des faux amis. traite les séparement.
$title=trim($title);
if (empty($title)) {}

-remplace <br> par <br />

-pour les requetes, tous dépend de la masse de contenu (au niveau poid) des champs.
 
WRInaute impliqué
Avec <br /> la validation html est pas possible. Sinon si il faut séparer trim et empty c'est pas plus lourd en terme d'éxécution. En terme de poid de page,

ca donnerait ca:
Code:
extract($_POST);
$title=trim($title); 
$url=trim($url); 
$count=trim($count); 
$picture=trim($picture); 
$content=trim($content); 

      $errors = 0;
      $errorlist = "";
     if (empty($title)) { $errors++; $errorlist .= "- Le titre du téléchargement est exigé.<br>"; }
         if (empty($url)) { $errors++; $errorlist .= "- L'url du téléchargement est exigé.<br>"; }
        if (empty($count)) { $errors++; $errorlist .= "- Le compteur du téléchargement est exigé.<br>"; }
      if (empty($picture)) { $errors++; $errorlist .= "- L'url de l'image du téléchargement est exigé.<br>"; }
         if (empty($content)) { $errors++; $errorlist .= "- La description du téléchargement est exigé.<br>"; }
ETC


déja je confirme que c'est plus lourd.

Sinon pour la requete, elle fait 2.3ko en tout.
 
WRInaute accro
Oui plus de lignes, mais plus rapide en temps d'execution. Le poid de la page php n'a aucune importance.

Pour les requetes, optimise les en ne prenant que les champs concernés. Avoir 2 requetes sur la meme table n'est pas trés couteux en temps machine puisque sql a deja ouvert 1 chache sur la table.

Pourquoi tu n'as droit au <br /> ?
 
WRInaute impliqué
suite

Mes pages reste valide, mais j'ai quand meme un message d'erreur sur le validator: exemple:

Line 36, Column 143: NET-enabling start-tag requires SHORTTAG YES

…ministrateurs via cette rubrique.<br />

Sinon il y a pas une solution pour racourcir ceci?

$title=trim($title);
$url=trim($url);
$count=trim($count);
$picture=trim($picture);
$content=trim($content);

Parceque faut savoir que sur certaines page je vais avoir une cinquantaine de ligne de ce genre.
 
WRInaute accro
pas compris ton problème avec la balise <br /> :?

Pour le trim, passe par un tableau, le resultat se trouve dans le tableau $datas

Code:
<?php
function trim_value(&$value) {
    $value = trim($value); 
}

$datas = array($title,$url,$count,$picture,$content);
array_walk($datas, 'trim_value');

// affiche
var_dump($datas);
?>
 
WRInaute passionné
YoyoS a dit:
Enfin, avant d'avoir la logique, faut au moins comprendre la définition du if et du switch, voir la différence fondamentale et les cas les plus courants. Mais bon, ..., tout le monde ne se donne pas cette peine avant de se plonger réellement dans un langage et c'est bien dommage ! Ca pourrait éviter pas mal de questions assez (vraiment) basiques :mrgreen:.

Mouaich, la différence entre un if et un switch est loin d'être fondamentale.
Ce n'est pas ça qui fera un bon code.

C'est sur qu'à coté, réfléchir à l'architecture du programme avant de coder la moindre ligne, faire code clair et documenté, un code stable... c'est pas important.
 
WRInaute impliqué
Mes pages sont valide HTML 4, pas XHTML, c'est pour cela que j'ai des erreurs dans la validateur lorsque je met <br /> à la place de <br>.
 
WRInaute impliqué
Oui dans ce cas je passerai à Xhtml, mais la ca me donne plus de 400 erreurs. C'est vraiment indispensable de passer à Xhtml?
 
WRInaute accro
pas indispensable mais utile, rien que pour afficher un <br /> sans retourner des erreurs.. vu que <br> est obsolète
 
Discussions similaires
Haut