sql >> データベース >  >> RDS >> Mysql

簡単なPHPSQLログインのトラブルシューティング

    まず、開発中のエラーの処理が非常に重要であるため、投稿が存在するかどうかを確認し、データベースに接続しているかどうかを確認し、クエリが合格して実行に問題がないかどうかを確認し、クエリを実行し、最終的にクエリを実行します。

    その後、bind_resultを使用できます 私が行ったように、クエリからフィールドを受け取る変数に名前を付けます。

    私のクエリでどのように使用しているかに注意してください。これは、bind_paramを使用して定義するプリペアドステートメントです。 これはSQLインジェクションを回避するためです。現在のコードでは、変数をサニタイズしていないため、SQLインジェクションは引き続き可能です。

    あなたがしていると私が信じるもう一つの間違いは、パスワードを非常に間違ったプレーンテキストとして保存することです。ユーザーとあなた自身を保護するために、常にパスワードを暗号化する必要があります。そのため、MySQLクエリにパスワードを含めません。最初にユーザーのみを使用します。ユーザーが見つかった場合は、彼が投稿したパスワードを使用して、データベースから取得したパスワードと一致させます。この場合は、bcrypt 非常に安全な暗号化ライブラリであるタスクを実行します。

    こちらをご覧くださいbcryptの使い方 。

    パスワードが有効であることを確認した後でのみ、データをセッションに配置し、ユーザーをリダイレクトします。

    回答の下部で指摘したすべてのエラーに加えて、コードの記述方法は次のとおりです。

    <?php
    session_start();
    include_once('bcrypt.php');
    // Your database info
    $db_host = '';
    $db_user = '';
    $db_pass = '';
    $db_name = '';
    
    if (!isset($_POST['Username']))
    {
        echo 'Fill in the username...';
        exit;
    }
    
    if (!isset($_POST['Password']))
    {
        echo 'Fill in your password...';
        exit;
    }
    
    $con = new mysqli($db_host, $db_user, $db_pass, $db_name);
    if ($con->connect_error)
    {
        die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
    }
    
    $sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
    if (!$result = $con->prepare($sql))
    {
        die('Query failed: (' . $con->errno . ') ' . $con->error);
    }
    
    if (!$result->bind_param('s', $_POST['Username']))
    {
        die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
    }
    
    if (!$result->execute())
    {
        die('Execute failed: (' . $result->errno . ') ' . $result->error);
    }
    
    $result->store_result();
    if ($result->num_rows == 0)
    {
        die('No username found...');
    }
    
    $result->bind_result($db_username, $db_password);
    $result->fetch();
    $result->close();
    $con->close();
    
    $bcrypt = new Bcrypt(15);
    if ($bcrypt->verify($password, $db_password))
    {
        $_SESSION['Username'] = $db_username;
        header('location:login_success.php');
        exit;
    }
    else
    {
        echo 'Wrong Username or Password';
    }
    

    注:上記のコードは単なる例であり、テストされていません。エラーに気付いた場合はお知らせください。

    あなたが投稿したコードで私が気付いたエラーのいくつか:

    終了の;がありません ここ:

    $sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
    

    また、クエリには$Membersがあります ただし、$Membersはありません コード内の任意の場所で定義された変数、おそらくMembersと言うつもりでしたか 代わりに、次のようになります:

    $sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
    

    これはすべきではありません

    $count = mysql_num_rows($result);
    

    $count = mysqli_num_rows($result);‌
    

    そして

    $result=mysqli_query($sql); 
    

    $result=mysqli_query($sql_connection, $sql);
    

    mysqli_queryの以下の部分にクエリはありません

    if (!mysqli_query($sql_connection)) 
    



    1. 2017年4月1日から2日までオーストリアのウィーンで開催されたMicrosoftAccessDevCon

    2. sqlAlchemyを使用したスト​​アドプロシージャ

    3. MySQLロードエラーを修正するにはどうすればよいですか

    4. ストアドプロシージャを作成せずに、Oracleで複数の行を1つに連結するにはどうすればよいですか?