

PHPでECサイトを作成しております。  
正しい(データベースに登録されているものと一致)ユーザ名とパスワードを入力してログインできる機能を作成しておるのですが、  
[![画像の説明をここに入力](https://i.stack.imgur.com/p4fL1.png)](https://i.stack.imgur.com/p4fL1.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/aLXZT.png)](https://i.stack.imgur.com/aLXZT.png)

上手くログインすることが出来ません。  
var_dumpを確認したのですが、配列に値が格納しているようみ見えるのにログインできません。  
SQL文の書き方が違うのでしょうか。  
もしくは値の返し方が正しくないのでしょうか。  
お手数おかけしますがご教授お願い致します

データベースの中身  
[![画像の説明をここに入力](https://i.stack.imgur.com/UCyID.png)](https://i.stack.imgur.com/UCyID.png)

ソースコード  
functions.php

[code]

    <?php
    require_once('../../include/conf/const.php');
    
    function get_db_connect() {
     
    if (!$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD, DB_NAME)) {
            die('error: ' . mysqli_connect_error());
        }
        mysqli_set_charset($link, DB_CHARACTER_SET);
        return $link;
    }
    
    function close_db_connect($link) {
    
        mysqli_close($link);
    }
    
    function insert_item($link) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        return;
    }
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'insert') {
            
            if (isset($_POST['name']) === TRUE) {
                
                $new_name = $_POST['name'];
            }
            $code = mt_rand(100000000,999999999)*10+mt_rand(0,9);
            
            if (isset($_POST['price']) === TRUE) {
            
                $new_price = $_POST['price'];
                
            }
            
            if (isset($_POST['stock']) === TRUE) {
                
                $new_stock = $_POST['stock'];
            }
            
            $img_path = '../file/';
            $filename = $_FILES['new_img']['name'];
           
            move_uploaded_file($_FILES['new_img']['tmp_name'], $img_path.$filename);
            $new_img = $img_path.$filename;
            
            
            if (isset($_POST['status']) === TRUE) {
            if ((int) $_POST['status'] === 0 || (int) $_POST['status'] === 1) {
                 
                 $new_status = (int) $_POST['status'];
            }
                
            }
            
                $new_time = date('Y-m-d H:i:s');
                
                $sql = 'INSERT INTO item_tb(name, code, price, stock, img, status, created_date, updated_date) VALUES(\''.$new_name.'\',\''.$code.'\',\''.$new_price.'\',\''.$new_stock.'\',\''.$new_img.'\',\''.$new_status.'\',\''.$new_time.'\',\''.$new_time.'\')';
    
                if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                    
                    
                } 
                
              
              }
        }
        
    
    
            
    function update_item($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'update') {
            if (isset($_POST['item_id']) === TRUE) {
                
                (int)$item_id = (int)$_POST['item_id'];
                
            }
            if (isset($_POST['stock']) === TRUE) {
                    (int)$update_stock = (int)($_POST['stock']);
                    $sql = 'UPDATE item_tb SET stock = ' . $update_stock. ' Where id =' . $item_id;
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                    } else {
                       $err_msg[] = 'DBエラーが発生しました。';
                       return $err_msg;
                    }
                    }
            }
    }
    
    
    
    
    
    function change_item($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'change') {
             if (isset($_POST['item_id']) === TRUE) {
                
                (int)$item_id = (int)$_POST['item_id'];
            }
            
            if (isset($_POST['change_status']) === TRUE) {
                if ((int) $_POST['change_status'] === 0 || (int) $_POST['change_status'] === 1) {
                    $change_status = (int) $_POST['change_status'];
                    $sql = 'UPDATE item_tb SET status = ' . $change_status. ' Where id =' . $item_id;
    
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                        
                    } else {
                        $err_msg[] = 'ステータスの変更に失敗しました';
                    }
                } else {
                    $err_msg[] = 'ステータスは公開か非公開を選択してください';
                    return $err_msg;
                }
            }
        }
        
    }
    
    function delete_item($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'delete') {
            
             if (isset($_POST['item_id']) === TRUE) {
                 
                (int)$item_id = (int)$_POST['item_id'];
                
            }
            if (isset($_POST['delete']) === TRUE) {
                    $sql = 'DELETE FROM item_tb Where id =' . $item_id;
    
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                        
                    } else {
                        $err_msg[] = '削除に失敗しました';
                    return $err_msg;
                }
            }
        }
        
    }
    
    
    function do_sql($link) {
        $sql = 'SELECT item_tb.id, item_tb.name, item_tb.price, item_tb.stock, item_tb.img, item_tb.status
        FROM item_tb';
        $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
        return $data;
    }
    
    function complete_check_insert($link) {
        $complete_msg[] = '追加登録完了!';
        return $complete_msg;
    }
    
    function complete_check_update($link) {
        $complete_msg[] = '在庫数更新完了!';
        return $complete_msg;
    }
    
    function complete_check_change($link) {
        $complete_msg[] = 'ステータス変更完了!';
        return $complete_msg;
    }
    
    function complete_check_delete($link) {
        $complete_msg[] = '削除完了!';
        return $complete_msg;
    }
    
    function complete_check_entry($link) {
        $complete_msg[] = '新規登録完了!';
        return $complete_msg;
    }
    
    function validation_check($link) {
       $err_msg = [];
       if (!isset($_POST['name']) || (isset($_POST['name']) && $_POST['name'] === ""))  {
         $err_msg[] = '商品名を入力してください。';
        }
        
        if (!isset($_POST['price']) || (isset($_POST['price']) && $_POST['price'] === "")) {
         $err_msg[] = '値段を入力してください';
        } else if(preg_match('/^[0-9]+$/',($_POST['price'])) !== 1) {
         $err_msg[] = '値段は0以上の半角整数を入力してください';
        }
        
        if (!isset($_POST['stock']) || (isset($_POST['stock']) && $_POST['stock'] === "")) {
         $err_msg[] = '在庫を入力してください';
        } else if(preg_match('/^[0-9]+$/',($_POST['stock'])) !== 1) {
         $err_msg[] = '在庫は0以上の半角整数を入力してください';
        }
        
        if ($_FILES['new_img']['size'] === 0) {
         $err_msg[] = '画像を選択してください';
        }
        
         if ($_FILES['new_img']['size'] !== 0) {
         $chk_picture = getimagesize($_FILES['new_img']['tmp_name']);
    
                    if ($chk_picture['mime'] !== 'image/png' && $chk_picture['mime'] !== 'image/jpeg') {
    
                         $err_msg[] = '画像ファイルはjpegかpngにしてください';
                        }
         }
                             
        
        if (!empty($_POST['status'])) {
        if ((int) $_POST['status'] === 2) {
         $err_msg[] = 'ステータスは公開か非公開を選択してください'; 
        }
        }
        
    return $err_msg;
    }
    
    function stock_validation_check($link) {
     $err_msg = [];
    if(preg_match('/^[0-9]+$/',($_POST['stock'])) !== 1) {
         $err_msg[] = '在庫は0以上の半角整数を入力してください';
        }
        return $err_msg;
    }
        
    
    
    function insert_entry($link) {
    
    $user  = get_post_data('user');
    $password = get_post_data('password');
    $new_time = date('Y-m-d H:i:s');
           
    $sql = 'INSERT INTO user_tb(user, password, created_date, updated_date) VALUES(\''.$user.'\',\''.$password.'\',\''.$new_time.'\',\''.$new_time.'\')';
    
    $data = [];
    
    if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                } else {
                    $err_msg[] = 'DBエラーが発生しました。';
                    return $err_msg;
                }
    }
    
    function select_entry($link) {
    $sql = 'SELECT user_tb.user, user_tb.password, user_tb.created_date, user_tb.updated_date FROM user_tb ';
    $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
        return $data;
    }
    
    function validation_check2($link) {
        $err_msg = [];
        $user = $_POST['user'];
        $password = $_POST['password'];
        
        if (!isset($user) || (isset($user) && $user === "")) {
         $err_msg[] = 'ユーザ名を入力してください';
        } else if (preg_match('/[^A-Za-z0-9]/', $user)) {
         $err_msg[] = 'ユーザ名は半角英数字で入力してください';
        } else if (mb_strlen($user) <= 5) {
         $err_msg[] = 'ユーザ名は6文字以上で入力してください';
        } else if ($user === $user) {
         $err_msg[] = '同じユーザ名は登録できません。';
        }
        
        if (!isset($password) || (isset($password) && $password === "")) {
         $err_msg[] = 'パスワードを入力してください';
        } else if (preg_match('/[^A-Za-z0-9]/', $password)) {
         $err_msg[] = 'パスワードは半角英数字で入力してください';
        } else if (mb_strlen($password) <= 5) {
         $err_msg[] = 'パスワードは6文字以上で入力してください';
        }
        
        return $err_msg;
    }
    
    function login_logic($link , $user) {
        $sql = 'SELECT user FROM user_tb where \''.$user.'\' = user';
        $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
        return $data;
        
    }
    
    function login_logic2($link , $password) {
        $sql = 'SELECT password FROM user_tb where \''.$password.'\' = password';
        $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
        return $data;
        
    }
    
    function insert_cart($link) {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        return;
    }
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'cart') {
                $code = 0;
                $amount = 0;
                $name = "";
                $new_time = date('Y-m-d H:i:s');
                
                $sql = 'INSERT INTO cart_tb(name, code, amount, created_date, updated_date) VALUES(\''.$name.'\',\''.$code.'\',\''.$amount.'\',\''.$new_time.'\',\''.$new_time.'\')';
    
                if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                    
                    
                } 
                
              
              }
        }
        
        function update_item_code($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'cart') {
                
                $sql = 'UPDATE cart_tb SET cart_tb.code = (SELECT item_tb.code FROM item_tb WHERE item_tb.id = cart_tb.id)';
    
                if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                    
                    
                } 
                
              
              }
        }
        
        function update_item_name($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'cart') {
                
                $sql = 'UPDATE cart_tb SET cart_tb.name = (SELECT item_tb.name FROM item_tb WHERE item_tb.id = cart_tb.id)';
    
                if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                    
                    
                } 
                
              
              }
        }
        
        function update_cart($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'cart') {
            if (isset($_POST['id_s']) === TRUE) {
                
                (int)$id_s = (int)$_POST['id_s'];
                $amount = +1;
            }
    
                
                $sql = 'UPDATE cart_tb SET amount = ' . $amount;
                
                if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                    
                    
                } 
                
              
              }
        
    
    
    
    
         
         
    }
    
