Page 1 sur 1

Problème Envoi Mail Inscription

Posté : 04 févr. 2011, 17:53
par TRUNCKS
Bonjour,

J'ai suivi un petit tuto pour pouvoir avoir une confirmation mail lors d'une inscription mais je me retrouve avec un message d'erreur:

Fatal error: Call to a member function on a non-object in /homez.221/creationbd/www/adduser.php3 on line 77


Voici mon code, je ne trouve pas mon erreur:

Code : Tout sélectionner

<?php require("conf.php3"); switch($action) { /*-----------------------------------------------------------------*/ /* AJOUT DANS MySQL */ /*-----------------------------------------------------------------*/ case "add"; // CONNEXION A LA BASE DE DONNEE $db_link = @mysql_connect($sql_serveur,$sql_user,$sql_passwd); if(!$db_link) {echo "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>Vérifiez les paramètres du fichier conf.php3"; exit;} // TEST SUR LES VALEURS SAISIES if($pseudo_membre==""){echo "Vous devez choisir un pseudo<br><br><a href=\"javascript:window.history.back()\">Retour</a>";exit;} if($passe_membre==""){echo "Vous devez choisir un mot de passe<br><br><a href=\"javascript:window.history.back()\">Retour</a>";exit;} // CHAMPS SUPLEMENTAIRES, inspirez-vous des lignes suivantes. Pour qu'un champs soit facultatif, omettez la ligne. //if($email==""){echo "Vous n'avez pas saisi votre email<br><br><a href=\"javascript:window.history.back()\">Retour</a>";exit;} //if($ville==""){echo "Vous n'avez pas saisi la ville<br><br><a href=\"javascript:window.history.back()\">Retour</a>";exit;} // ON VERIFIE SI CE PSEUDO EXISTE DEJA $requete=mysql_db_query($sql_bdd,"select * from membre where pseudo=\"$pseudo_membre\"",$db_link) or die(mysql_error()); $num=mysql_num_rows($requete); if($num!=0) { echo "Ce pseudo existe déjà, veuillez en choisir un autre<br><br><a href=\"javascript:window.history.back()\">Retour</a>"; } else { // CREATION D'UN IDENTIFIANT ALEATOIRE $taille = 20; $lettres = "abcdefghijklmnopqrstuvwxyz0123456789"; srand(time()); for ($i=0;$i<$taille;$i++) { $id.=substr($lettres,(rand()%(strlen($lettres))),1); } // ON RECHERCHE L'ID MAXIMUM DE LA TABLE $requete=mysql_db_query($sql_bdd,"select max(id_membre) from membre",$db_link) or die(mysql_error()); $idmax=mysql_result($requete,0,"max(id_membre)"); // INSERTION DANS LA TABLE $idnew=$idmax+1; $requete=mysql_db_query($sql_bdd,"insert into membre values ($idnew,\"$id\",\"$pseudo_membre\",\"$passe_membre\",\"$mail\")",$db_link) or die(mysql_error()); // CHAMPS SUPLEMENTAIRES, complétez la requête précédente en ajoutant les variables et en respectant l'ordre des colonnes de la table. Exemple : // insert into membre values ($idnew,\"$id\",\"$pseudo_membre\",\"$passe_membre\",\"$email\",\"$ville\") // Récupération des variables nécessaires au mail de confirmation $email = $_POST['mail']; $login = $_POST['pseudo']; // Génération aléatoire d'une clé $cle = md5(microtime(TRUE)*100000); // Insertion de la clé dans la base de données (à adapter en INSERT si besoin) $stmt = $dbh->prepare("UPDATE membre SET cle=:cle WHERE pseudo like :pseudo"); $stmt->bindParam(':cle', $cle); $stmt->bindParam(':pseudo', $login); $stmt->execute(); // Préparation du mail contenant le lien d'activation $destinataire = $email; $sujet = "Activer votre compte" ; $entete = "From: [email protected]" ; // Le lien d'activation est composé du login(log) et de la clé(cle) $message = 'Bienvenue sur VotreSite, Pour activer votre compte, veuillez cliquer sur le lien ci dessous ou copier/coller dans votre navigateur internet. http://creationsite.com/validation.php?log='.urlencode($login).'&cle='.urlencode($cle).' --------------- Ceci est un mail automatique, Merci de ne pas y répondre.'; mail($destinataire, $sujet, $message, $entete) ; // Envoi du mail } // DECONNEXION MYSQL mysql_close($db_link); break; /*-----------------------------------------------------------------*/ /* AFFICHAGE DU FORMULAIRE */ /*-----------------------------------------------------------------*/ default; echo " <h2>Nouveau membre</h2> <form action=\"adduser.php3\" method=\"post\"> <input type=\"hidden\" name=\"action\" value=\"add\"> Chosissez un pseudo<br><input type=\"text\" name=\"pseudo_membre\"><br> Chosissez un mot de passe<br><input type=\"password\" name=\"passe_membre\"><br> <! -- CHAMPS SUPLEMENTAIRES, décommentez les 2 lignes suivantes --> Votre email<br><input type=\"text\" name=\"mail\"><br> <br> <!-- Ville<br><input type=\"text\" name=\"ville\"><br> --> <input type=\"submit\" value=\"Envoyer\"> </form> <font face=\"Verdana\" size=\"2\"><a href=\"index.htm\">Se connecter</a></font>"; break; } ?>

Re: Problème Envoi Mail Inscription

Posté : 04 févr. 2011, 18:08
par xTG
$stmt = $dbh->prepare("UPDATE membre SET cle=:cle WHERE pseudo like :pseudo"); 
L'objet $dbh n'a pas été instancié dans ton code.

De plus pourquoi passer du coq à l'âne ? Tu utilises du mysql_ et d'un coup du passes en PDO. ^^'

Re: Problème Envoi Mail Inscription

Posté : 04 févr. 2011, 18:13
par TRUNCKS
En fait l'inscription et l'envoie de mail sont deux tutos différents :(
Cela pose un problème particulier de cette manière ?

Comment remédier pour la déclaration de l'objet ?

Re: Problème Envoi Mail Inscription

Posté : 04 févr. 2011, 18:21
par xTG
// Insertion de la clé dans la base de données (à adapter en INSERT si besoin)
$stmt = $dbh->prepare("UPDATE membre SET cle=:cle WHERE pseudo like :pseudo");
$stmt->bindParam(':cle', $cle);
$stmt->bindParam(':pseudo', $login);
$stmt->execute(); 
En remplaçant tout le bout de code par un code mysql_ :
// Insertion de la clé dans la base de données (à adapter en INSERT si besoin)
mysql_query("UPDATE membre SET cle='$cle' WHERE pseudo like '$login'");

Re: Problème Envoi Mail Inscription

Posté : 04 févr. 2011, 18:58
par TRUNCKS
Impeccable, merci beaucoup.

Si c'est bien compris ( désolé, je débute ), ce n'est pas le même langage et ils ne sont pas compatibles entre eux ?

Du coup j'ai le même problème sur ma page de validation, je dois le formuler comment ?


$stmt = $dbh->prepare("UPDATE membre SET actif = 1 WHERE pseudo like :pseudo ");
$stmt->bindParam(':pseudo', $login);
$stmt->execute();


Comme cela ?

mysql_query("UPDATE membre SET actif='$actif' WHERE pseudo like '$login'");

Re: Problème Envoi Mail Inscription

Posté : 04 févr. 2011, 19:05
par TRUNCKS
Arf, et j'ai aussi ces lignes là :(


$stmt = $dbh->prepare("SELECT cle,actif FROM membre WHERE pseudo like :pseudo ");
if($stmt->execute(array(':pseudo' => $login)) && $row = $stmt->fetch())
{
$clebdd = $row['cle']; // Récupération de la clé
$actif = $row['actif']; // $actif contiendra alors 0 ou 1


Voilà le formulaire de validation au cas ou:

Code : Tout sélectionner

<?php require("conf.php3");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Document sans titre</title> </head> <body> <?php // Récupération des variables nécessaires à l'activation $login = $_GET['log']; $cle = $_GET['cle']; // Récupération de la clé correspondant au $login dans la base de données $stmt = $dbh->prepare("SELECT cle,actif FROM membre WHERE pseudo like :pseudo "); if($stmt->execute(array(':pseudo' => $login)) && $row = $stmt->fetch()) { $clebdd = $row['cle']; // Récupération de la clé $actif = $row['actif']; // $actif contiendra alors 0 ou 1 } // On teste la valeur de la variable $actif récupéré dans la BDD if($actif == '1') // Si le compte est déjà actif on prévient { echo "Votre compte est déjà actif !"; } else // Si ce n'est pas le cas on passe aux comparaisons { if($cle == $clebdd) // On compare nos deux clés { // Si elles correspondent on active le compte ! echo "Votre compte a bien été activé !"; // La requête qui va passer notre champ actif de 0 à 1 mysql_query("UPDATE membre SET actif='$actif' WHERE pseudo like '$login'"); } else // Si les deux clés sont différentes on provoque une erreur... { echo "Erreur ! Votre compte ne peut être activé..."; } } ?> </body> </html>

Re: Problème Envoi Mail Inscription

Posté : 05 févr. 2011, 17:20
par TRUNCKS
En fait, je viens de remarquer, la clé de ne s'inscrit à aucun moment dans la base de donnée.

Il doit y avoir une erreur dans la requête SQL.

J'ai essayé cela mais sans succè:


// Génération aléatoire d'une clé
$cle = md5(microtime(TRUE)*100000);


// Insertion de la clé dans la base de données (à adapter en INSERT si besoin)
mysql_query("INSERT INTO membre VALUES cle='$cle' WHERE pseudo like '$login'");