1

ログイン/ログアウト/メンバーページのオンラインビデオの例を使用して、Web サイトに実装しようとしています。私はjusthostからライブサーバーを持っています.dbを作成し、ユーザーテーブルにダミーのユーザー情報を入れました。私はまさにそれを行う connect.php ファイルを作成し、それが私のデータベースに接続し、それが機能した場合、成功メッセージをエコーアウトしました。会員ページへのリンクを表示するためにログインしようとすると、入力した電子メールが見つからないというエラー メッセージが引き続き表示されますが、電子メールはデータベース テーブルにあります。私は何を間違っていますか?これが login.php ファイルです。長くなってすみません。

<?php
error_reporting (E_ALL ^ E_NOTICE);
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Member System - Login</title>
</head>
<body>

    <?php

        $form = "<form action='./login.php' method='post'>
        <table>
        <tr>
            <td>Email:</td>
            <td><input type='text' name='user'/></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type='password' name='password'/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type='submit' name='loginbtn' value='Login' /></td>
        </tr>
        </table>
        </form>";

    if($_POST['loginbtn']){
        $email = $_POST['user'];
        $password = $_POST['password'];

        if ($email){
            if ($password){
                require("connect.php");

                $password = md5(md5("sdf5jkl".$password."jfdkSDf4"));

                $query = mysql_query("SELECT * FROM users WHERE email='$email'");
                $numrows = mysql_num_rows($query);
                if($numrows == 1){
                    $row = mysql_fetch_assoc($query);
                    $dbid = $row['id'];
                    $dbpass = $row['password'];
                    $dbemail = $row['email'];
                    $dbactive = $row['active'];

                    if($password == $dbpass){
                        if($dbactive == 1){
                            //set session info
                            $_SESSION['id'] = $dbid;
                            $_SESSION['email'] = $dbemail;

                            echo "You have been logged in as <b>$dbemail</b>.  <a href='./member.php'>Click here</a> to go to the member page.";

                        }
                        else
                            echo "You must activate your account to login. $form";
                    }
                    else
                        echo "You did not enter the correct password. $form";
                }
                else
                    echo "The email you entered was not found. $form";

                mysql_close();
            }
            else
                echo "You must enter your password. $form";
        }
        else
            echo "You must enter your email. $form";
    }
    else
        echo $form;

    ?>

</body>
</html>
4

2 に答える 2

1

コードのほぼ半分に、次の行があります。

$query = mysql_query("SELECT * FROM users WHERE email='$email'");
$numrows = mysql_num_rows($query);

一時的に次のように変更しましょう。

$sql = "SELECT * FROM users WHERE email='$email'";
echo '<pre>'. $sql .'</pre>';
$query = mysql_query($sql);
$numrows = mysql_num_rows($query);
echo '<pre>'. $numrows .'</pre>';

今すぐログインしようとすると、おそらくページの上部に次のようなものが表示されます。

SELECT * FROM users WHERE email='thenamethatijusttypedin'
2

数値が 1 の場合、コードは記述どおりに機能するはずです。数値がそれ以外の場合は、その上に SQL クエリをコピーして、データベース プラットフォーム (例: phpMyAdmin) で実行することで詳細を確認できます。

他の人が以前に述べたように、入力をクリーンアップする必要があります。コマンドを使用して、先頭と末尾の空白を削除できますtrim($email);

コーディングに少し自信がついたら、PDOと呼ばれるデータベース クエリ ツールを検討する必要があります。現在、クエリは SQL インジェクションと呼ばれるものに対して脆弱です。userフィールドにアポストロフィを入れると、クエリが壊れてしまいます。ハッカーはこれを使用して、Web サイトに侵入することができます。PDO はこれを防ぎ、クエリの作成を少し簡単にします。

于 2012-12-11T15:48:23.730 に答える
1

ユーザーを見つけられないという点で、コードに問題はありません。ここでいくつか試してみてください。

$email = $_POST['user'];
$password = $_POST['password'];

次のようにする必要があります。

$email = mysql_real_escape_string(trim($_POST['user']));
$password = mysql_real_escape_string(trim($_POST['password']));

trim()クエリを台無しにする可能性のある余分なスペースを削除し、mysql_real_escape_string()特殊文字をエスケープします。

チェックしてデータを正しく取得してprint_r($_POST)おり、クエリを実行echo "SELECT * FROM users WHERE email='$email'";またはSELECT * FROM users WHERE email='your_email'phpmyadminで実行しても問題ないように見える場合は、ユーザーテーブルに重複したメールがある可能性がありますか? もしそうなら、すべきではありません。重複を削除してみてください。また、メールをチェックすると同時にパスワードもチェックする必要があります。次に例を示します。

$query = mysql_query("SELECT * FROM users WHERE email = '$email' AND password = '$password'");

于 2012-12-11T15:49:23.680 に答える