Multidesk.be » Forums » PHP » Registratiescript met activatiemail

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door BoeMan op maandag 30 december 2013 om 15:31:11.
BoeMan heeft nog geen avatar toegevoegd
Multiviteit: 154
Beste,

ik ben een registratiescript aan het schrijven waarbij na het registreren een mail met activatielink verzonden wordt. Het registreren zelf lukte tot ik er de mail functie aan toevoegde.

Error:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/gijsvdq77/domains/fanatictrainer.com/public_html/classes/registration.php:147)

Dit is de code van registration.php

PHP
  1.  
  2. <?php
  3. class Registration
  4. {
  5.         //defineer de variabelen voor registratie.
  6.         private $db_connection = null;
  7.         private $lang = array();
  8.         public $registration_sucess = false;
  9.         public $verification_success = false;
  10.         public $errors = array();
  11.         public $messages = array();
  12.        
  13.         //Constructor, wordt aangeroepen als er een nieuw registratie object wordt aangemaakt.
  14.         //in register.php
  15.         public function __construct()
  16.         {
  17.                 //start nieuwe sessie
  18.                 session_start();
  19.                 //geef dit object de juist taal
  20.                 $this->lang = & $GLOBALS['phplogin_lang'];
  21.                
  22.                 //bij een post request roepen we de functie registerNewUser()
  23.                 //gebruik isset om te kijken of een variable niet null is
  24.                 if(isset($_POST["register"])){
  25.                         $this->registerNewUser($_POST['user_name'], $_POST['user_email'], $_POST['user_password_new'], $_POST['user_password_repeat']);
  26.                 //is het een GET request, roep verifyNewUser() op
  27.         }
  28.  
  29.         //kijk of de databank open is, en open als dit niet het geval is.
  30.         private function databaseConnection(){
  31.                 if($this->db_connection != null){
  32.                         return true;   
  33.                 }else{
  34.                         try{
  35.                                 $this->db_connection = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME, DB_USER, DB_PASS)
  36.                                 return true;
  37.                         }catch (PDOException $exception){
  38.                                 $this->errors[] = $this->lang['Database error'];
  39.                                 //print $exception->getMessage() . "<br/>";
  40.                                 return false;
  41.                         }
  42.                 }       
  43.         }
  44.        
  45.         private function registerNewUser($user_name, $user_email, $user_pass, $user_pass_repeat)
  46.         {
  47.                 //Trim overmatige spaties
  48.                 $user_name = trim($user_name);
  49.                 $user_email = trim($user_email);
  50.                 //username controle
  51.                 if(empty($user_name)){
  52.                         $this->errors[] = $this->lang['Empty Username'];
  53.                 } elseif(strlen($user_name) < 5 || strlen($user_name) > 50){
  54.                         $this->errors[] = $this->lang['Username bad length'];
  55.                 } elseif (!preg_match('/^[a-z\d]{2,64}$/i', $user_name)) {
  56.             $this->errors[] = $this->lang['Invalid username'];
  57.                 //password controle
  58.                 }elseif (empty($user_pass)){
  59.                         $this->errors[] = $this->lang['Empty Password'];
  60.                 }elseif (strlen($user_pass)<6){
  61.                         $this->errors[] = $this->lang['Password too short'];
  62.                 }elseif ($user_pass != $user_pass_repeat){
  63.                         $this->errors[] = $this->lang['Bad confirm password'];
  64.                 //email controle
  65.                 }elseif (empty($user_email)){
  66.                         $this->errors[] = $this->lang['Empty Email'];
  67.                 }elseif (strlen($user_email)>50){
  68.                         $this->errors[] = $this->lang['Email too long'];
  69.                 }elseif (!filter_var($user_email, FILTER_VALIDATE_EMAIL)){
  70.                         $this->errors[] = $this->lang['Invalid email'];
  71.                 } else if ($this->databaseConnection()){
  72.                 //controlleer of email of username al bestaat
  73.                         $check_username_query = $this->db_connection->prepare('SELECT user_name, user_email FROM users WHERE user_name=:user_name OR user_email=:user_email');
  74.                         $check_username_query->bindValue(':user_name', $user_name, PDO::PARAM_STR);
  75.                         $check_username_query->bindValue(':user_email', $user_email, PDO::PARAM_STR);
  76.                         $check_username_query->execute();
  77.                         $results = $check_username_query->fetchAll();
  78.                        
  79.                         if(count($results) > 0){
  80.                                 for($i = 0; $i < count($results); $i++){
  81.                                         $this->errors[] = ($results[$i]['user_name'] == $user_name) ? $this->lang['Username exist'] : $this->lang['Email exist'];       
  82.                                 }
  83.                         }else{
  84.                                 //maak een unieke salt voor elke password hash die er gemaakt wordt.
  85.                                 $password_salt = '$2y$'.CRYPT_BLOWFISH_FACTOR.'$' . substr(md5(uniqid(rand(), true)), 0,22);
  86.                                 //hash het password met de salt
  87.                                 $password_hash = crypt($user_pass, $password_salt);                    
  88.                                 //password unhashen
  89.                                 //crypt($ingegeven_password, $user_pass) == $user_pass;
  90.                                
  91.                                 //Maak unieke activatielink voor de email (40 char string)
  92.                                 $user_act_hash = sha1(uniqid(mt_rand(), true));
  93.                        
  94.                                 $insert_user_query = $this->db_connection->prepare('INSERT INTO users(user_name, user_password_hash, user_email, user_activation_hash, user_registration_datetime, user_registration_ip) VALUES (:user_name, :user_password_hash, :user_email, :user_activation_hash, now(), :user_registration_ip)');
  95.                        
  96.                                 $insert_user_query->bindValue(':user_name', $user_name, PDO::PARAM_STR);
  97.                                 $insert_user_query->bindValue(':user_password_hash', $password_hash, PDO::PARAM_STR);
  98.                                 $insert_user_query->bindValue(':user_email', $user_email, PDO::PARAM_STR);
  99.                                 $insert_user_query->bindValue(':user_activation_hash', $user_act_hash, PDO::PARAM_STR);
  100.                                 $insert_user_query->bindValue(':user_registration_ip', $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR);
  101.                                 $insert_user_query->execute();
  102.                        
  103.                                 $user_id = $this->db_connection->lastInsertId();
  104.                                 //als de insert gelukt is, probeer de activatiemail te sturen, anders registration failed
  105.                                         if($insert_user_query){
  106.                                                 if($this->sendActivationMail($user_id, $user_email, $user_act_hash)){            
  107.                                                 $this->messages[] = $this->lang['Verification mail sent'];
  108.                                                 $this->registration_succes = true;                 
  109.                                         }else{
  110.                                                 $delete_user_query = $this->db_connection->prepare('DELETE FROM users WHERE user_id=:user_id');
  111.                                                 $delete_user_query->bindValue(':user_id', $user_id, PDO::PARAM_INT);
  112.                                                 $delete_user_query->execute();
  113.                                                 $this->errors[] = $this->lang['Verification mail error'];
  114.                                                 //print $exception->getMessage() . "<br/>";
  115.                                         }                            
  116.                                 }else{
  117.                                         $this->errors[] = $this->lang['Registration failed'];   
  118.                                 }
  119.                         }
  120.                 }else{
  121.                         $this->errors[] = $this->lang['Database error'];
  122.                 }
  123.         }
  124.        
  125.         private function sendActivationMail($user_id, $user_email, $user_act_hash){
  126.                 $to = $user_email;
  127.                 $subject = 'Account activation';               
  128.                 $headers  = 'MIME-Version: 1.0' . "\r\n";
  129.                 $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
  130.                 $headers .= 'From: Fanatic Trainer <noreply@fanatictrainer.com>' . "\r\n";           
  131.                 $message =
  132.                 '<html>
  133.                 <head>
  134.                         <title>Activate your fanatic trainer account!</title>
  135.                 </head>
  136.                 <body>
  137.                         Thank you for registering at Fanatic Trainer!
  138.                         <br><br>
  139.                         In order to login to your Fanatic Trainer account, please click on the following link.<br>
  140.                         <a href="http://www.fanatictrainer.com/register.php?id='. $user_id .'&verification_code='. $user_act_hash .'">Activate!</>
  141.                 </body>
  142.                 </html>';
  143.                 mail($to, $subject, $message, $headers);
  144.         }              
  145. }
  146. ?>
  147.  


Hopelijk ziet iemand snel de fout en kan ik aan de login beginnen :)

Mvg Gijs
^ Reactie #1 geschreven door BoeMan op dinsdag 31 december 2013 om 15:02:32.
BoeMan heeft nog geen avatar toegevoegd
Multiviteit: 154
Het werkt weer, er stond een witruimte teveel voordat ik mijn session_start() uitvoerde.

Nu zit ik uiteraard met een ander probleem. Ik heb de private function databaseConnection weggehaald en deze in een apart bestand gezet omdat ik anders in elk script deze code moet zetten.

Nu geef ik de variabele $db_connection zijn waarde via
PHP
  1. $this->db_connection = databaseConnection::getInstance();
  2. //geef dit object de juist taal
  3. $this->lang = & $GLOBALS['phplogin_lang'];
  4.  


Maar ik heb dit ook nodig bij de else if net voor ik de $check_user_name query declareer, op rij 71
PHP
  1.  
  2. ...
  3. } else if ($this->databaseConnection()){
  4. ...
  5.  


Nu weet ik niet hoe ik dit moet aanpassen zodat deze else if de juiste waarde uit mijn $db_connection gebruikt.

Mvg Gijs
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen