お世話になります。phpでhtmlフォームから値を取得し、MySQLにUPDATEするプログラムを作成しています。
具体的には会員登録者のパスワード変更です。
今回お聞きしたいのはフォームから新しいパスワードを取得した際に、なぜか空になってしまう原因が知りたいです。
var_dumpでみるとstring(0)""になっています。
メールアドレスをユニークキーとし、現在のパスワードと新しいパスワードを入力します。その後、フォームのエラーチェックを行い、現在のパスワードが正しければ新しいパスワードに更新するという動きを期待して下のプログラムを組みました。
しかし、新しいパスワードが空になってしまうのでエラーチェックに引っかかります。
<?php //データベース接続 require($_SERVER["DOCUMENT_ROOT"]. '/library/dbc.php'); require($_SERVER["DOCUMENT_ROOT"]. '/function/functions.php'); //クッキーに値があればマイページへ if(!isset($_COOKIE['email'])){ header("Location: login.php"); } //ログインボタンが押された場合 if (!empty($_POST['submit'])) {//ログインボタンを押した時 //ユーザID、パスワードがの入力されているかチェック if ($_POST['email'] == '') { $error['email'] = "blank"; }else{ $error['email'] = ''; } if ($_POST['pass'] == '') { $error['pass'] = "blank"; }else{ $error['pass'] = ''; } $length = strlen($_POST['new_pass']); switch (TRUE) { case $_POST['new_pass'] = '': $error['new_pass'] = 'blank'; break; case ($length < 6): $error['new_pass'] = 'strlen'; break; case ($_POST['new_pass'] !== $_POST['confirm']): $error['new_pass'] = 'dif'; break; default: $error['new_pass'] = ''; break; } /*if ($_POST['new_pass'] == '') { $error['new_pass'] = "blank"; }elseif(strlen($_POST['new_pass']) < 6){ $error['new_pass'] = 'strlen'; }else{ $error['new_pass'] = ''; } if ($_POST['new_pass'] !=== $_POST['confirm']) { $error['new_pass'] = "anmatch"; }else{ $error['new_pass'] = ''; }*/ if ($_POST['confirm'] == '') { $error['confirm'] = "blank"; }else{ $error['confirm'] = ''; } if(empty($error)){ $email = $_POST['email']; $pass = $_POST['pass']; $stmt = $pdo -> prepare("SELECT * FROM human WHERE email=:email"); $stmt -> bindValue(':email', $email, PDO::PARAM_STR); $stmt -> execute(); $data = $stmt -> fetch(); //現在のパスワードを照合 if(password_verify($_POST['pass'], $data['password_hash'])) { //新しいパスワードにアップデート $password_hash = password_hash($new_pass, PASSWORD_DEFAULT); $stmt = $pdo -> prepare("UPDATE human SET password_hash =:password_hash WHERE email = :email"); $stmt-> bindParam(':password_hash', $password_hash, PDO::PARAM_STR); $stmt-> bindParam(':email', $email, PDO::PARAM_STR); $stmt-> execute(); $pdo = NULL; }$error['pass'] = "anmatch";//不一致時のエラー }var_dump($_POST['new_pass']); //if($error == '')最初のエラーチェック }else{ $_POST['email'] = ''; $_POST['pass'] = ''; $_POST['new_pass'] = ''; $_POST['confirm'] = ''; $error['email'] = ''; $error['pass'] = ''; $error['new_pass'] = ''; $error['confirm'] = ''; } ?> <!DOCTYPE html> <?php include($_SERVER['DOCUMENT_ROOT'] . '/parts/header.php'); ?> <body class="login"> <div class="container"> <div class="row"> <!--カラム--> <div class="col-xs-12 col-sm-offset-2 col-md-offset-3 "> <h1>パスワード変更</h1> <p>メールアドレスとパスワードを入力してください。</p> <form action="" method="post"> <dl> <dt>メールアドレス</dt> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php echo h($_POST['email']); ?>"> <?php if($error['email'] == 'blank'): ?> <p><font class="red">* メールアドレスを入力してください</font></p> <?php endif; ?> </dd> <dt>現在のパスワード</dt> <dd> <input type="password" name="pass" size="20" maxlength="255" value="<?php echo h($_POST['pass']); ?>"> <?php if($error['pass'] == 'blank'): ?> <p><font class="red">* パスワードを入力してください</font></p> <?php endif; ?> <?php if($error['pass'] == 'anmatch'): ?> <p><font class="red">* パスワードとメールアドレスが一致しません</font></p> <?php endif; ?> <dt>新しいパスワード</dt> <dd> <input type="password" name="new_pass" size="20" maxlength="255" value="<?php echo h($_POST['new_pass']); ?>"> <?php if($error['new_pass'] == 'blank'): ?> <p><font class="red">* パスワードを入力してください</font></p> <?php endif; ?> <?php if($error['new_pass'] == 'strlen'): ?> <p><font class="red">* パスワードは6文字以上に設定してください</font></p> <?php endif; ?> <?php if($error['new_pass'] == 'dif'): ?> <p><font class="red">* パスワードが一致しません</font></p> <?php endif; ?> </dd> <dt>新しいパスワード(確認用)</dt> <dd> <input type="password" name="confirm" size="20" maxlength="255" value="<?php echo h($_POST['confirm']); ?>"> <?php if($error['confirm'] == 'blank'): ?> <p><font class="red">* パスワードを入力してください</font></p> <?php endif; ?> </dl> <input type="submit" id="submit" name="submit" value="パスワードを変更"> </form> </div><!--メイン--> </div><!--class row --> </div><!--container-->
また、POSTした際に問題のフォームだけ値が保持されませんが、これも関係あるのでしょうか?
以上になります。よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。