[/code]

login.php

[code]

    <?php
    require_once('../../include/conf/const.php');
    require_once('../../include/model/functions.php');
    
    session_start();
    $link = get_db_connect();
    
    if (isset($_POST['login'])) {
        $user  = $_POST['user'];
        $password = $_POST['password'];
        $err_msg = [];
        $user_login = login_logic($link , $user);
        $password_login = login_logic2($link , $password);
        
        var_dump($user);
        var_dump($password);
        var_dump($user_login);
        var_dump($password_login);
    
    if ($user ===  $user_login && $password === $password_login) {
        print "a";
    // } else if ($user !==  $user_login) {
    //   $err_msg['user'] = 'ユーザ名が一致しません。'; 
           
    //   } else if ($password !== $password_login) {
    //   $err_msg['password'] = 'パスワードが一致しません。';
    // }
    }
    
    
    if ($user === '') {
        $err_msg['user'] = 'ユーザ名を入力してください。';
    }
    
    if ($password === '') {
        $err_msg['password'] = 'パスワードを入力してください。';
    }
        
    if (count($err_msg) !== 0)  {
         $_SESSION = $err_msg;
        header('Location: login.php');
        return;
        }
    }
    
    // $result2 = login_logic2($password);
    
    require_once('../../include/view/login2.php');
    
    close_db_connect($link);
    
