0

同じphpコントローラーファイルを使用して、ログインページと登録ページを作成しようとしています。site.com/?login が入力されると、ログイン ページが表示されます (これが行われます)。ユーザーがログイン ページを送信すると、「アクセス許可/拒否」が表示されます。同じことが登録ページにも当てはまります (site.com/?registration は登録ページに移動し、送信は成功したかどうかにかかわらず出力されます)。いずれかのページが送信されたときに、期待する出力が表示されないという問題が発生しています。

<?php
include $_SERVER['DOCUMENT_ROOT'] . 'includes/db_connection.php';

/*********************Registration page code***************************/
if (isset($_GET['register']))
{
    $action = 'register_form';
    include 'register.html.php';
    exit();
}

if (isset($_POST['action']) and $_POST['action'] == 'register_form') {
    $username = mysqli_real_escape_string($connection, $_POST['username']);
    $email = mysqli_real_escape_string($connection, $_POST['email']);
    $password = mysqli_real_escape_string($connection, $_POST['password']);

    $output = 'Username: ' . $username . ' Email: ' . $email . ' Password: ' . $password;

    $sql = 'INSERT INTO user (username,email,password) VALUES
            ("'. $username .'","'. $email .'","'. $password .'")';

    if (!mysqli_query($connection, $sql))
    {
        $error = 'Error registering user: ' . mysqli_error($connection);
        include 'output.html.php';
        exit();
    }

    include 'output.html.php';
    exit();
}
/*************************************************************************/

if (isset($_GET['login']))
{
    $action = 'login_form';
    include 'login.html.php';
    exit();
}

if (isset($_POST['action']) and $_POST['action'] == 'login_form' )
{
    $username = mysqli_real_escape_string($connection, $_POST['username']);
    $password = mysqli_real_escape_string($connection, $_POST['password']);

    $output = 'Username: ' . $username . ' Password: ' . $password;

    $sql = 'SELECT COUNT(*) FROM user WHERE username="'.$username.'" AND password="'.$password.'"';
    $result = mysqli_query($link, $sql);
    if (!$result)
    {
        $error = 'Error seeing if user exists in the DB.';
        include 'output.html.php';
        exit();
    }   

    $num = mysqli_num_rows($result);
if($num > 0) {
        $output .= '\nAccess Granted!';
    } else {
        $output .= '\nAccess Denied! Please register first...';
    }

    include 'output.html.php';
    exit();
}

$output = 'Database connection established.<br/>Server root: ' . $_SERVER['DOCUMENT_ROOT'];
include 'output.html.php';
?>

以下のコードは私の登録ページです (ログインページは非常に似ています):

<?php include_once $_SERVER['DOCUMENT_ROOT'] .
        '/includes/helpers.inc.php'; ?>
<!DOCTYPE html>
<html>
    <head>
        <title>Registration</title>
        <!--link type="text/css" rel="stylesheet" href="stylesheet.css"/-->
    </head>
    <body>  
        <div id="content">
            <form id="registration_form" method="POST" action="?<?php htmlout($action); ?>">

                <label for="username-id">Username:</label>
                <input id="username-id" type="text" name="username" autofocus="autofocus" /><br/><br/>

                <label for="email-id">Email:</label>
                <input id="email-id" type="email" name="email" /><br/><br/>

                <label for="password1-id">Password:</label>
                <input id="password1-id" class="text-input" type="password" name="password" /><br/><br/>

                <label for="password2-id">Retype Password:</label>
                <input id="password2-id" class="text-input" type="password" name="password_repeat" /><br/><br/>

                <input type="submit" value="Register"/>
            </form>
        </div>
    </body>
</html>

output.html.php ページは、$output と $error をエコーする単純なページです。

私が間違っていることについてのアイデアはありますか? 私は PHP を初めて使用しますが、このコードのほとんどは、PHP と MySQL を使用して独自のデータベース駆動型 Web サイトを構築するという本に従っています。

4

2 に答える 2

2

action提出フォームのターゲットは何ですか? クエリ文字列が含まれている場合、コードは意図したとおりに機能しません。

<form method="post" action="?login">...</form>

これは、リクエストが実際に動詞を使用している場合でも、PHP が常にクエリ文字列( に続く URL 内のすべて) を解析するためです。?POST

したがって、requestで空であることを当てにすることはできません$_GETPOST
(これは で行いますif(isset($_GET['login'])))

ただし、別のスーパーグローバルのフィールドを使用してリクエスト メソッドを取得することはできます。

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Form has been submitted
} else {
    // Not a POST request, proabably GET
}

ドキュメントはPHP.netにあります。


編集 1

また、ニック・ボンネットの回答もここに当てはまります。またはを介し​​てフォーム要素の属性 (およびその他の属性) に
アクセスすることはできません。action$_GET$_POST

これらには、解析されたクエリ文字列 ( $_GET) と -POSTリクエストの場合 - 解析されたリクエスト本文 ( ; これは、 との子の属性を使用し$_POSTてブラウザによって構築されます) のみが含まれます。namevalueform


編集 2

この「アプリケーション」をどのように構成するかを提案します(?xyURL形式を維持します):

<?php

/* DB connection and bootstrapping code goes here */

if(isset($_GET['login'])) {
    if('POST' == $_SERVER['REQUEST_METHOD']) {
        // FORM HAS BEEN SUBMITTED,
        // process user input (login credentials) and display a message
    } else {
        // Assume GET or HEAD,
        // display login form
    }
}
elseif (isset($_GET['registration'])) {
    if('POST' == $_SERVER['REQUEST_METHOD']) {
        // FORM HAS BEEN SUBMITTED,
        // process user input (registration data) and display a message
    } else {
        // Assume GET or HEAD,
        // display registration form
    }
}
else {
    // No page found
    include '404.html.php';
}

?>

フォームとフォーム送信は同じ URL (?loginまたは?registration) を共有し、リクエスト メソッド (GETフォームの場合、サブミッションの場合) によって区別されるようにPOSTなりました。

于 2013-10-24T19:48:22.290 に答える
0

チェックしているから

   and $_POST['action'] == 'register_form') 

しかし実際には

    <form id="registration_form" method="POST" action="?<?php htmlout($action); ?>">

あなたはそれを送っています

    $_GET['action']

追加する必要があります

    <input type="hidden" name="action" value="register_form" />

または条件を次のように変更します

   and isset($_GET['register_form'])
于 2013-10-24T19:45:58.513 に答える