是否有一种方法来添加优先级php echo消息?



这是jlogin .php

<?php
error_reporting(-1);
session_start();
require_once('config.php');

$email = $_POST['email'];
$username = $_POST['username'];
$password = $_POST['password'];
$isValid = true;
if (empty($password)) {
echo 'You need to enter a Password';
$isValid = false;
}
if (empty($username)) {
echo 'You need to enter a Username';
$isValid = false;
}
if (empty($email)) {
echo 'You need to enter a Email Address';
$isValid = false;
}elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "You need to have a valid Email Address";
$isValid = false;
}
if ($isValid) {
$sql = "SELECT * FROM accounts WHERE username=? and password=? and email=? LIMIT 1";
$stmtselect = $db->prepare($sql);
$result = $stmtselect->execute([$username, $password, $email]);
$user = $stmtselect->fetch(PDO::FETCH_ASSOC);
if ($stmtselect->rowCount() > 0) {
$_SESSION['accounts'] = $user;
echo 'You have signed in successfully!';
} else {
echo 'Incorrect Username or Password or Email';
}
}

这是login.php

<?php 
error_reporting(-1);
session_start();

if(isset($_SESSION['hello_world_accounts'])){
header("Location: index.php");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Programming Knowledge Login</title>
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href="css/styles.css">
</head>
<body>
<div class="container h-100">
<div class="d-flex justify-content-center h-100">
<div class="user_card">
<div class="d-flex justify-content-center">
<div class="brand_logo_container">
<img src="img/logo.png" class="brand_logo" alt="Programming Knowledge logo">
</div>
</div>  
<div class="d-flex justify-content-center form_container">
<form method="post">
<div class="input-group mb-2">
<div class="input-group-append">
<span class="input-group-text"><em class="fas fa-user"></em></span>                 
</div>
<input type="text" name="username" id="username" class="form-control input_user" placeholder="Username" required>
</div>
<div class="input-group mb-2">
<div class="input-group-append">
<span class="input-group-text"><em class="fas fa-key"></em></span>                  
</div>
<input type="password" name="password" id="password" class="form-control input_pass" placeholder="Password" required>
</div>
<div class="input-group mb-1">
<div class="input-group-append">
<span class="input-group-text"><em class="fas fa-inbox"></em></span>                    
</div>
<input type="email" name="email" id="email" class="form-control input_pass" placeholder="Email" required>
</div>
<div class="form-group">
<div class="custom-control custom-checkbox">
<input type="checkbox" name="rememberme" class="custom-control-input" id="customControlInline">
<label class="custom-control-label" for="customControlInline">Remember me</label>
</div>
</div>

</div>
<div class="d-flex justify-content-center mt-1 login_container">
<button type="button" name="button" id="login" class="btn login_btn">Login</button> 
</div>
</form>
<div class="mt-3 mb-1">
<div class="d-flex justify-content-center links">
Don't have an account? <a href="registration.php" class="ml-2">Sign Up</a>
</div>
<div class="d-flex justify-content-center">
<a href="#">Forgot your password?</a>
</div>
</div>
</div>
</div>
</div>
<script src="http://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<script type="text/javascript" src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script>
$(function(){
$('#login').click(function(e){
var valid = this.form.checkValidity();
if(valid){
var username = $('#username').val();
var password = $('#password').val();
var email = $('#email').val();
}
e.preventDefault();
$.ajax({
type: 'POST',
url: 'jslogin.php',
data:  {username: username, password: password, email: email},
success: function(data){
alert(data);
if($.trim(data) === "1"){
setTimeout(' window.location.href =  "index.php"', 1000);
}
},
error: function(data){
alert('There were errors while doing the operation.');
}
});
});
});
</script>
</body>
</html>

这是config .php

<?php
error_reporting(-1);
$db_user = "root";
$db_pass = "";
$db_name = "hello_world_accounts";
$db = new PDO('mysql:host=localhost;dbname='. $db_name . ';charset=utf8', $db_user, $db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

这是index.php

<?php 
error_reporting(-1);
session_start();
if(!isset($_SESSION['hello_world_accounts'])){
header("Location: login.php");
}
if(isset($_GET['logout'])){
session_destroy();
unset($_SESSION);
header("Location: login.php");
}
?>
<!DOCTYPE>
<html lang="en">
<head>
<title>Welcome</title>
</head>
<body>
<p>Welcome to index</p>

<a href="index.php?logout=true">Logout</a>
</body>
</html>

每次我输入我的电子邮件,但不是我的用户名和密码,它说我需要把所有三个,即使一个已经在里面了为什么会发生这种情况,我该如何解决?我考虑过优先级,但我不知道该怎么做或怎么做……

页面上其余的代码如下

请不要说有明文密码。

这是我的测试mysql。我的测试这是我的测试网站。我的考试网站

这是通过格式化程序运行时的原始代码。你应该注意到,正如人们所指出的,它像疯了一样缩进,并且有很多嵌套。您还对每个请求查询数据库,即使数据无效。

$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$valid = "You need to have a valid Email Address";
$sql = "SELECT * FROM accounts WHERE username=? and password=? and email=? LIMIT 1";
$stmtselect  = $db->prepare($sql);
$result = $stmtselect->execute([$username, $password, $email]);
if (stripos($password, '')) {
echo 'You need to enter a Password';
} else {
if (stripos($username, '')) {
echo 'You need to enter a Username';
} else {
if (stripos($email, '')) {
echo 'You need to enter a Email Address';
} else {
if (!stripos($email, '@')) {
echo $valid;
} else {
if (!stripos($email, '.')) {
echo $valid;
} else {
if (!stripos($email, 'com')) {
echo $valid;
} else {
if ($result) {
$user = $stmtselect->fetch(PDO::FETCH_ASSOC);
if ($stmtselect->rowCount() > 0) {
$_SESSION['accounts'] = $user;
echo 'You have signed in successfully!';
} else {
echo 'Incorrect Username or Password or Email';
}
} else {
echo 'There were errors while connecting to database.';
}
}
}
}
}
}
}

相反,这里有一个快速清理的尝试。主要的变化是切换到empty()检查,使用elseif,一个更好的电子邮件地址验证器,并将查询移动到最后的else子句。

$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
if (empty($password)) {
echo 'You need to enter a Password';
} elseif (empty($username)) {
echo 'You need to enter a Username';
} elseif (empty($email)) {
echo 'You need to enter a Email Address';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "You need to have a valid Email Address";
} else {
$sql = "SELECT * FROM accounts WHERE username=? and password=? and email=? LIMIT 1";
$stmtselect = $db->prepare($sql);
$result = $stmtselect->execute([$username, $password, $email]);
$user = $stmtselect->fetch(PDO::FETCH_ASSOC);
if ($stmtselect->rowCount() > 0) {
$_SESSION['accounts'] = $user;
echo 'You have signed in successfully!';
} else {
echo 'Incorrect Username or Password or Email';
}
}

编辑

如果您的意图是显示多个错误消息,而不仅仅停留在第一个(如您的原始代码所做的),那么您可以使用多个if块。大多数人会将错误信息收集到一个数组中,但我将留给您自己决定。

$isValid = true;
if (empty($password)) {
echo 'You need to enter a Password';
$isValid = false;
}
if (empty($username)) {
echo 'You need to enter a Username';
$isValid = false;
}
if (empty($email)) {
echo 'You need to enter a Email Address';
$isValid = false;
}elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "You need to have a valid Email Address";
$isValid = false;
}
if ($isValid) {
$sql = "SELECT * FROM accounts WHERE username=? and password=? and email=? LIMIT 1";
$stmtselect = $db->prepare($sql);
$result = $stmtselect->execute([$username, $password, $email]);
$user = $stmtselect->fetch(PDO::FETCH_ASSOC);
if ($stmtselect->rowCount() > 0) {
$_SESSION['accounts'] = $user;
echo 'You have signed in successfully!';
} else {
echo 'Incorrect Username or Password or Email';
}
}

编辑

如果您没有在<form>上提供method,则默认为GET。然而,您的代码期望它是POST。将表单更改为<form method="post">

编辑

我不打算使用你的任何HTML,相反,我要做一个非常简单的表单,post到自己。这是你在使用任何web语言编程时学习的一个非常常见的第一项任务。这个页面本身,忽略你的数据库,样式和JS逻辑应该100%自己工作。一旦您证明了这一点,您就可以开始使用会话和AJAX来增强它。从简单的开始。

表单不包括正常设置,如required或字段的最佳类型,因为我只是试图保持它尽可能简单。

我确实添加了errors数组,它消除了$isValid的需要,因为我们现在可以检查错误是否包含任何内容。

请单独尝试这段代码,一旦你知道它是如何工作的,然后开始修改它,如果你真的需要,可能会在这里提出新的问题。

<?php
$errors = false;
$email = '';
$username = '';
$password = '';
if ('POST' === $_SERVER['REQUEST_METHOD']) {
$email = $_POST['email'];
$username = $_POST['username'];
$password = $_POST['password'];
$errors = [];
if (empty($password)) {
$errors[] = 'You need to enter a Password';
}
if (empty($username)) {
$errors[] = 'You need to enter a Username';
}
if (empty($email)) {
$errors[] = 'You need to enter a Email Address';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "You need to have a valid Email Address";
}
}
if ($errors) {
echo '<pre>';
echo implode(PHP_EOL, $errors);
echo '</pre>';
}
?>
<form method="post">
<label>Email <input type="text" name="email" value="<?php echo htmlspecialchars($email); ?>"/></label><br/>
<label>Username <input type="text" name="username" value="<?php echo htmlspecialchars($username); ?>"></label><br/>
<label>Password <input type="password" name="password"></label><br/>
<input type="submit" value="Submit">
</form>

最新更新