回答編集履歴
6
SQL文の見直し
    
        answer	
    CHANGED
    
    | @@ -31,9 +31,9 @@ | |
| 31 31 |  | 
| 32 32 | 
             
            $mysqli = new mysqli('localhost', 'root', '', '');
         | 
| 33 33 | 
             
            $sql = <<<EOT
         | 
| 34 | 
            -
             | 
| 34 | 
            +
            SELECT `user_id`, `user_name`, `address`, `pass` 
         | 
| 35 | 
            -
             | 
| 35 | 
            +
            FROM `user_data`
         | 
| 36 | 
            -
            WHERE user_id = ? AND pass = ?
         | 
| 36 | 
            +
            WHERE `user_id` = ? AND `pass` = ?
         | 
| 37 37 | 
             
            EOT;
         | 
| 38 38 | 
             
            $stmt = $mysqli->prepare($sql);
         | 
| 39 39 | 
             
            $stmt->bind_param('is', $u_id, $pass);  // $userがintのつもり、stringなら'ss'を指定
         | 
5
見直し
    
        answer	
    CHANGED
    
    | @@ -26,6 +26,8 @@ | |
| 26 26 | 
             
            ```php
         | 
| 27 27 | 
             
            $u_id = $_POST["user_id"];
         | 
| 28 28 | 
             
            $pass = $_POST["pass"]; 
         | 
| 29 | 
            +
            // このあたりに、$u_id や $pass に不正な文字や不適切な文字が含まれていないかを
         | 
| 30 | 
            +
            // 検証する処理を置くこと。
         | 
| 29 31 |  | 
| 30 32 | 
             
            $mysqli = new mysqli('localhost', 'root', '', '');
         | 
| 31 33 | 
             
            $sql = <<<EOT
         | 
| @@ -36,7 +38,7 @@ | |
| 36 38 | 
             
            $stmt = $mysqli->prepare($sql);
         | 
| 37 39 | 
             
            $stmt->bind_param('is', $u_id, $pass);  // $userがintのつもり、stringなら'ss'を指定
         | 
| 38 40 | 
             
            $result = $stmt->execute();
         | 
| 39 | 
            -
            while ($row = $result->fetch_array(MYSQLI_ASSOC)){
         | 
| 41 | 
            +
            while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
         | 
| 40 42 | 
             
              echo $row['user_id']. '<br />';
         | 
| 41 43 | 
             
              echo $row['user_name']. '<br />';
         | 
| 42 44 | 
             
              echo $row['address']. '<br />';
         | 
4
加筆修正
    
        answer	
    CHANGED
    
    | @@ -43,4 +43,10 @@ | |
| 43 43 | 
             
              echo $row['pass']. '<br />';
         | 
| 44 44 | 
             
            } 
         | 
| 45 45 | 
             
            ```
         | 
| 46 | 
            -
            (あくまで机上、テストしてない。そして変数名とか勝手に直しといた)
         | 
| 46 | 
            +
            (あくまで机上、テストしてない。そして変数名とか勝手に直しといた)
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            あと、DBに格納されている文字列をhtml出力するのに、
         | 
