尽管在这个网站上检查了这个主题,但我无法弄清楚出了什么问题:我在html和php文件中开发了一个表单来处理这个表单 - 请参阅下面的代码(事实上,这些代码我直接从例如http://www.phpro.org/tutorials/Basic-Login-Authentication-with-PHP-and-MySQL.html)。
问题:当我没有填写必填字段(用户名或密码)时,PHP代码应该显示“请输入有效的用户名和密码”,但似乎代码开头的isset()函数也是即使尚未填写必填字段,也返回TRUE? (例如,代码表示以下错误消息“用户名长度不正确”)
请你的帮助。提前谢谢。
html表单: “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> PHPRO登录
<body>
<h2>Login Here</h2>
<form action="login_submit1.php" method="post">
<fieldset> <p> <label for="username">Username</label> <input type="text" id="username"
name="username" value="" maxlength="20" /> </p>
<p> <label for="password">Password</label> <input type="text" id="password"
name="password" value="" maxlength="20" /> </p> <p> <input type="submit" value="→ Login"
/> </p> </fieldset> </form>
</body>
</html>
...和php文件的相关部分:
/*** begin our session ***/
session_start();
//! include lib after session_start()
include 'test_ecis_lib_pdo.php';
/*** check if the users is already logged in ***/
if(isset( $_SESSION['user_id'] ))
{
$message = 'Users is already logged in';
}
/*** check that both the username, password have been submitted ***/
****if(!isset( $_POST['username'], $_POST['password']))
{
$message = 'Please enter a valid username and password';
}
/*** check the username is the correct length ***/
elseif (strlen( $_POST['username']) > 20 || strlen($_POST['username']) < 4)
{
$message = 'Incorrect Length for Username';
}
/*** check the password is the correct length ***/
elseif (strlen( $_POST['password']) > 20 || strlen($_POST['password']) < 4)
{
$message = 'Incorrect Length for Password';
}
答案 0 :(得分:0)
所有这些验证都没有意义。只需摆脱它们并继续进行SQL查询。
像所有教程一样,你链接的是一个完整的垃圾。它必须是什么:
<?php
/*** begin our session ***/
session_start();
$message = '';
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
include 'db.php';
$username = $_POST['phpro_username'];
$password = sha1( $_POST['phpro_password'] );
/*** prepare the select statement ***/
$sql = "SELECT phpro_user_id FROM phpro_users
WHERE phpro_username = ? AND phpro_password = ?";
$stmt = $dbh->prepare($sql);
/*** execute the prepared statement ***/
$stmt->execute(array($username, $password));
$user_id = $stmt->fetchColumn();
if($user_id)
{
/*** set the session user_id variable ***/
$_SESSION['user_id'] = $user_id;
header("Location: profile.php");
exit;
}
$message = 'Incorrect login or password';
}
?>
<html>
<head>
<title>PHPRO Login</title>
</head>
<body>
<h2>Login Here</h2>
<p><?php echo $message; ?>
<form action="login_submit.php" method="post">
<fieldset>
<p><label for="phpro_username">Username</label>
<input type="text" name="phpro_username" value="" maxlength="20" /> </p>
<p> <label for="phpro_password">Password</label>
<input type="text" name="phpro_password" value="" maxlength="20" /> </p>
<p> <input type="submit" value="→ Login" /> </p>
</fieldset>
</form>
</body>
和db.php
<?
$mysql_hostname = 'localhost';
$mysql_username = 'mysql_username';
$mysql_password = 'mysql_password';
$mysql_dbname = 'phpro_auth';
$dsn = "mysql:host=$mysql_hostname;dbname=$mysql_dbname";
$opt = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$dbh = new PDO($dsn, $mysql_username, $mysql_password, $opt);
答案 1 :(得分:0)
字段可能具有空字符串的值。使用empty
构造:if( empty( $_POST['username'] ) )
。我不是空的狂热粉丝,因为它将以下条件视为“空”:未定义的数组索引(好),空字符串(好),空值(好),假值(好)和数字零(不要不喜欢。
答案 2 :(得分:0)
如果您在测试之前添加var_dump($_POST);
语句,则会注意到您的表单会为$_POST['username']
和$_POST['password']
发送空字符串。
您可能应该对此进行测试:
if (empty($_POST['username']) || empty($_POST['password']))
答案 3 :(得分:0)
您正在检查用户是否在首次检查时登录,然后才允许他们使用用户名和密码登录哇。因此,如果第二个用户尝试使用相同的浏览器登录,则忽略尝试登录。同样isset( $_SESSION['user_id'] )
意味着它已设置但我可能是空的。
一旦用户设置了帐户,您就不必重新检查用户/密码长度,如果您更愿意停止数据库查询,则可能只是用户。如果你在第3和第4次检查中检查长度,那么在第二次检查中是否有issset(user/pass)
是没有意义的。