2016-03-29 12 views
-2

私はedit.phpを作成しようとしているので、ユーザーはパスワードを変更して電子メール、ユーザー名などの情報を変更できます。アカウント情報を更新する

ユーザー名はセッションユーザーです。ユーザー名が変更された場合は、新しいユーザー名でUPDATE SESSIONが必要です。それは動作しません。どうしてか分かりません。 ありがとうございます。これは、コード个人设定

<?php 
require('includes/config.php'); 
if(!$user->is_logged_in()){ header('Location: login.php'); } 
?> 
<?php 
class info {  
} 
$username= $_SESSION['username']; 
$sql = 'SELECT * FROM users WHERE username = :username'; 
$query= $db->prepare($sql); 
$query->execute(array(

      ':username' => $username, 
)); 
$query->setFetchMode (PDO::FETCH_CLASS, 'info'); 
while($r= $query->fetch(PDO::FETCH_OBJ)) { 
    $email = $r->email; 
    $namefull = $r->namefull; 
    $usertype = $r->usertype; 
    $password = $r->password; 
    } 
if(isset($_POST['submit'])){ 
    if(strlen($_POST['username']) < 3){ 
     $error[] = 'Username deve avere almeno 4 lettere.'; 
    } else { 
     $stmt = $db->prepare('SELECT username FROM users WHERE username = :username'); 
     $stmt->execute(array(':username' => $_POST['username'])); 
     $row = $stmt->fetch(PDO::FETCH_ASSOC); 
     if(!empty($row['username'])){ 
      $error[] = 'Username già in uso.'; 
     } 
    } 
    if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){ 
     $error[] = 'Inserisci una email valida'; 
    } else { 
     $stmt = $db->prepare('SELECT email FROM users WHERE email = :email'); 
     $stmt->execute(array(':email' => $_POST['email'])); 
     $row = $stmt->fetch(PDO::FETCH_ASSOC); 
     if(!empty($row['email'])){ 
      $error[] = 'Email già in uso.'; 
     } 
    } 
    if(!isset($error)){ 
     try { 
      $stmt = $db->prepare("UPDATE users SET (username,email,usertype) VALUES (:username, :email,:usertype) WHERE username='".$username."'"); 
      $stmt->execute(array(
       ':username' => $_POST['username'], 
       ':email' => $_POST['email'], 
       ':usertype' => $_POST['usertype'], 
      )); 
      header('Location: edit.php?action=joined'); 
      exit; 
     } catch(PDOException $e) { 
      $error[] = $e->getMessage(); 
     } 

     } 
} 
?> 

このリセットパスワードのためのアクションフォームで、私は2つの形式である。ここ

<?php 
if(isset($_POST['submit'])){ 
    if(strlen($_POST['password']) < 3){ 
     $error[] = 'Password deve contenere almeno 4 lettere.'; 
    } 

    if(strlen($_POST['passwordConfirm']) < 3){ 
     $error[] = 'Conferma password deve contenere almeno 4 lettere.'; 
    } 

    if($_POST['password'] != $_POST['passwordConfirm']){ 
     $error[] = 'Le password non sono uguali.'; 
    } 


    //if no errors have been created carry on 
    if(!isset($error)){ 

     //hash the password 
     $hashedpassword = $user->password_hash($_POST['password'], PASSWORD_BCRYPT); 

     //create the activasion code 
     $activasion = md5(uniqid(rand(),true)); 

     try { 

      //insert into database with a prepared statement 
      $stmt = $db->prepare('INSERT INTO users (username,password,email,active) VALUES (:username, :password, :email, :active)'); 
      $stmt->execute(array(
       ':username' => $_POST['username'], 
       ':password' => $hashedpassword, 
       ':email' => $_POST['email'], 
       ':active' => $activasion 
      )); 
      $id = $db->lastInsertId('id'); 

      //send email 
      $to = $_POST['email']; 
      $subject = "Cambio password"; 
      $body = "<p>La tua password è stata cambiata!</p> 
      <p>Amministrazione Dixard</p>"; 

      $mail = new Mail(); 
      $mail->setFrom(SITEEMAIL); 
      $mail->addAddress($to); 
      $mail->subject($subject); 
      $mail->body($body); 
      $mail->send(); 

      //redirect to index page 
      header('Location: register.php?action=joined'); 
      exit; 

     //else catch the exception and show the error. 
     } catch(PDOException $e) { 
      $error[] = $e->getMessage(); 
     } 

     //aggiornare la sessione con la nuova password 




    }  

} 

?> 

編集reset.phpを作成(変更の電子メール、ユーザ名、ユーザタイプAND)パスワードを変更します。

ユーザー名 「> Tipologiaはアカウント「> メールアドレス 」> サルバ
   <h2 class="strong-header large-header">Change Password</h2> 
       <form role="form" action="edit-reset.php" method="post" novalidate> 
        <div class="form-group"> 
         <label for="password">Password corrente</label> 
         <input type="password" placeholder="Password" name="password_corrent" id="password" class="form-control" required> 
        </div> 

        <div class="form-group"> 
         <label for="password">Nuova Password</label> 
         <input type="password" placeholder="Nuova Password" name="password" id="password" class="form-control" required> 
        </div> 
        <div class="form-group"> 
         <label for="password-repeat">Conferma Nuova password</label> 
         <input type="password" name="passwordConfirm" id="passwordConfirm"class="form-control" placeholder="Conferma Nuova Password" required> 
        </div> 

        <button type="submit" class="btn btn-primary">Cambia Password</button> 
       </form> 

答えて

0

ユーザ名または電子メールが既に使用されている場合、あなたのedit.phpスクリプト内でチェックしているとき、あなたはのidを除外していません現在の使用者。したがって、ユーザはいつでも自分のユーザ名をのいずれかに変更する必要があります。

さらに、データベースのデータを更新した後で、ユーザのログインを維持するために(ユーザ名が変更されたと仮定して)$_SESSION['username']を更新していません。

+0

はい新しいユーザー名データで更新セッションが必要です。しかし問題は、ユーザー名と電子メールは変更されないということです。データベースのデータは \t \t $ stmtは= $ DB->( 'usernameは=ユーザーからユーザー名を選択してください:ユーザー名 \t \t AND NOT EXISTS(ID = $ IDをユーザーからユーザー名を選択)')の準備を変更しません。 \t \t $ stmt-> execute(array( ':username' => $ _POST ['username'])); \t \t $行= $ stmt->フェッチ(PDO :: FETCH_ASSOC); \t \t(!空($行[ 'ユーザ名']))であれば{ \t \t \t $エラー[] = 'ユーザー名が存在します。'; \t \t \t} –

+0

1.更新リクエストに問題があると思われます。あなたはこれを見てみる必要があります:http://dev.mysql.com/doc/refman/5.7/en/update.html。 2.以前の検証では、シンプルで現在のユーザーIDを取得してください。 'SELECT id FROM users WHERE username =:username;'を要求し、ユーザ名がまだ使用されていないかどうかを確認しながら、あなたの状態にこのIDを追加してください: 'username username =:username AND id!=:id;' – Schnapse

関連する問題