| 49 | 
            +
            [htmlspecialchars](https://www.php.net/manual/ja/function.htmlspecialchars.php)()を使うことや、
         | 
| 50 | 
            +
            パスワード文字列を生のままデータベース上に保存したり比較したりするのではなく、
         | 
| 51 | 
            +
            例えば [password_hash](https://www.php.net/manual/ja/function.password-hash.php)() で加工して保持したものを、
         | 
| 52 | 
            +
            [password_verify](https://www.php.net/manual/ja/function.password-verify.php)() を使ってフォーム入力値と比較するということはよく見かけます。
         | 
3
見直し
    
        answer	
    CHANGED
    
    | @@ -24,19 +24,23 @@ | |
| 24 24 | 
             
            GROUP BYがおかしいのを直しましょう。
         | 
| 25 25 |  | 
| 26 26 | 
             
            ```php
         | 
| 27 | 
            +
            $u_id = $_POST["user_id"];
         | 
| 28 | 
            +
            $pass = $_POST["pass"]; 
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            $mysqli = new mysqli('localhost', 'root', '', '');
         | 
| 27 31 | 
             
            $sql = <<<EOT
         | 
| 28 32 | 
             
            select user_id, user_name, address, pass 
         | 
| 29 33 | 
             
            from user_data
         | 
| 30 34 | 
             
            WHERE user_id = ? AND pass = ?
         | 
| 31 35 | 
             
            EOT;
         | 
| 32 | 
            -
            $stmt = $ | 
| 36 | 
            +
            $stmt = $mysqli->prepare($sql);
         | 
| 33 | 
            -
            $stmt->bind_param('is', $ | 
| 37 | 
            +
            $stmt->bind_param('is', $u_id, $pass);  // $userがintのつもり、stringなら'ss'を指定
         | 
| 34 38 | 
             
            $result = $stmt->execute();
         | 
| 35 | 
            -
            while($row = $result->fetch_array(MYSQLI_ASSOC)){
         | 
| 39 | 
            +
            while ($row = $result->fetch_array(MYSQLI_ASSOC)){
         | 
| 36 40 | 
             
              echo $row['user_id']. '<br />';
         | 
| 37 41 | 
             
              echo $row['user_name']. '<br />';
         | 
| 38 42 | 
             
              echo $row['address']. '<br />';
         | 
| 39 43 | 
             
              echo $row['pass']. '<br />';
         | 
| 40 44 | 
             
            } 
         | 
| 41 45 | 
             
            ```
         | 
| 42 | 
            -
            (あくまで机上、テストしてない)
         | 
| 46 | 
            +
            (あくまで机上、テストしてない。そして変数名とか勝手に直しといた)
         | 
2
加筆修正
    
        answer	
    CHANGED
    
    | @@ -21,4 +21,22 @@ | |
| 21 21 |  | 
| 22 22 | 
             
            query() を使って fetch_array() する場面でエラーになるのは、
         | 
| 23 23 | 
             
            query() に失敗しているためなので、
         | 
| 24 | 
            -
            GROUP BYがおかしいのを直しましょう。
         | 
| 24 | 
            +
            GROUP BYがおかしいのを直しましょう。
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ```php
         | 
| 27 | 
            +
            $sql = <<<EOT
         | 
| 28 | 
            +
            select user_id, user_name, address, pass 
         | 
| 29 | 
            +
            from user_data
         | 
| 30 | 
            +
            WHERE user_id = ? AND pass = ?
         | 
| 31 | 
            +
            EOT;
         | 
| 32 | 
            +
            $stmt = $new_mysqli->prepare($sql);
         | 
| 33 | 
            +
            $stmt->bind_param('is', $user, $pass);  // $userがintのつもり、stringなら'ss'を指定
         | 
| 34 | 
            +
            $result = $stmt->execute();
         | 
| 35 | 
            +
            while($row = $result->fetch_array(MYSQLI_ASSOC)){
         | 
| 36 | 
            +
              echo $row['user_id']. '<br />';
         | 
| 37 | 
            +
              echo $row['user_name']. '<br />';
         | 
| 38 | 
            +
              echo $row['address']. '<br />';
         | 
| 39 | 
            +
              echo $row['pass']. '<br />';
         | 
| 40 | 
            +
            } 
         | 
| 41 | 
            +
            ```
         | 
| 42 | 
            +
            (あくまで机上、テストしてない)
         | 
1
見直し
    
        answer	
    CHANGED
    
    | @@ -17,4 +17,8 @@ | |
| 17 17 | 
             
            execute()
         | 
| 18 18 | 
             
            bind_result()
         | 
| 19 19 | 
             
            fetch()
         | 
| 20 | 
            -
            の流れを真似して実装を見直してください。
         | 
| 20 | 
            +
            の流れを真似して実装を見直してください。
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            query() を使って fetch_array() する場面でエラーになるのは、
         | 
| 23 | 
            +
            query() に失敗しているためなので、
         | 
| 24 | 
            +
            GROUP BYがおかしいのを直しましょう。
         | 
