2016-08-04 11 views
1

ユーザーがsettings.phpページから自分の個人設定を変更できるようにする方法、パスワードと電子メールはすべて同じページにあります。私はこれらのタスクをすべて実行する方法を知っています。同じ「変更を保存」ボタンを使用して、同じページ上で異なる機能をすべて実行する方法がわからないだけです。「変更を保存」ボタンが1つだけの設定ページを更新する

 <div class="form-editinfo"> 
     <form class="editform" method="POST" action="settings" style="width: 600px;" > 
     Name: <input type="text" name="editname" value="<?php echo $userRow['user_name']; ?>"><br /><br /> 
    <table border='0' width='55%' cellspacing='0px'> 
    <tr><td>Current Password: </td><td><input type="password" name="editcurrpass" placeholder="Enter Current Password" ></td></tr> 
    <br /><tr><td>New Password: </td><td><input type="password" name="editnewpass" placeholder="Enter New Password" ></td></tr> 
    <tr><td>Confirm New Password: </td><td><input type="password" name="editconfpass" placeholder="Enter New Password" ></td></tr> 
    </table> 
    <input type="submit" name="editsubmit" value="Update Settings"> 
    <?php 

    if(isset($_POST['editsubmit'])){ 

    $newname = trim($_POST['editname']); 
    if(!empty($newname)){ 
     $id = $_SESSION['user_session']; 
     $sqlnewname = $auth_user->runQuery("UPDATE users SET user_name='$newname' WHERE user_id='$id'"); 
     $sqlnewname->execute(); 
    }else{ 
     echo "<br/>You must enter a new username!"; 
    } 
    $uname = $userRow['user_name']; 

    $currpass = trim($_POST['editcurrpass']); 
    $newpass = trim($_POST['editnewpass']); 
    $newconfpass = trim($_POST['editconfpass']); 
    if(!empty($currpass) || !empty($newpass) || !empty($newconfpass)){ 
     if(password_verify($currpass, $userRow['user_pass'])){ 
     if($newpass == $newconfpass){ 
      $new_password = password_hash($newpass, PASSWORD_DEFAULT); 
      $id = $_SESSION['user_session']; 
      $sqlupdpass = $auth_user->runQuery("UPDATE users SET user_pass=:newpass WHERE user_id='$id'"); 
      $sqlupdpass->execute(array(':newpass'=>$new_password)); 
      echo "<br />Password updated."; 
     }else{ 
      echo "<br />Passwords do not match."; 
     } 
     }else{ 
     echo "<br/>Incorrect Password."; 
     } 
    }else{ 
     echo "<br />You did not fill out one or more of the required fields."; 
    } 
    } 
    ?> 
+0

は、あなたがこれまで何を試してみましたか?はいの場合は、あなたがどこにいるのか教えてください。 –

+0

@ShrikantMavlankarは元の投稿をチェックし、送信時にパスワード変更フォームからエラーメッセージを返します。 –

+0

あなたは彼/彼女の名前を変更すると同時に彼のパスワードを更新するユーザーをしたいですか?それは可能ですが、ユーザーが自分の名前だけを変更したい場合やパスワードだけを変更したい場合、追加作業は必要ではありません。 –

答えて

1

私があなただったら、私は別の部分にコードのこの部分を破壊について思うだろう(関数やクラス/メソッド)あなたがに人間が読める名前を割り当てることができますので、あなたのワークフローをより良い管理することができます機能するようになっています。全体的にコードが多くても、このシナリオのすべての関数はインクルードとして隠されます。もう一つの利点は、必要に応じて他の場所でこれらの機能を再利用できることです。また、ビューの前にビジネスロジックを配置することをお勧めします。最後に、アクションを識別するためのフォームに隠しフィールドを追加します。また、わかりやすくするためにパスワードフィールドを配列にします。これは、エラーメッセージの望ましい結果の詳細ですかどうかを確認してください:

/functions/myfunctions.php

// I suggest you use a query engine to run queries, this will return an array 
// if toggled to do so. This will save you time and keep queries consistent 
function query($con,$sql,$bind = false,$return = false) 
    { 
     if(is_array($bind) && !empty($bind)) { 
      foreach($bind as $key => $value) { 
       $bArr[":{$key}"] = $value; 
      } 
     } 
     $query = $con->runQuery($sql); 
     if(!empty($bArr)) 
      $query->execute($bArr); 
     else 
      $query->execute(); 

     if($return) { 
      while($result = $query->fetch(PDO::FETCH_ASSOC)) { 
       $row[] = $result; 
      } 

      return (!empty($row))? $row : array(); 
     } 
    } 
// Change password 
function changePassword($password,$id,$con) 
    { 
     $password = trim($password); 
     if(empty($password)) 
      return false; 
     $password = password_hash($password,PASSWORD_DEFAULT); 
     $bind  = array($password,$id); 
     query($con,"UPDATE `users` SET `user_pass` = :0 WHERE `user_id` = :1",$bind); 

     return true; 
    } 
