IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème aec TRIM [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Problème aec TRIM
    J'ai un souci avec TRIM

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $charlist = "-_" ;
    $date = $_POST['date'] ;
    var_dump($date); ;
    $date = trim($date,$charlist) ; // On débarasse la saisie d'éventuels délimiteurs.....
    var_dump($date);
    J'encode dans le champ date: 08-071954

    Les var_dump donnent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string(9) "08-071954" string(9) "08-071954" 
    string(2) "08" string(3) "-07" string(4) "1954"
    Càd que je n"utilise pas le trim comme je devrais mais ne vois pas ma faute !

    Rien dans le log.php

    Merci à ceusssss qui m'aideront à sortir de là....

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Par défaut
    Bonjour,

    regarde du coté de preg_replace peut être

  3. #3
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut TRIM - preg_replace
    Cela me semble complique car le "-" n'est pas le seul caractère que je souhaite ôter.....

    Merci qaund mêrme

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    Tu n'utilises pas trim pour ce qu'il sait faire. Comme dit dans la doc "Supprime les espaces (ou d'autres caractères) en début et fin de chaîne"

    Donc un test cohérent serait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $charlist = "-_" ;
    $date = "-08-071954_";
    $date = trim($date,$charlist) ; 
    var_dump($date);
    Mais si tu veux supprimer les délimiteurs partout dans la chaine, tu peux utiliser une fonction de remplacement pour cibler certains caractères, exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $date = "-08-071954_";
     
    $cible = array('-','_');
    $remplacement = array('','');
    $date = str_replace($cible,$remplacement,$date);
    var_dump($date);
    Mais comme l'a signaler syl2095, preg_replace serait sans doute le plus intéressant dans ce cas de figure parce que tu pourrais par exemple ne garder que ce qui est constitué de chiffres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $date = "-08-0719ad54_";
    $date = preg_replace('#[^0-9]#', '', $date);
    var_dump($date);

  5. #5
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Trim Checkdate.....
    Je continue sans délimiteur car pas de solution maintenant.
    Après avoir ôter ceux-ci, je dois valider la date:

    Je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var_dump(checkdate(07 , 08  , 1954));
    Hardcoded dans ma source et j'ai:

    Je pense que je vais breaké un petit peu... mais pas sur car quand j'ai qlqchose en tête....

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Un petit piège de PHP : 08 ne vaut pas 8.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Trim Checkdate.....
    Merci pour ta réponse, je nettoye convenablement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string(10) "08-07-1954" string(8) "08071954" 
    string(2) "08" string(2) "07" string(4) "1954"
    mais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var_dump(checkdate(07 , 08  , 1954));
    $rc = checkdate($this->mm , $this->dd  , $this->yy) ;
    var_dump($rc) ;
    me renvoie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool(false) bool(false)
    Suis un poil + loin.... mais je peux mieux faire, non ?

  8. #8
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Checkdate: 08 => 8 en PHP
    Merci Sabotage....

    Et (je vais chercher) je fais quoi maintenant....
    Remplacer les blancs par "0" uniquement quand la zone à une longueur == 1 ??

    Ou qlqchose du genre ?

    Merci

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    Tu fais des erreurs d'étourderies

    Soit tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(checkdate(7 , 8  , 1954));
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(checkdate("07" , "08"  , "1954"));
    Au fait mon précédent message (notamment la dernière partie) ne t'a pas aidé ?

  10. #10
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Checkdate: 08 => 8 en PHP
    Etourderie peut être, fatigué sans doute....

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    	function validate()
    	{	$date = preg_replace('#[^0-9]#', '', $_POST['date']) ; // On débarasse la saisie d'éventuels délimiteurs.....
    		switch(strlen($date))					 // Longueur de la saisie 
    		{	case 6 : 	$format = '%2s%2s%2s' ; // Format JJMMYY
    						break ;
    					
    			case 7 : 	$format = '%2s%3s%2s' ; // Format JJMMMYY
    						break ;
    					
    			case 8 :    $format = '%2s%2s%4s' ;// Format JJMMYYYY
    						break ;
    					
    			case 9 :    $format = '%2s%3s%4s' ;// Format JJMMMYYYY
    						break ;
    						
    		}
    		list($this->dd, $this->mon, $this->yy) = sscanf($date, $format) ;
    		var_dump($this->dd) ;
    		var_dump($this->mon) ;
    		var_dump($this->yy) ;
    
    		if ( is_string($this->mon) )
    			$this->mm  = array_search($this->mon, $this->month); 
    		else
    			if ( is_int($this->mon) )
    				$this->mm = $this->mon ;
    			else
    				throw new Exception("class[DATE] - Bad char in [".$date."] !") 	;
    
    		 
    		return( checkdate($this->mm , $this->dd  , $this->yy) ? OK : DATE) ;  
    	}
    Dans celui-ci, je ne vois pas comment m'assurer que j'ai 7 ou 07 ou "07" ....

    Merci !

  11. #11
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Checkdate: 08 => 8 en PHP
    Voici la solution que j'ai trouvée, il y a peut être mieux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    	function fill($str,$len)
    	{	for ($i = 0 ; (strlen($str) < $len) ; $i++)
    			$str = "0" . $str ;
    		var_dump($str) ;
    		return($str) ;
    	}
    	
    /**
    *	validate
    *	========
    */
    		function validate()
    	{	$date = preg_replace('#[^0-9]#', '', $_POST['date']) ; // On débarasse la saisie d'éventuels délimiteurs.....
    		switch(strlen($date))					 // Longueur de la saisie 
    		{	case 6 : 	$format = '%2s%2s%2s' ; // Format JJMMYY
    						break ;
    					
    			case 7 : 	$format = '%2s%3s%2s' ; // Format JJMMMYY
    						break ;
    					
    			case 8 :    $format = '%2s%2s%4s' ;// Format JJMMYYYY
    						break ;
    					
    			case 9 :    $format = '%2s%3s%4s' ;// Format JJMMMYYYY
    						break ;
    						
    		}
    		list($this->dd, $this->mon, $this->yy) = sscanf($date, $format) ;
    		var_dump($this->dd) ;
    		var_dump($this->mon) ;
    		var_dump($this->yy) ;
    /*
    		if ( is_string($this->mon) )
    			$this->mm  = array_search($this->mon, $this->month); 
    		else
    			if ( is_int($this->mon) )
    				$this->mm = $this->mon ;
    			else
    				throw new Exception("class[DATE] - Bad char in [".$date."] !") 	;
    */		
    $this->mm = $this->mon ;
    		return( checkdate($this->fill($this->mm,2) , $this->fill($this->dd,2)  , $this->fill($this->yy,4) ) ? OK : DATE) ;  
    	}
    Et maintenant ma date est validée correctement mais je dois encore faire des ajustements puisque j'ai du commmenter le code dans le cas ou le mois est en caractères, je n'ai qu'à déplacer ce code.

    Merci à tous.

  12. #12
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Checkdate: 08 => 8 en PHP
    Cela fonctionne mais pas dans le cas ou on code 08-jul-1954 .....

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /**
    *	fill
    *	====
    */
     
    	function fill($str,$len)
    	{	for ($i = 0 ; (strlen($str) < $len) ; $i++)
    			$str = "0" . $str ;
    		var_dump($str) ;
    		return($str) ;
    	}
     
    /**
    *	validate
    *	========
    */
    	function validate()
    	{	var_dump($date = $_POST['date']) ;
    		$date = preg_replace('#[^0-9]#', '', $date) ; // On débarasse la saisie d'éventuels délimiteurs.....
    		var_dump($date) ;
    		switch(strlen($date))					 // Longueur de la saisie 
    		{	case 6 : 	$format = '%2s%2s%2s' ; // Format JJMMYY
    						list($this->dd, $this->mm, $this->yy) = sscanf($date, $format) ;
    						break ;
     
    			case 7 : 	$format = '%2s%3s%2s' ; // Format JJMMMYY
    						list($this->dd, $this->mon, $this->yy) = sscanf($date, $format) ;
    						$this->mm  = array_search($this->mon, $this->month); 
    						break ;
     
    			case 8 :    $format = '%2s%2s%4s' ;// Format JJMMYYYY
    						list($this->dd, $this->mn, $this->yy) = sscanf($date, $format) ;
    						break ;
     
    			case 9 :    $format = '%2s%3s%4s' ;// Format JJMMMYYYY
    						list($this->dd, $this->mon, $this->yy) = sscanf($date, $format) ;
    						$this->mm  = array_search($this->mon, $this->month); 
    						break ;
     
    		}
    		var_dump($this->dd) ;
    		var_dump($this->mn) ;
    		var_dump($this->yy) ;
    		return( checkdate($this->fill($this->mm,2) , $this->fill($this->dd,2)  , $this->fill($this->yy,4) ) ? OK : DATE) ;  
    	}
    avec le tableau dans le cas d'un mois en caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private   $month   = array	(	"JAN"   =>  "01" , 	"FEV"   =>  "02" ,	"MAR"   =>  "03" ,	"AVR"   =>  "04" ,
    									"MAI"   =>  "05" ,	"JUI"   =>  "06" ,	"JUL"   =>  "07" ,	"AOU"	=>  "08" ,
    									"SEP" 	=>  "09" ,	"OCT"   =>  "10" ,	"NOV"  	=>  "11" ,	"DEC"  	=>  "12" 
    								) ;
    Et j'obtiens à l'écran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string(11) "08-jul-1954" string(6) "081954" string(2) "08" NULL string(2) "54" string(2) "00" string(2) "08" string(4) "0054"
    Ce qui est de toute évidence faux !
    Dans ce cas (mois en caractères) le preg_replace ne convient pas !!!

    Merci à tous, cela fait déjà bcp pour ajd'hui....

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    De toutes façons c'est quasiment impossible de prendre en compte tous les formats que les visiteurs peuvent envoyer (sans compter leurs erreurs).

    Le plus simple est d'indiquer le format à respecter au dessus du champ de saisie, ou pour éviter encore plus les erreurs, faire trois champs distincts pour les jours, mois, années avec un select au moins pour les jours et les mois (c'est la méthode utilisée pour valider la date d'une carte bancaire pour un paiement en ligne par exemple).

  14. #14
    Membre éclairé Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Par défaut Checkdate: 08 => 8 en PHP
    Oui, je voulais effectivement faire 3 champs pour n'avoir qu'un seul format mais comme je ne veux pas de Jscript dans mon site, je ne pouvais pas faire des autoskip de champ à champ et cela m'a dissuadé dans un 1er temps de prendre cette solution.
    Mais je crois que je vais revenir à cette alternative.

    Merci et bonne fin de WE

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Trim() Accents
    Par menakikou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2009, 09h55
  2. Problème de linkage aec Ogg
    Par Kromagg dans le forum API graphiques
    Réponses: 2
    Dernier message: 03/02/2009, 21h13
  3. Problème avec la Fonction TRIM
    Par John81 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/01/2009, 11h29
  4. Réponses: 2
    Dernier message: 05/11/2007, 11h41
  5. Problème avec trim
    Par sqlnet dans le forum Oracle
    Réponses: 3
    Dernier message: 09/11/2005, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo