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" />
Haben Sie etwas versucht, so weit? Wenn ja, zeig uns, wo du feststeckst. –
@ShrikantMavlankar Überprüfen Sie den ursprünglichen Beitrag, wenn Sie auf "Senden" klicken, werden die Fehlermeldungen aus dem Passwortänderungsformular zurückgegeben. –
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. –