CAPTCHA CALCUL / CARACTÈRE À LA XIÈME POSITION D'UNE CHAÎNE.

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 30 avril 2007 à 13:34
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 30 avril 2007 à 15:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42504-captcha-calcul-caractere-a-la-xieme-position-d-une-chaine

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
30 avril 2007 à 15:57
Concernant le mélange php html, c'est pas ce que je voulais dire.
Dans les deux cas que tu cites, c'est un mélange php et html.
C'est une syntaxe qui ne me plait pas, parce que j'ai tendance à séparer le traitement de l'affichage, afin qu'un éventuel designer puisse ne s'occuper que de l'affichage, sans savoir comment est déterminé tout ce qui est affiché.
Sans gestionnaire de template comme Smarty, ça donnerait des variables définies tout au long du script, puis placées, en fin de script, dans le code html. Là, peu importe qu'on utilise echo() pour afficher tout le code html dans lequel on place les variables (ce qui est beurk) ou qu'on ouvre des tags php chaque fois qu'on veut afficher une variable (comme les templates compilés de Smarty).
Après, personnellement, j'utilise toujours Smarty. Bref, comme tu le dis, chacun sa façon de coder. Mais tout dépend aussi de ce qu'on veut faire : si tu veux fournir une source qui puisse être facilement adaptée et intégrée dans un site web par le premier venu, plus tu lui facilites la tâche, plus ça plaira...

Sinon, pour ne plus avoir de test, tu peux utiliser des fonctions appelées dynamiquement, comme je te le disais. Une pour chaque opération.
Exemple :

function operation_add($n1, $n2)
{
return ($n1 + $n2);
}

function operation_sous($n1, $n2)
{
return ($n1 - $n2);
}

function operation_mult($n1, $n2)
{
return ($n1 * $n2);
}

function operation_div($n1, $n2)
{
echo "Arrondissez à l'entier défaut.
";
echo "Exemple
Pour (0 <= x <= 4), 12.x donnera 12
Pour (5 <= x <= 9), 12.x donnera 13

";
return round($n1/$n2);
}

$operations = array(
0 => array(
'func' => 'add',
'signe' => '+'),
1 => array(
'func' => 'sous',
'signe' => '-'),
2 => array(
'func' => 'mult',
'signe' => '*'),
3 => array(
'func' => 'div',
'signe' => '/')
);

$nombre1 = rand(100,200);
$nombre2 = rand(1,100);
$num_op = rand(0,3);
$lesigne = $operations[$num_op]['signe'];
$lafonction = 'operation_' . $operations[$num_op]['func'];
$resultat = $fonction($nombre1, $nombre2);

Et là, pouf, plus aucun test.
WanaDien Messages postés 7 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 28 mai 2007
30 avril 2007 à 15:51
@kankrelune : Okai :) merci ^^. Ouais j'ai vu ton code, en fait tu utilises la fonction eval() qui permettre d'afficher ton signe dans une variable et faire le calcul.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
30 avril 2007 à 15:41
le rand() n'est pas obsolète... il est juste plus lent que mt_rand()

Quand au switch vu la taille du code que tu utilise l'un ou l'autre la différence sera imperceptible au niveau du temps d'exécution... sur un gros code ça vaut le coup de se pencher sur la question mais sur un code court comme le tien tu peux mettre un switch c'est pas bien grave... privilégie celui qui te parait le plus clair et avec lequel tu est le plus à l'aise... mais comme je l'ai dit que ça soit un switch ou un if/elseif/else ce n'est pas le mieux en terme de logique... vas voir le code que j'ai posté (lien dans mon commentaire précédant)... .. .

@ tchaOo°
WanaDien Messages postés 7 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 28 mai 2007
30 avril 2007 à 15:24
Merci pour vos commentaires.

@Neigedhiver : Ok donc en fait le rand() est devenu obsolète en quelque sorte ?
Pour le floor() j'y avais pensé, mais j'ai choisi round() pour avoir un "niveau de difficulté" en plus. ^^
Personnellement, dans mes codes, je ferme et ouvre à chaque fois la balise php quand j'en ai besoin, c'est très rare que je fasse un truc de se genre : echo "
Oh ok $var
";, je préfère faire
Oh ok <?php echo $var; ?>
(mais bon là je l'ai pas fais, me demande pas pourquoi. lol) enfin après c'est chacun sa façon de coder lol

@kankrelune : tu me conseilles quoi alors ? je privilègie la vitesse par rapport à mes conditions, ou l'esthétique avec le switch ?

Bonne jounrée, je mettrais ma source à jour entre 2 insommies ^^
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
30 avril 2007 à 14:54
@ neigedhiver... par contre il est indéniable qu'un switch bien indenté est bien plus clair à lire... .. . ;o)

@ tchaOo°
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
30 avril 2007 à 14:53
Au fait tes if/elseif/eles pour le calcul sont un peu bof bof... d'une manière générale tu te complique la vie (initialisation de variables pour rien, le substr pour un caractère...) sinon tout comme neigedhiver tu devrais faire une fonction qui renvoie la question point... moi je ferais plutot... .. .

/** je poste parce que ça me saoul de tout réécrire en commentaire **/

>> http://www.phpcs.com/code.aspx?ID=42513

@ tchaOo°
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
30 avril 2007 à 14:50
J'étais persuadé du contraire, je viens de constater que non...
Cependant, switch est moins performant qu'une syntaxe comme la suivante :
if () {}
elseif () {}
else () {}

Or ce n'est pas la syntaxe que WanaDien utilise.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
30 avril 2007 à 14:03
"Plutôt qu'un if... Un switch serait pas mal... C'est un peu mieux optimisé pour ce genre de test."

Si le switch est effectivement plus clair la suite d'if/elseif/else reste plus rapide à l'execution... .. .

@ tchaOo°
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
30 avril 2007 à 13:34
Salut,

Plutôt qu'un if... Un switch serait pas mal... C'est un peu mieux optimisé pour ce genre de test.

Une autre méthode serait d'utiliser une fonction par opération à effectuer et de l'appeler dynamiquement en fonction du signe obtenu aléatoirement.

Par ailleurs, la fonction mt_rand est plus efficace que rand : http://ch2.php.net/manual/fr/function.mt-rand.php

Peut-être que l'utilisation de floor() à la place de round() simplifierait les explications du formulaire.

Et parce que j'aime bien avoir un code html propre, un petit \n pour chaque retour à la ligne, après
, ça fait plus classe (mais c'est vraiment pour chipoter).

Dernier commentaire, qui n'est pas spécifique à cette source : je suis toujours étonné de voir le nombre de personnes qui continuent de développer en mélangeant allègrement php et html. En ce qui me concerne, j'ai du mal : c'est moins portable, moins clair pour une intégration dans un autre site web. Sans aller jusqu'à l'utilisation d'un moteur de templates comme Smarty, il est possible de séparer le traitement de l'affichage, même en utilisant des echo().
Rejoignez-nous