Erreur d'inatention

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Erreur d'inatention

par zeus » 26 avr. 2007, 16:07

Je crois surtout que l'opérateur ternaire se dégrade quand ils sont imbriqués (et peut même avoir des effets innatendus au dela d'un certain nombre)
+1 :pouce:
Nous avions eu une discussion controversée avec Albat à ce sujet et nous avions conclu que ça rentrait dans le cadre de l'ergonomie du développeur mais j'ai toujours gardé la conviction que l'imbrication des opérateurs ternaires est à oublier.
Le principe de l'opérateur ternaire étant de simplifier les tests, s'il faut les imbriquer, c'est qu'une structure if/elsif/else prend son sens

par Sékiltoyai » 26 avr. 2007, 15:25

Ya pas de hasard :D

par Ryle » 26 avr. 2007, 15:09

ah ouais tiens.. c'est les mêmes voyelles et en plus ça rime, c'est fort ça :)

par Sékiltoyai » 26 avr. 2007, 14:37

l'habitude de java :)
java caca...

par Ryle » 26 avr. 2007, 14:36

Je crois surtout que l'opérateur ternaire se dégrade quand ils sont imbriqués (et peut même avoir des effets innatendus au dela d'un certain nombre) ... Mais quitte à ne pas l'utiliser, plutôt qu'un if/else, je verrais plus un simple if et une déclaration et initialisation préalable (l'habitude de java :))
$var = 0;
if (isSet(...))
  $var = ... ;
J'ai pas php pour tester mais je pense que cela réduirait un peu le temps de traitement constaté ci-dessus :)

par Sékiltoyai » 26 avr. 2007, 14:34

ton script doit etre bugué ! :langue:
C'est cela oui :D
bon bah ca va peut etre me reconcilier avec l'op ternaire... que j'évitais comme la peste... :)
Bah il est bien pratique quand même...

par Jules Petibidon » 26 avr. 2007, 14:31

tiens oui, je viens de reprendre ton test, j'obtiens des temps a peu pres équivalents selon la méthode... avec meme un léger avantage pour l'op ternaire...

bizarre, j'avais toujours vu le contraire...

ton script doit etre bugué ! :langue:

bon bah ca va peut etre me reconcilier avec l'op ternaire... que j'évitais comme la peste... :)

par Sékiltoyai » 26 avr. 2007, 14:13

Bah écoute, je viens de faire un test rapidement :
<?php

set_time_limit(0);

for($count=0;$count<1000;$count++)
{
	$var[mt_rand(0,2000)] = $count;
}

$time = microtime();
for($i=0;$i<1000;$i++)
{
	echo '<br />';
	echo isset($var[$i])?$var[$i]:0;
}
echo '<br /><br />';
echo 'time : ' . (microtime() - $time);
echo '<br /><br /><br />';

sleep(10);

$time = microtime();
for($i=0;$i<1000;$i++)
{
	echo '<br />';
	if(isset($var[$i]))
	{
		echo $var[$i];
	}
	else
	{
		echo 0;
	}
}
echo '<br /><br />';
echo 'time : ' . (microtime() - $time);

?>
Et c'est l'opérateur ternaire qui est devant :
time : 0.004822
time : 0.065895

par Jules Petibidon » 26 avr. 2007, 13:49

je serais en théorie d'accord si la comparaison ternaire etait pas une catastrophe en terme de perfs...
d'expérience, sur une classe de template, en remplaçant une comparaison ternaire par un if/else, j'avais divisé le temps de génération par 3 (bon évidemment c'était sur un test de capacité ultra poussif) ;)

par Sékiltoyai » 26 avr. 2007, 12:30

La on va chercher dans les subtilités de php.
Je viens de vérifier (en PHP5), en fait, les 2 méthodes te donnent exactement la même variable $test, à savoir que si $_GET['test'] n'existe pas, $test sera indéfini (de valeur NULL) et donnera false s'il passe dans isset.
La différence est qu'en cas d'inexistance d'une variable ou d'un index, une erreur notice est générée. Et dans le cas
$var = @$_GET['var'];
l'erreur est masquée, alors que dans l'autre cas, une erreur sera générée à chaque appel de la variable $test qui n'aurait pas été précédé de @.
Si on avait voulu être rigoureux, on aurait dit que
$var = @$_GET['var'];
est totalement équivalent à
$test = isset($_GET['var'])?$_GET['var']:NULL;
Mais, dans tous les cas, je ne suis pas fan des @ ou bien des affectations if(...) $machin=...; . J'ai tendance à conseiller plutôt l'emploi de l'opérateur ternaire pour ces opérations là, quitte à associer la valeur NULL si on veut que le variable reste indéfinie.

par Jules Petibidon » 26 avr. 2007, 08:58

Hello,

Note pour la suite : Ceci est un message pollueur, mais en rapport (plus ou moins lointain, il est vrai) avec certains thèmes abordés dans ce sujet. Si ce message est malvenu, un message d'un modo et je l'effacerai ;)

