空の文字列がハッシュされてアップロードされるのを防ぐコードは何もありません。元の文字列ではなく、ハッシュをチェックしています。これは、空の値がまだ更新される理由を説明します。
ただし、値が一致しない場合、それらのハッシュは異なるはずです。これは、変数$_POST['newpassword']
である可能性が高く、$_POST['confirmnewpassword']
正確ではないことを示しています。他の人が示唆しているように、コードの先頭にあるvar_dumpまたはprint_r($_POST)ステートメントでさえ、これを診断するのに役立ちます。
PDO と mysql のような大局的な問題に踏み込んだり、コードを別の方法で構造化したりすることさえせずに、私なら次のようにします。
session_start();
include("func.php");
print_r ($_POST); // you'll want to delete this later
$new_password = $_POST['newpassword']; // not technically necessary, my preferred style
$confirm_password = $_POST['confirmnewpassword']; // also not technically necessary
$userid = $_SESSION['username'];
/* Test the actual submitted password and confirmation to ensure they are set */
if (empty ($new_password) || empty ($confirm_password)) {
/* header("Location: ../error.php"); */ // comment this out for now
die ("Error: Password or Password Confirmation not set");
}
/* Test the actual submitted password and confirmation to ensure they match */
elseif ($new_password != $confirm_password) {
/* header("Location: ../error.php"); */ // comment this out for now
die("Error: Password and Password Confirmation do not match");
}
else {
/* NOW that you have established the password and confirmation are both
* set AND match, you get the hash value */
$password_hash = mysql_real_escape_string(md5($new_password));
dbConnect();
mysql_query("UPDATE users SET password='$Confirm' WHERE username='$userid'");
mysql_close($connect);
/* header("Location: ../profile.php"); */ // comment this out for now
die("Success: Updated");
}
これにより、スクリプトをデバッグして、何が問題なのかを確認できます。私の推測では、データが GET として渡されているか、変数名が正しくありません。
次のステップ:
- 動作したら、var_dump を削除し、リダイレクトのコメントを外します。
- 他の回答の1つに記載されているように、パスワードが正しいことをより明示的にテストするためにifステートメントを作り直すことを検討してください。
- 真剣に、PDOまたはmysqliを調べてください。手続き型の mysql_* は廃止される予定です。
- 完全な OOP ルートに行きたくない場合は、 update_password () や send_error () などの関数を作成することを検討してください。これにより、コードがより読みやすく、再利用しやすくなります。
しかし、一度に 1 ステップずつ、この最新のものをデバッグしましょう!