

### 環境

mamp  
php 7.4  
mysql 5.7  
phpmyadmin

_****やりたいこととできないこと****_  
現在の機能としてはsignup.phpで新規登録してname,passwordカラムをusersテーブルに保存した後、check.phpにリダイレクトして、check.phpはsignup.phpで投稿した値ををセッションで保持しており、表示できるというものです。  
この機能にパスワードのハッシュ化をしようとするとテーブルに値が保存されない問題が起きてしまいます。  
ハッシュ化する前は、もちろん正常に新規登録した後、usersテーブルに値が保存されていました。

_****実施した手順とその結果****_  
sha1メソッドと、password_hashを使う。

**signup.php**

[code]

    <?php
    
    session_start();
    require('../dbconnect.php');
    
    if ($_POST['name'] === '') {
     $error['name'] = 'blank';
    }
    
    if ($_POST['password'] === '') {
     $error['password'] = 'blank';
    }
    
    if (!empty($_POST['name'] && $_POST['password'])) {
     $_SESSION['join'] = $_POST;
     $name = $_POST['name'];
    // ここから〜⭐️
     //$password = $_POST['password']; 
     $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
     // $password = sha1($_POST['password']);
    //ここまで
    
     $sql = 'INSERT into users(name, password) values(?, ?)';
     $stmt = $db->prepare($sql);
     $stmt->execute(array($name, $password));
     //$stmt = null;
     //$db = null;
    
     header('Location: check.php');
     exit();
    }
    
    ?>
    <!DOCTYPE html>
    <html lang="ja">
    
    <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>新規登録画面</title>
    </head>
    
    <body>
     <form action="" method="POST">
      名前
      <input type="text" name="name" id="" value="<?php print(htmlspecialchars($_POST['name'], ENT_QUOTES)); ?>">
      <?php if ($error['name'] === 'blank') : ?>
       <p style="color: red;">名前を入力してください</p>
      <?php endif; ?>
      <div>
       パスワード
       <input type="text" name="password" value="<?php print(htmlspecialchars($_POST['password'], ENT_QUOTES)); ?>">
       <?php if ($error['password'] === 'blank') : ?>
        <p style="color: red;">パスワードを入力してください</p>
       <?php endif; ?>
       <input type="submit" name="signup" value="新規登録">
      </div>
     </form>
    </body>
    
    </html>
    
[/code]

**check.php**

[code]

    <?php
    session_start();
    require('../dbconnect.php');
    if (!isset($_SESSION['join'])) {
     header('Location: ./signup.php');
     exit();
    }
    ?>
    <p><?php print(htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES)); ?></p>
    <p>パスワードは公開していません</p>
    <a href="./signup.php">戻る</a>
    
[/code]

結果は  
password_hash、sha1どちらをつかっても値がusersテーブルに入りませんでした。ただセッションの保持は成功しておりcheck.phpのリダイレクトも保持した値の表示もできます。

試したことその２  
var_dumpでmysqlのエラーメッセージを取得しようとした。

[code]

    if (!empty($_POST['name'] && $_POST['password'])) {
     $_SESSION['join'] = $_POST;
     $name = $_POST['name'];
     $password = $_POST['password'];
     //$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
     //$password = sha1($_POST['password']);
     $sql = 'INSERT into users(name, password) values(?, ?)';
     $stmt = $db->prepare($sql);
     $mysql_data = $stmt->execute(array($name, $password));
     var_dump($mysql_data);
     exit();
    
     header('Location: check.php');
     exit();
    }
    
[/code]

この場合、sha1メソッド、password_hashがfalse、使用していない場合はtrueを出力しました。

試したことその３  
errorCodeメソッドを使用する。  
[https://www.php.net/manual/ja/pdo.errorcode.php
こちらを参考にしました。](https://www.php.net/manual/ja/pdo.errorcode.php%E3%80%80%E3%81%93%E3%81%A1%E3%82%89%E3%82%92%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)

[code]

    <?php
    try {
     $db = new PDO('mysql:dbname=kadai3_1;host=127.0.0.1;charset=utf8', 'root', 'root');
    } catch (PDOException $e) {
     echo "接続エラー: " . $e->getMessage();
    }
    
    if (!empty($_POST['name'] && $_POST['password'])) {
     $_SESSION['join'] = $_POST;
     $name = $_POST['name'];
     $password = $_POST['password'];
     //$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
     //$password = sha1($_POST['password']);
     $sql = 'INSERT into users(name, password) values(?, ?)';
     $stmt = $db->prepare($sql);
     $mysql_data = $stmt->execute(array($name, $password));
     echo $db->errorCode();
     exit();
    
     header('Location: check.php');
     exit();
    }
    
[/code]

sha1,password_hash,ハッシュ化しない、これらどのケースも0が5つ表示されるという結果になりました。この結果に関してはなぜそうなったか正直全く検討がついていません。。

[![画像の説明をここに入力](https://i.stack.imgur.com/d6rKg.png)](https://i.stack.imgur.com/d6rKg.png)

参考にした記事のURLは以下です。  
<https://www.php.net/manual/ja/function.password-hash.php>  
<https://www.php.net/manual/ja/function.sha1.php>

ハッシュしようとしたができない方のブランチのurl  
<https://github.com/masal9pse/internTasks/tree/hash_password/task3/kadai1/views>  
ハッシュ化していない正常に値が投入できるブランチ  
<https://github.com/masal9pse/internTasks/tree/master/task3/kadai1/views>

何かアドバイスがあればよろしくお願いします。


CC BY-SA 4.0
2020-09-26T01:46:42.027
70710
2020-09-26T12:55:59.163
2020-09-26T11:45:20.347
3060
36424
question
php mysql
パスワードのハッシュ化がされない。


usersテーブルの文字数制限を増やしてみたところ無事に問題が解決しました。案外単純なミスで拍子抜けしました。  
質問に回答してくださった方、大変勉強になりました。ありがとうございました。

[code]

    // create_users_table.php
    <?php
    try {
        $db = new PDO('mysql:dbname=kadai3_1;host=127.0.0.1;charset=utf8', 'root', 'root');
    } catch (PDOException $e) {
        echo "接続エラー: " . $e->getMessage();
    }
    
    // テーブル作成のSQLを作成
    $sql = 'CREATE TABLE users (
        id INT(11) AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20),
    // もともと11文字だったところを100文字に変えたところsha1でもpassword_hashでもハッシュ化できました。
     password VARCHAR(100),
        registry_datetime DATETIME
    ) engine=innodb default charset=utf8';
    
    // SQLを実行
    $res = $db->query($sql);
    echo '接続できました。';
    
    
[/code]


CC BY-SA 4.0
2020-09-26T12:55:59.163
70723
2020-09-26T12:55:59.163
36424
70710
answer