[/code]

login2.php

[code]

    <?php
    
    $err_msg = $_SESSION;
    
     $_SESSION = array();
     
     session_destroy();
    ?>
    
    
    <!DOCTYPE html>
    <html lang="ja">
    <head>
       <meta charset="UTF-8">
       <title>ログイン</title>
       <style>
           input {
               display: block;
               margin-bottom: 10px;
           }
       </style>
    </head>
    <body>
       <form action="login.php" method="post">
           <label for="user">ユーザ名</label>
           <input type="text" id="user" name="user" value="">
           <?php if (isset($err_msg['user'])) : ?>
           <p><?php echo $err_msg['user']; ?></p>
           <?php endif;?>
           <label for="passwd">パスワード</label>
           <input type="password" id="password" name="password" value="">
           <?php if (isset($err_msg['password'])) : ?>
           <p><?php echo $err_msg['password']; ?></p>
           <?php endif;?>
           <input type="submit"  name="login" value="ログイン">
       </form>
    
     <a href='../../mvc/userinsert.php'>ユーザ登録ページ</a>
    </body>
    </html>
    
[/code]

const.php

[code]

    <?php
    $err_msg = [];
    $complete_msg = [];
    $data = [];
    $user = "";
    $password = 0;
    
    define('DB_HOST',   '');
    define('DB_USER',   '');
    define('DB_PASSWD', '');
    define('DB_NAME',   '');
    
    define('HTML_CHARACTER_SET', 'UTF-8');
    define('DB_CHARACTER_SET',   'UTF8');
    
    date_default_timezone_set('Asia/Tokyo');
    
[/code]


CC BY-SA 4.0
2021-12-18T05:19:10.107
85208
2021-12-20T00:29:43.757
2021-12-18T05:39:32.797
32986
50555
question
php
ログイン機能がうまく作用しない。


プログラムの問題の以前に  
そもそも内部設計（プログラムの実装の考え方）が間違っています

パスワードとユーザIDを別々に抜き出して評価してしまうと、ログインの認証がおかしくなります。

今はユーザIDとパスワードをそれぞれSQLで抜き出してそれが一致していればログインできるという実装のようですが、これだと

例えば  
ユーザID loginidA パスワード 123  
ユーザID loginidB パスワード 234  
とあった場合に

ユーザID loginidA パスワード 234  
と入力すると  
どちらもフィールドに値は存在するのでログインできてしまいます。

やるべきは  
SQL時にユーザIDとパスワードを同時に評価する必要があります。  
ヒントとしては以下のSQLです。

[code]

    SELECT `user` FROM `user_tb` WHERE `user` = ? AND `password` = ?
    
[/code]

このSQLであれば必ずユーザIDとパスワードが同時に一致するものしか取得できません。  
そして該当のレコードが一つ取れればログイン認証可能。なければログイン認証失敗です。  
これを踏まえてlogin_logic関数を作ってみてはいかがでしょうか？

あと余談ですがパスワードは必ずハッシュ化しましょう。  
この回答では冗長になるので省略させてもらいますが、  
php ハッシュ化  
mysql ハッシュ化  
等で調べればいくつも記事が出てきます。  
エンジニアであれば必須の知識ですので是非習得してください


CC BY-SA 4.0
2021-12-20T00:29:43.757
85233
2021-12-20T00:29:43.757
22665
85208
answer