0

ユーザーログインページ(phpを学ぶための基本的なトレーニング)を設定しようとしていますが、行数を数える部分に問題があると思うので、ページが機能していません(行数を確認します入力されたログインとパスワードが入力されたものと一致するuser_tableデータベースは=1)。

私はPDOにいますが、非推奨になっているものを使用したくないmysql_num_rows少なくとも使用しないことをお勧めします。代わりに使いたいFound_rows

これが私のlogin_page.phpです:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
    <title>LOGIN PAGE</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>Connect to your account</h1>
    <form method="post" action="login_verify.php">
        <input type="text" name="inputed_username" size="35" maxlength="30" required="required" value="Enter your login" /><br/><br/>
        <input type="password" name="inputed_password" size="35" maxlength="30" required="required" value="Enter your password" /><br/><br/>
        <input type="submit" name="submit "value="Connect me !" />         
    </form>
</body>
 </html>

{login,password}次に、このlogin_verify.phpファイルに入力されたものが正しいかどうかを確認するphpファイルを次に示します。

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
    <title>login process check-up</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
    if (isset($_POST['submit']))//if the button submit has not been clicked on
    {
        try
        {
            //database connection          
            $dbhost     = "localhost";
            $dbname     = "test";
            $dbuser     = "root";
            $dbpass     = "";

            $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
            $bdd = new PDO("mysql:host=$dbhost;dbname=$dbname; charset=UTF8",$dbuser,$dbpass,$pdo_options);
            $bdd -> query('SET NAMES utf8'); 

            //the database is checked to see if there is a match for the couple {user,password}

            $user = $_POST['inputed_username'];
            $password = $_POST['inputed_password'];
            //preparaiton and execution of the request
            $req = $bdd->prepare('SELECT * from user_table WHERE login= :login && password= :password LIMIT 1');
            $req->execute(array(
            'login' => $user,
            'password' => $password));
            $foundrows = $req->query("SELECT FOUND_ROWS()")->fetchColumn();//the number of rows are counted

            //we check if there is a match for the login-password
            if ($foundrows == 1)//if we find one that matches
            {
                session_start();
                $_SESSION['username'] = $req['login'];
                $_SESSION['fname'] = $req['first_name'];
                $_SESSION['lname'] = $req['last_name'];
                $_SESSION['logged'] = TRUE;
                header("Location: first_page.php");
                exit();
            }
            else //if we don't find any match
            {
                header("Location: login_page.php");
                exit;
            }
        }
        catch (Exception $e)
        {
            die('Erreur: '.$e->getMessage());
        }

    }
    else //if the submit button has  not been clicked on
    {
        header ("Location: login_page.php");
        exit;
    }
?>

問題がどこにあるかを知っている人がいれば、それは素晴らしいことです。

これはfound_rowsの誤用によるものだと思います。初めて使うので、何かひどい感じがしますが、それが何なのかわかりません。

4

1 に答える 1

1

FOUND_ROWS()選択クエリにオプションがあった選択クエリの後に使用する場合にのみ機能しSQL_CALC_FOUND_ROWS、LIMITクエリの場合にのみ本当に役立ちます。FOUND_ROWS()は、limit句がない場合に返される行の数です。

SELECT SQL_CALC_FOUND_ROWS ... WHERE ... LIMIT 10
SELECT FOUND_ROWS()

制限のないクエリの場合は、mysql_num_rows()代わりにを使用します。

おそらく、データベースはloginプライマリ/一意キーフィールドであるように設定されているため、クエリはとにかく最大で1行しか返さないため、制限は無意味です。

于 2012-07-14T22:11:05.290 に答える