我试图达到使用相同的php控制器文件的登录页面和注册页面的程度。当输入site.com/?login时,会显示登录页面(已完成),然后当用户暂时提交登录页面时,我希望它显示“已授予/拒绝的访问权限”。注册页面也是如此(site.com/?registeration转到注册页面,提交将打印出是否成功)。我遇到了一个问题,当提交任何一个页面时,它都没有显示我期望的输出。
<?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页面只是一个回显&$ 39输出和$ error的简单页面。
关于我做错的任何想法?我是PHP的新手,这个代码的大部分内容都遵循了使用PHP构建自己的数据库驱动的网站。的MySQL。
答案 0 :(得分:2)
提交表单的action
目标是什么?如果它包含查询字符串,则代码将无法像您希望的那样工作:
<form method="post" action="?login">...</form>
这是因为PHP将始终解析查询字符串(?
之后的URL中的所有内容),即使请求实际使用POST
动词。
因此, $_GET
请求中您不能依赖POST
为空。
(您使用if(isset($_GET['login']))
)
但是,您可以使用另一个超全局字段来获取请求方法:
if($_SERVER['REQUEST_METHOD'] == 'POST') {
// Form has been submitted
} else {
// Not a POST request, proabably GET
}
可以在PHP.net
上找到文档<小时/> 修改1
此外, nick bonnet 的答案也适用于此
您无法通过action
或$_GET
访问表单元素的$_POST
属性(也不能访问任何其他属性)。
那些只包含已解析的查询字符串($_GET
)和 - POST
请求 - 已解析的请求正文($_POST
;这是由浏览器使用name
构建的和value
的孩子的form
属性
<小时/> 修改2
建议我如何构建这个“应用程序”(保持?xy
URL格式):
<?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';
}
?>
表单和表单提交现在共享相同的网址(?login
或?registration
),并通过请求方法区分(GET
表单,POST
表示subission)
答案 1 :(得分: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'])