2016-08-04 5 views
1

Fragen Sie sich, wie es möglich wäre, einem Benutzer zu erlauben, Änderungen an seinen persönlichen Einstellungen über eine settings.php-Seite vorzunehmen, wodurch es möglich ist, Ihren Benutzernamen zu ändern. Passwort und E-Mail alle auf der gleichen Seite. Ich weiß, wie ich all diese Aufgaben ausführen kann. Ich bin mir nicht sicher, wie es möglich wäre, verschiedene Funktionen auf derselben Seite mit derselben Schaltfläche "Änderungen speichern" auszuführen.Aktualisieren der Einstellungsseite mit nur einer Taste "Änderungen speichern"

 <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

Haben Sie etwas versucht, so weit? Wenn ja, zeig uns, wo du feststeckst. –

+0

@ShrikantMavlankar Überprüfen Sie den ursprünglichen Beitrag, wenn Sie auf "Senden" klicken, werden die Fehlermeldungen aus dem Passwortänderungsformular zurückgegeben. –

+0

Sie möchten also, dass der Benutzer seinen Namen ändert und gleichzeitig sein Passwort aktualisiert? Es ist möglich, aber was ist, wenn der Benutzer nur seinen/ihren Namen oder nur das Passwort ändern möchte, dann machen Sie zusätzliche Aufgaben, die nicht notwendig sind. –

Antwort

1

Wenn ich Sie wäre, würde ich darüber nachdenken, dieses Stück Code in einzelne Teile brechen (Funktionen oder Klassen/Methoden), die Ihnen erlaubt, Ihren Workflow besser zu verwalten, weil Sie zu den Menschen lesbaren Namen zuweisen Funktionen, damit sie mehr Sinn ergeben. Obwohl insgesamt mehr Code vorhanden ist, sind alle Funktionen in diesem Szenario als Include ausgeblendet. Ein weiterer Vorteil ist, dass Sie diese Funktionen woanders bei Bedarf wiederverwenden können. Außerdem ist es am besten, die Geschäftslogik vor die Ansicht zu stellen, und schließlich würde ich ein verstecktes Feld in dem Formular hinzufügen, das zum Identifizieren von Aktionen verwendet wird, und ich würde auch die Passwortfelder zur leichteren Lesbarkeit zu einem Array machen. Sehen Sie, wenn dies eher ein erwünschtes Ergebnis ist für Fehlermeldungen:

/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>'; 
    } 

/Einstellungen

// 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

Benutzername scheint nicht zu funktionieren, nur die Seite aktualisiert, wenn Sie auf die Schaltfläche zum Absenden klicken. Die Seite zum Ändern des Passworts gibt zwar alle korrekten Nachrichten zurück, scheint jedoch keine Änderungen in der Datenbank vorzunehmen. –

+0

Haben Sie Ihre Formulareingabe-Namen ausgeschalten? Legen Sie einfach einige 'print_r ($ val); sterben(); '(' val Rasclatt

+0

Ich habe es zu arbeiten, indem Sie $ id und $ name in settings.php definieren. Danke für all eure Bemühungen, mir dabei zu helfen, sehr geschätzt. –

Verwandte Themen