Donc une question super bete :
lorsque je vois ceci :
if( isset( $_GET['var'] ) ) $var = $_GET['var'];
Je me dis que
$var = @$_GET['var'];
revient exactement au même (la cagouille est choquante car généralement mal utilisée, mais dans ce cas précis, elle me parait fortement avantageuse).
Quelqu'un de plus expert pourrait peut-être expliquer si faille il y a, ou un vice caché de l'arobase ?

par Cyrano » 26 avr. 2007, 07:39

Et... :?: ça fonctionne mieux ? Si oui, pense au tag [Résolu]

par zaknaou. » 25 avr. 2007, 22:42

Voilà j'ai apporté quelques modifications dont trime :
<?php 

include ('inc_ouverture.php'); 

//------------------------------RECEPTION DES CHAMPS DE FORMULAIRES------------------------------>>
 
$civilite                isset($_POST['civilite']) ? trim($_POST['civilite']) : ""; 
$nom                     isset($_POST['nom']) ? trim($_POST['nom']) : ""; 
$prenom                  isset($_POST['prenom']) ? trim($_POST['prenom']) : ""; 
$iduser                  isset($_POST['iduser']) ? trim($_POST['iduser']) : ""; 
$jour   				 isset($_POST['jour']) ? trim($_POST['jour']) : ""; 
$mois    				 isset($_POST['mois']) ? trim($_POST['mois']) : ""; 
$annee   				 isset($_POST['annee']) ? trim($_POST['annee']) : ""; 
$numrue       	       	 isset($_POST['numrue']) ? trim($_POST['numrue']) : ""; 
$rue                     isset($_POST['rue']) ? trim($_POST['rue']) : ""; 
$postal             	 isset($_POST['postal']) ? trim($_POST['postal']) : ""; 
$batiment                isset($_POST['batiment']) ? trim($_POST['batiment']) : ""; 
$etage                   isset($_POST['etage']) ? trim($_POST['etage']) : ""; 
$porte                   isset($_POST['porte']) ? trim($_POST['porte']) : ""; 
$ville                   isset($_POST['ville']) ? trim($_POST['ville']) : ""; 
$pays                    isset($_POST['pays']) ? trim($_POST['pays']) : ""; 
$fixe          			 isset($_POST['fixe']) ? trim($_POST['fixe']) : ""; 
$portable      			 isset($_POST['portable']) ? trim($_POST['portable']) : ""; 
$email                   isset($_POST['email']) ? trim($_POST['email']) : ""; 
$mdp             		 isset($_POST['mdp']) ? trim($_POST['mdp']) : ""; 
$confirmation      	 	 isset($_POST['confirmation']) ? trim($_POST['confirmation']) : ""; 
$avatar                  isset($_POST['avatar']) ? trim($_POST['avatar']) : ""; 
$site		             isset($_POST['site']) ? trim($_POST['site']) : ""; 

//--------------------------FIN DE RECEPTION DES CHAMPS DE FORMULAIRES--------------------------->>

