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)