// Update name based on user_id 
function updateName($name,$id,$con) 
    { 
     $name = trim($name); 
     if(empty($name)) 
      return false; 
     $bind = array($name,$id); 
     query($con,"UPDATE `users` SET `user_name` = :0 WHERE `user_id` = :1",$bind); 

     return true; 
    } 
// Check an array for empty fields 
function checkArray($array,&$failed) 
    { 
     foreach($array as $key => $value) { 
      $new[$key] = (is_array($value))? checkArray($array) : trim($value); 
      if(empty($value)) 
       $failed[] = $key; 
     } 

     return $new; 
    } 
// Match two string 
function passwordsMatch($pass1,$pass2) 
    { 
     $pass1 = trim($pass1); 
     $pass2 = trim($pass2); 

     if(empty($pass1) || empty($pass2)) 
      return false; 

     return ($pass1 == $pass2); 
    } 
// Just wraps the password function 
function storedPasswordMatch($password,$hash) 
    { 
     return password_verify($password,$hash); 
    } 
// Returns the messaging 
function compileMessage($array,$type = 'error') 
    { 
     return '<span class="'.$type.'">'.implode('</span><br />'.PHP_EOL.'<span class="'.$type.'">',$array).'</span>'; 
    } 

/設定

// Put this logic at the top of the page 
// Update action 
if(isset($_POST['action']) && $_POST['action'] == 'update_account') { 
    // Add functions 
    require(__DIR__.'/functions/myfunctions.php'); 
    // Update the name or record error 
    if(!updateName($_POST['editname'],$id,$auth_user)) 
     $error['name'] = 'Name is invalid.'; 
    // Save a storing variable 
    $allowPass = false; 
    // Check if the passwords array is all filled 
    $passwords = checkArray($_POST['password'],$allowPass); 
    // If any password is not filled out, create error(s) 
    if(!empty($allowPass)) { 
     // I don't know what your preferred logic is, but this is set up so if 
     // the user doesn't fill out all three passwords, then it's assumed 
     // no password is being changed, so no error is generated 
     if(count($allowPass) < 3) { 
      foreach($allowPass as $err) 
       $error[$err] = ucfirst($err).' password can not be empty.'; 
     } 
    } 
    // If all password fields are filled out 
    else { 
     $pass = $passwords['new']; 
     $curr = $passwords['current']; 
     $conf = $passwords['confirm']; 
     // Check that the new and confirm password match 
     $pMatch = passwordsMatch($pass,$conf); 
     // Check that the database password matches current password 
     $dMatch = storedPasswordMatch($curr,$userRow['user_pass']); 
     // If new and confirm match 
     if($pMatch) { 
      // If current and database match 
      if($dMatch) { 
       // Change the password 
       changePassword($pass,$id,$auth_user); 
       // Record success 
       $message['password'] = 'Password updated.'; 
      } 
      else 
       // Record error if in-database password doesn't match 
       $error['password_match'] = 'Password on file does not match.'; 
     } 
     else 
      // If the new and confirm don't match record error 
      $error['password_match'] = 'Passwords must match.'; 
    } 
} 
?> 
<div class="form-editinfo"> 
    <?php 
    // Write success messages to page 
    if(!empty($message)) 
     echo compileMessage($message,'message'); 
    // Write error messages to page 
    if(!empty($error)) 
     echo compileMessage($error); 
    ?> 
    <form class="editform" method="POST" action="settings" style="width: 600px;" > 
     <input type="hidden" name="action" value="update_account" /> 
    Name: <input type="text" name="editname" value="<?php echo htmlspecialchars($userRow['user_name']); ?>"> 
     <table border='0' width='55%' cellspacing='0px'> 
      <tr> 
       <td>Current Password: </td> 
       <td><input type="password" name="password[current]" placeholder="Enter Current Password" /></td> 
      </tr> 
      <tr> 
       <td>New Password: </td> 
       <td><input type="password" name="password[new]" placeholder="Enter New Password" /></td> 
      </tr> 
      <tr> 
       <td>Confirm New Password: </td> 
       <td><input type="password" name="password[confirm]" placeholder="Confirm New Password" /></td> 
      </tr> 
     </table> 
    <input type="submit" name="editsubmit" value="Update Settings" /> 
+0

ユーザー名が機能していないようで、送信ボタンをクリックするとページが更新されます。物事のパスワード変更側では、すべての正しいメッセージが返されますが、実際にはデータベースに変更が加えられていないようです。 –

+0

フォームの入力名を変更しましたか?ちょうど 'print_r($ val); die(); '(' $ val'は関数の中でデータベースヒットのようなイベントをトリガするための値です)、実行された順番で関数がどこにあるのかを調べます。私はあなたのデータベースを持っていないので、DBのものの実際の作業を撃つのは難しいです。 – Rasclatt

+0

settings.phpに$ idと$ nameを定義して動作させました。これを手伝ってくれた皆さんの努力のおかげで、大変感謝しています。 –

関連する問題