logo

NPDS : Gestion de contenu et de communauté


Content & Community Management System (CCMS) robuste, sécurisé, complet, performant, parlant vraiment français, libre (Open-Source) et gratuit.
19 visiteur(s) et 0 membre(s) en ligne.
Activité du Site

Pages vues depuis 25/05/2001 : 109 439 935

  • Nb. de membres 8 696
  • Nb. d'articles 1 695
  • Nb. de forums 26
  • Nb. de sujets 8
  • Nb. de critiques 92

Top 10  Statistiques

Index du forum »»  Le coin des codeurs »» [Résolu] - Prob de class, help me

[Résolu] - Prob de class, help me#15333

5Contributeur(s)
arnodu59snipezyegfryeddeveloppeurhexagone
3 Modérateur(s)
developpeurjpbJireck
arnodu59 arnodu59icon_post
Hello all :)

Voilà, je suis dans le dev d'un site pour mon association, mais j'ai un p'tit prob :-D
J'ai un formulaire de contact qui vérifie l'adresse email, mais certaine vérification plante :# avec l'erreur :
Fatal error: Call to a member function on a non-object in /home/servlan/www/mainfile.php on line 52

Voici un bout de code :


  1. if (strrpos($email,' ') > 0) { $erreur->email("espace", ""); }



  2. if (strlen($email) < 6) { $erreur->email("court", ""); }



  3. if (strlen($email) > 255) { $erreur->email("long", ""); }



  4. if (!ereg("@", $email)) { $erreur->email("arobase", ""); }



  5. if (preg_match_all("/([^a-zA-Z0-9_\@\.\-])/i", $email, $trouve)) { $erreur->email("interdit", implode(", ", $trouve[0])); }



  6. if (!preg_match("/^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$/i", $email)) { $erreur->email("incorrect", ""); }



  7. list($compte, $domaine)=split("@", $email, 2);



  8. if (!checkdnsrr($domaine, "MX")) { $erreur->email("incorrect_domaine", "$domaine");}




La ligne 2 et 4 sont les lignes qui pose problème...
Voici donc la Class :



<?
class Erreur
{
function
email($type_erreur, $autre) {
switch (
$type_erreur) {
case
"espace":
tableau(
"L'email ne doit pas contenir d'espace", FALSE);
exit;
case
"court":
tableau(
"Adresse email trop courte", FALSE);
exit;
case
"long":
tableau(
"Adresse email trop longue", FALSE);
exit;
case
"arobase":
tableau(
"L'adresse email n'a pas d'arobase (@)", FALSE);
exit;
case
"interdit":
tableau(
"Caractère(s) interdit dans l'email ($autre)", FALSE);
exit;
case
"incorrect":
tableau(
"Adresse email incorrect", FALSE);
exit;
case
"incorrect_domaine":
tableau(
"Ce domaine ($autre) n'accepte pas les emails", FALSE);
exit;
}
}
}




Et là, j'avoue que je séche :-( Si quelqu'un c'est d'ou peux venir le problème... Thanks you :-D

Message édité par : arnodu59

snipe snipeicon_post
question con
tu a bien avant d apeler t $erreur->email mit une ligne qui fait :
$erreur = new Erreur();

parceque sinon c normal que sa merde :)
arnodu59 arnodu59icon_post
Je te rassure, oui, elle est mise :-D
zyegfryed zyegfryedicon_post
Elle sort d'où la fonction "tableau" ?
developpeur developpeuricon_post
chnage $erreur par $this peut-être
zyegfryed zyegfryedicon_post
Dev, $this fait référence à l'instance de l'objet. Il est donc utilisé dans la définition de la classe, pas à l'extérieur ;-)
arnodu59 arnodu59icon_post
Citation : zyegfryed
Elle sort d'où la fonction "tableau" ?


La fonction tableau ce trouve dans le fichier mainfile.php


<?
// Tableau pour la gestion d'erreur
function tableau($message$sql=false) {
  unset(
$conf_edito);
  
$conf_edito 0;
  
$error 1;
  if (
$sql) {
    !include!(
"header.php");
  
}
  $mes = 
"<center><img src=\"images/stop.gif\" /><br /><br />";
  $mes .= 
"<font color=\"#FF0000\">$message</font>";
  if ($sql) 
{
    $mes .= 
"<br /><br />.: ".mysql_error()." :.";    
  
} else {
    $mes .= 
"<br /><br /><a href=\"!javascript!:history.back()\">Retour</a>";
  
}
  $mes .= 
"</center>";
  echo $mes;
  !include!(
"footer.php");
}
?>




Chose que je ne comprend pas...
La ligne :


<?
if (strrpos($email,' ') > 0) { $erreur->email("espace", ""); }
?>



Fonctionne très bien, alors que :



<?
if (strlen($email) < 6) { $erreur->email("court"""); }
?>



