2

私は mysqli に基づくいくつかのビデオ チュートリアルで Web サイトを作成することを学んでいます。準備済みステートメントを使用する方が安全であることがわかり、ログイン システムを作成しようとしています。これが私がこれまでに行ったことです。

このコードは、ログインを完全に成功させるのに役立ちます。

<form action ="" method="post">

User Name:<br/>
<input type='text' name='username' />
<br/><br/>
Password:<br/>
<input type='password' name='password' />
<br/><br/>
<input type='submit' name='submit' value='login'>
</form>
<?php

if(isset($_POST['submit'])){
    $username = $_POST['username'];
    $password = md5($_POST['password']);
    $stmt = $con->prepare("SELECT username, password FROM users WHERE username=? AND  password=? LIMIT 1");
    $stmt->bind_param('ss', $username, $password);
    $stmt->execute();
    $stmt->bind_result($username, $password);
    $stmt->store_result();
    if($stmt->num_rows == 1)  //To check if the row exists
        {
            while($stmt->fetch()) //fetching the contents of the row

              {$_SESSION['Logged'] = 1;
               $_SESSION['username'] = $username;
               echo 'Success!';
               exit();
               }
        }
        else {
            echo "INVALID USERNAME/PASSWORD Combination!";
        }
        $stmt->close();
    }
    else 
    {   

    }
    $con->close();
?>

ただし、ユーザーがアクティブ化されていないか、禁止または非アクティブ化されているかどうかも確認する必要があります。だから私は別のコードを作りました。

そして、ここに私が作ったコードがあります

<?php
if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = md5($_POST['password']);
$stmt = $con->prepare("SELECT username, password FROM users WHERE username=? AND    password=? LIMIT 1");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$stmt->bind_result($username, $password);
$stmt->store_result();
if($stmt->num_rows == 1)  //To check if the row exists
  {
 $result=$con->query($stmt);
            $row=$result->fetch_array(MYSQLI_ASSOC);
            $user_id= $row['user_id'];
            $status = $row['status'];
            if($status=='d'){
                echo "YOUR account has been DEACTIVATED.";
            }else{
                $_SESSION['Logged'] = 1;
                $_SESSION['user_id'] = $user_id;
                $_SESSION['username'] = $username;
                echo 'Success!';
               exit();
            }
        }
        else {
            echo "INVALID USERNAME/PASSWORD Combination!";
        }
        $stmt->free_result();
        $stmt->close();
        
    }
    else 
    {   

    }
 $con->close();
 ?>

これを使用すると、次のエラーが発生します

警告: mysqli::query() は、パラメーター 1 が文字列であると想定します。オブジェクトは、33 行目の F:\XAMPP\htdocs\login\login.php で指定されます。

致命的なエラー: 34 行目の F:\XAMPP\htdocs\login\login.php の非オブジェクトに対するメンバー関数 fetch_array() の呼び出し

データベーステーブルの列があります

user_id、ユーザー名、パスワード (md5)、user_level、ステータス。

user_level の下に、次のものがあります

a = admin
m = member

アンダーステータス

a = activated
n = not activated
d = deactivated
b = banned

ログイン中に、ユーザーのステータスとアクティブ化されている場合はインデックスページに移動するか、ユーザーが非アクティブ化されているかを確認する必要があります。

準備されたステートメントでそれを行う方法は?

そして、私はこのconnect.phpをすべてのページに持っています

?php
//error_reporting(0);
'session_start';
$con = new mysqli('localhost', 'username', 'password', 'database');
if($con->connect_errno > 0){
die('Sorry, We\'re experiencing some connection problems.');
}
?>
4

1 に答える 1

10

mysqli_ の仕組みを調べる必要があると思います。これにより、正しい方向に進むはずです。

if(isset($_POST['submit'])){
    $username = $_POST['username'];
    $password = md5($_POST['password']);
    $user_id = 0;
    $status = ""

    $stmt = $con->prepare("SELECT user_id, username, password, status FROM users WHERE username=? AND password=? LIMIT 1");
    $stmt->bind_param('ss', $username, $password);
    $stmt->execute();
    $stmt->bind_result($user_id, $username, $password, $status);
    $stmt->store_result();
    if($stmt->num_rows == 1)  //To check if the row exists
        {
            if($stmt->fetch()) //fetching the contents of the row
            {
               if ($status == 'd') {
                   echo "YOUR account has been DEACTIVATED.";
                   exit();
               } else {
                   $_SESSION['Logged'] = 1;
                   $_SESSION['user_id'] = $user_id;
                   $_SESSION['username'] = $username;
                   echo 'Success!';
                   exit();
               }
           }

    }
    else {
        echo "INVALID USERNAME/PASSWORD Combination!";
    }
    $stmt->close();
}
else 
{   

}
$con->close();
于 2013-07-03T16:13:35.873 に答える