if(($civilite == "") || ($prenom == "") || ($iduser == "") || ($datedenaissancejour == "") || ($datedenaissancemois == "") || ($datedenaissanceannee == "") || ($codepostal == "") || ($ville == "") || ($pays == "") || ($telephonefixe == "") || ($email == "") || ($motdepasse == "") || ($confirmotdepasse == ""))
{
    
//---------------------------------VERIFICATION DES CHAMPS VIDE--------------------------------->>

if	($civilite 		== "")	{ $_SESSION['civilite'] 		= 	"Le champs [Civilité] est vide, veuillez le compléter"; }
if	($prenom 		== "")	{ $_SESSION['prenom'] 			= 	"Le champs [Prenom] est vide, veuillez le compléter"; }
if	($iduser 		== "")	{ $_SESSION['iduser'] 			= 	"Le champs [Identifiant] est vide, veuillez le compléter"; }
if	($email 		== "")	{ $_SESSION['email'] 			= 	"Le champs [E-mail] est vide, veuillez le compléter"; }
if	($iduser 		== "")	{ $_SESSION['iduser'] 			= 	"Le champs [Identifiant] est vide, veuillez le compléter"; }
if	($jour	 		== "")	{ $_SESSION['jour'] 			= 	"Le champs [Jour de naissance] est vide, veuillez le compléter"; }
if	($mois 			== "")	{ $_SESSION['mois'] 			= 	"Le champs [Mois de naissance] est vide, veuillez le compléter"; }
if	($annee 		== "")	{ $_SESSION['annee'] 			= 	"Le champs [Année de naissance] est vide, veuillez le compléter"; }
if	($postal 		== "")	{ $_SESSION['postal'] 			= 	"Le champs [Code postal] est vide, veuillez le compléter"; }
if	($ville 		== "")	{ $_SESSION['ville'] 			= 	"Le champs [Ville] est vide, veuillez le compléter"; }
if	($pays	 		== "")	{ $_SESSION['pays'] 			= 	"Le champs [Pays] est vide, veuillez le compléter"; }
if	($fixe 			== "")	{ $_SESSION['fixe'] 			= 	"Le champs [Numéro de téléphone fixe] est vide, veuillez le compléter"; }
if	($portable 		== "")	{ $_SESSION['portable'] 		= 	"Le champs [Numéro de téléphone portable] est vide, veuillez le compléter"; }
if	($mdp 			== "")	{ $_SESSION['mdp'] 				= 	"Le champs [Mot de passe] est vide, veuillez le compléter"; }
if	($confirmation 	== "")	{ $_SESSION['confirmation'] 	= 	"Le champs [Confirmation du mot de passe] est vide, veuillez le compléter"; }

//------------------------------FIN DE VERIFICATION DES CHAMPS VIDE------------------------------>>

//--------------------------------VERIFICATION SPECIAL DES CHAMPS-------------------------------->>

// CHAMPS EMAIL AVEC @
$aroba = strpos($email,"@"); if($aroba == ''){$_SESSION['arobase'] = "Le champs [E-mail] doit contenir un arobase, veuillez le corriger";}

// CHAMPS EMAIL AVEC .
$point = strpos($email,".");if($point == ''){$_SESSION['point'] = "Le champs [E-mail] doit contenir un point, veuillez le corriger"; } 

// CHAMPS MDP = CONFIRMATION
if($mdp == $confirmation){}else{ $_SESSION['differance'] 		= 	"Le champs [Mot de passe] n'est pas égal au champs [Confirmation du mot de passe], veuillez le corriger";}



//-----------------------------FIN DE VERIFICATION SPECIAL DES CHAMPS----------------------------->>
		
header('location:error_inscrip.php');
} 
else 
{
mysql_query(" INSERT INTO user (iduser) VALUES ('$iduser') ") 	or (header('location:error_inscrip_user.php'));
mysql_query(" UPDATE user SET email = $email 			WHERE iduser = '$iduser'") 	or (header('location:error_inscrip_email.php'));
mysql_query(" UPDATE user SET portable = $portable	 	WHERE iduser = '$iduser'") or (header('location:error_inscrip_portable.php'));

mysql_query(" UPDATE user SET civilite = $civilite nom = $nom prenom = $prenom jour = $jour mois = $mois annee = $annee numrue = $numrue rue = $rue postal = $postal batiment = $batiment etage = $etage ville = $ville pays = $pays fixe = $fixe mdp = $mdp confirmation = $confirmation avatar = $avatar site = $site WHERE iduser = '$iduser'");

//-----------------------------VERIFICATION DE L'AVATAR----------------------------->>

$fwde = $fw_POST['de'];
$fwa = $fw_POST['a'];
$fwmessage = $fw_POST['message'];

include ('inc_date_heure.php');

$fwdossier = 'upload/';
$fwavatar = basename($fw_FILES['avatar']['name']);
$fwtaille_maxi = 100000;
$fwtaille = filesize($fw_FILES['avatar']['tmp_name']);
$fwextensions = array('.png', '.gif', '.jpg', '.jpeg', '.bmp');
$fwextension = strrchr($fw_FILES['avatar']['name'], '.'); 

if(!in_array($fwextension, $fwextensions))
{
     $fwerreur = '1';
}
if($fwtaille>$fwtaille_maxi)
{
     $fwerreur = '1';
}
if(!isset($fwerreur))
{
     $fwavatar = strtr($fwavatar, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fwavatar = preg_replace('/([^.a-z0-9]+)/i', '-', $fwavatar);
     if(move_uploaded_file($fw_FILES['avatar']['tmp_name'], $fwdossier . $fwavatar))
     {
          header('location:conf_avatar.php');
     }
     else
     {
          header('location:error_avatar.php');
     }
}
else
{
if($fwerreur == "1")
{
header('location:error_avatar.php');
}
}
mysql_query(" UPDATE user SET avatar = '$avatar' WHERE iduser = '$iduser' ");

//------------------------FIN DE LA VERIFICATION DE L'AVATAR------------------------>>
}

include ('inc_deconnexion_mysl.php');

?>

par Cyrano » 25 avr. 2007, 16:16

D'abord il faudrait voir le code de ton formulaire pour vérifier que tu récupères bien les bons index. Ensuite, tu pourrais récupérer les données en leur appliquant un pré-traitement pour supprimer les espaces inutiles en début et en fin de chaine avec trim(), par exemple :
$nom = isset($_POST['nom']) ? trim($_POST['nom']) : "";
Ce que faisant, tu auras au pire une chaine vide qui sera interceptée par tes instructions de validation.

par zaknaou. » 25 avr. 2007, 14:51

Merci

Par contre pour l'erreur de d'affichage pourquoi par exemple :

$prenom affiche le message si vide

Alors que

$codepostal n'affiche pas le message si vide

je ne vois aucune différence... dans la ménière donc été traité les deux vériables...