Ne fonctionne pas :-? :-o

Message édité par : arnodu59

arnodu59 arnodu59icon_post
XDR !!!

La vieille erreur sur laquel on perd plein de temps :-D

un global $erreur;
a résolu mon problème :-P
zyegfryed zyegfryedicon_post
Pas super propre tout ça... :|
arnodu59 arnodu59icon_post
Comment ça pas super propre ?



<?
// Vérifie la validité d'un email
function verifie_email($email){
  global 
$erreur;
  if (
strrpos($email,' ') > 0) { $erreur->email("espace", ""); }
  if (strlen($email) < 6) { $erreur->email("court", ""); }
  if (strlen($email) > 255) { $erreur->email("long", ""); }
  if (!ereg("@", $email)) { $erreur->email("arobase", ""); }
  if (preg_match_all("/([^a-zA-Z0-9_
\@\.\-])/i", $email, $trouve))
  {
    $erreur->email("interdit", implode(", ", $trouve[0]));  
  }
  if (!preg_match("/^([a-z0-9_]|
\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$/i", $email))
  {
    $erreur->email("incorrect", "");
  }
  list($compte, $domaine)=split("@", $email, 2);
  if (!checkdnsrr($domaine, "MX")){
    $erreur->email("incorrect_domaine", "$domaine");
  }
  return TRUE;
}
?>




Ca me parais propre... Non :-?
zyegfryed zyegfryedicon_post
C'est surtout que je suis très chipotteur sur le code (avec le mien en premier).
Utiliser une variable globale pour garder une instance de classe n'est pas des plus propre, tout comme créer une classe qui fait appel à une fonction global dans tout son code...
developpeur developpeuricon_post
vraie .. ou créer un instance en global plsutot
arnodu59 arnodu59icon_post
Bon, ben on vas demander comment le rendre propre alors :-P

Citation : zyegfryed
Utiliser une variable globale pour garder une instance de classe n'est pas des plus propre


Là, je ne voie pas de solution :# A partir du moment ou c'est dans une fonction, comment puis-je faire ?

Citation : zyegfryed
tout comme créer une classe qui fait appel à une fonction global dans tout son code...


Là, ok, l'affaire est réglé :=!

Merci d'avance ;-)
zyegfryed zyegfryedicon_post
Citation : arnodu59

Bon, ben on vas demander comment le rendre propre alors :-P

Citation : zyegfryed
Utiliser une variable globale pour garder une instance de classe n'est pas des plus propre


Je crois qu'en PHP 4.* il n'est pas possible d'utiliser les variables statiques (mot clé static), cela à du apparaître avec la 5. Si je me trompe, utilises une variable statique donc.
Sinon, un passage de variable par paramètre d'une fonction est tout aussi efficace dans 99% des cas ;-)
developpeur developpeuricon_post
si les static existe en PHP 4 , NPDS s'en sert même (meta-lang par exemple)
hexagone hexagoneicon_post
bonjour bonjour,

ce nest pas tres utile, mais on ne sait jamais, ca peut sdervir a kk1...
alors voici une petite variante pour faire plus propre...(enfin jespere)
sauf erreur de ma part, ca devrait fonctionner pas trop mal..





<? 
//fichier lib/erreur.class.php

class Erreur 


    var 
$tab;    //stocke les messages

    //constructeur de classe (il n'y a pas de destructeur en php)
    
function Erreur() 
    {

        
$this->$tab = array();
        
        
//??a koi servent ces 2 variables??
        
global $conf_edito$conf_edito 0
        global 
$error$error 1

    }


    function 
email($type_erreur$autre
    { 
    
        
//kkes modifs:
        //il est preferable dans un switch de gerer la sortie par des break.
        //ca permet de faire d'autres action si necessaire (netoyage par exemple)
        
        //ca permet aussi de faire renvoyer un code a la fonction.
        //il est preferable de faire retourner un code a toute fonction (surtout dans une classe)

        
switch ($type_erreur
        {

            case 
"espace":
                $this
->$tab[] = $this->tableau("L'email ne doit pas contenir d'espace", FALSE);
                break;
            
            case 
"court":
                $this
->$tab[] = $this->tableau("Adresse email trop courte", FALSE);
                break;
            
            case 
"long":
                $this
->$tab[] = $this->tableau("Adresse email trop longue", FALSE);
                break;
            
            case 
"arobase":
                $this
->$tab[] = $this->tableau("L'adresse email n'a pas d'arobase (@)", FALSE);
                break;
            
            case 
"interdit":
                $this
->$tab[] = $this->tableau("Caractère(s) interdit dans l'email ($autre)", FALSE);
                break;
            
            case 
"incorrect":
                $this
->$tab[] = $this->tableau("Adresse email incorrect", FALSE);
                break;
            
            case 
"incorrect_domaine":
                $this
->$tab[] = $this->tableau("Ce domaine ($autre) n'accepte pas les emails", FALSE);
                break;

            //toujours utile de gerer les cas imprevus
            default:
                $this
->$tab[] = $this->tableau("Erreur inconnue", FALSE);
                return(FALSE);
        
}

        return(TRUE);
    
} 


    // Tableau pour la gestion d'erreur 
    function tableau($message, $sql=false)
    
{

        $mes .= 
"<br /><br /><font color=\"#FF0000\">$message</font>";
        if ($sql) 
{ 
            $mes .= 
"<br /><br />.: ".mysql_error()." :.";
            // si c'est une erreur mysql, on n'attend pas la suite
            $this
->affiche_tableau() ;
            exit(0);
            
        
}

        return $mes;

    
}
    
    // affichage du Tableau pour la gestion d'erreur 
    function affiche_tableau()
    
{
        //on verifie qu'on a des erreurs avant d'afficher & quitter
        //on peut supprimer le $this devant $tab en cas de comportement etrange sur le comptage du nombre d'elements.
        if ($count($this
->$tab)>0)
        
{
            !include!(
"header.php");

            echo 
"<center><img src=\"images/stop.gif\" />";
            foreach($this
->$tab as $elt) { echo $elt; }
            echo 
"<br /><br /><a href=\"!javascript!:history.back()\">Retour</a>";
            echo 
"</center>";

            !include!(
"footer.php");

            exit(1);
        
}

        return(TRUE)
    
}

}

?>





et la ptite fonction qui va bien.....




<? 
// Vérifie la validité d'un email
function verifie_email($email){ 

    
//formulaire de contact => on peut envisager un chargement ponctuel de la classe
    //=> a eviter pour des travaux plus frequent/lourd.

    
if (!class_exists('Erreur')) {
        !include!(
'lib/erreur.class.php');
    }
    
    //static      //creation de lelement une seule fois lors du premier chargement de verifie_email
                //on aurait pu metre un static, mais pour quoi faire?
        $erreur = new Erreur();


    if (strrpos($email,
' ') > 0) { $erreur->email("espace", ""); }
    if (strlen($email) < 6) { $erreur->email("court", ""); }
    if (strlen($email) > 255) { $erreur->email("long", ""); }
    if (!ereg("@", $email)) { $erreur->email("arobase", ""); }
    if (preg_match_all("/([^a-zA-Z0-9_
\@\.\-])/i", $email, $trouve))
    {
        $erreur->email("interdit", implode(", ", $trouve[0]));   
    }
    if (!preg_match("/^([a-z0-9_]|
\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$/i", $email))
    {
        $erreur->email("incorrect", "");
    }
    list($compte, $domaine)=split("@", $email, 2);
    if (!checkdnsrr($domaine, "MX"))
    {
        $erreur->email("incorrect_domaine", "$domaine");
    }
    
    //on peut afficher les erreurs,
    //s
'il y en a, la fonction termine le script par un exit.
    $erreur->affiche_tableau();
    
    //sinon on renvoie true
    return(TRUE);
}
?>




zyegfryed zyegfryedicon_post
Juste comme ça au passage, il existe un gestionnaire d'erreur intégré à PHP ;-)
Sinon, c'est un peu plus propre oui, mais une déclaration/initialisation de variables globales dans un constructeur, cela ne se fait pas...
Quel est le but de la classe au fait ? Un gestionnaire d'erreur pour un mail ?
hexagone hexagoneicon_post
Citation : zyegfryed 

Juste comme ça au passage, il existe un gestionnaire d'erreur intégré à PHP ;-)

oui, mais tout le monde ne le sait pas.. :-)

Citation : zyegfryed
une déclaration/initialisation de variables globales dans un constructeur, cela ne se fait pas...


=>ca doit etre pour ca que jai mis //??


        //??a koi servent ces 2 variables??
        global $conf_edito; $conf_edito = 0;  
        global $error; $error = 1;  



Citation : zyegfryed
Quel est le but de la classe au fait ? Un gestionnaire d'erreur pour un mail ? 

excellente question...

a+

zyegfryed zyegfryedicon_post
Sinon, PEAR offre aussi un gestionnaire d'erreur et un autre de logs. Donc selon ce qu'il y a à faire, autant ne pas ré-inventer la roue...
arnodu59 arnodu59icon_post
Citation : zyegfryed
Sinon, c'est un peu plus propre oui, mais une déclaration/initialisation de variables globales dans un constructeur, cela ne se fait pas...

Je n'ai pas mis de variables globales dans ma class.....

Citation : zyegfryed
Quel est le but de la classe au fait ? Un gestionnaire d'erreur pour un mail ?


Gestionnaire d'erreur pour la connexion utilisateur, la connexion au serveur SQL, les inscriptions, le forum etc...

En tout cas, merci à vous tous pour vos commentaire ;)