我希望你做得很好。我的项目中有登录功能。当我尝试登录时它给了我这个奇怪的错误,我没有在login.php脚本中写。我把它写在其他地方并没有对它进行导入。我希望你们能帮助我找出问题所在。
先谢谢。干杯,
我的一些有用的代码:
Login.php脚本:
Timeout
我的loginFunctions.php类:
<?php
include_once 'Header.php';
?>
<style>
#container {
height: 92vh;
}
</style>
<div id="container">
<br>
<?php
$_SESSION['logged'] = null;
//in this page we do things slightly differently - the code for validation and displaying messages is done
//before we display the form
echo '<div id = "div_1"><h1>Login</h1>';
//display the form
echo '<div id="div_2"><div id="div_2">
<form action="Login.php" method="post">
<label>Email<br>
<span class="small">enter your Email</span>
</label>
<input type="text" name="Email" value=""/>
<label><br>Password<br>
<span class="small">enter your password</span>
</label>
<input type="password" name="Password" />
<button type="submit" name="submit" value="Login" />Log in</button>
<input type ="hidden" name="submitted" value="1">
</form>
</div>
</div>';
if (isset($_POST['submitted'])) {
//require_once is similar to 'include' but ensures the code is not copied multiple times
require_once('LoginFunctions.php');
$name3 = $_POST['Email'];
$pwd3 = $_POST['Password'];
echo $name3;
echo $pwd3;
//list() is a way of assigning multiple values at the same time
//checkLogin() function returns an array so list here assigns the values in the array to $check and $data
list($check, $data) = checkLogin($_POST['Email'], $_POST['Password']);
if ($check) {
setcookie('FName', $data['FName'], time() + 900); //cookie expires after 15 mins
setcookie('LName', $data['LName'], time() + 900);
//
//use session variables instead of cookies
//these variables should now be available to all pages in the application as long as the users session exists
$_SESSION['FName'] = $data['FName'];
$_SESSION['LName'] = $data['LName'];
$_SESSION['Email'] = $data['Email'];
//to enable $_SESSION array to be populated we always need to call start_session() - this is done in header.php
//print_r is will print out the contents of an array
print_r($_SESSION);
//
//Redirect to another page
$url = absolute_url('Index.php'); //function defined in Loginfunctions.php to give absolute path for required page
$_SESSION['logged'] = TRUE;
echo $_SESSION['logged'];
//this version of the header function is used to redirect to another page
echo "<script>setTimeout(\"location.href = '" . $url . "';\",10000);</script>"; //since we have entered correct login details we are now being directed to the home page
exit();
} else {
$errors = $data;
}
}
//create a sopace between the button and the error messages
//echo'<div class="spacer"></div>';
if (!empty($errors)) {
echo '<br/> <p class="error">The following errors occurred: <br />';
//foreach is a simplified version of the 'for' loop
foreach ($errors as $err) {
echo "$err <br />";
}
echo '</p>';
}
//this is the end of the <div> that contains the form
echo '</div>';
/* */
?>
</div>
<?php
include 'Footer.php';
?>
答案 0 :(得分:1)
mysqli_affected_rows
用于返回受插入,更新和删除操作影响的行。对于select语句,您必须使用mysqli_num_rows
if($r) {
if(mysqli_num_rows($r) != 0){
$row = mysqli_fetch_array($r, MYSQLI_ASSOC);
return array(true, $row);
}else {
$errors[] = 'Passwords do not match';
}
}
为了更好的安全性:您可以使用password_hash()函数来增强密码,然后匹配您在字段中保存的哈希值(Password-数据类型将是varchar,长度为255)。您使用password_verify()函数匹配此哈希,该函数有两个参数:用户键入的字符串和保存在数据库中的哈希值。
例如:
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
将打印:
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
当用户使用rasmuslerdorf作为密码登录时,您使用password_verify查询数据库并将存储的哈希密码$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
与rasmuslerdorf
匹配:
$q= mysqli_query($dbc, "SELECT Password FROM `Users_1`
WHERE `Email` = '$Email' and `Password` = '$password'");
$res = mysqli_fetch_assoc($q);
$hash = $res['Password'];
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
答案 1 :(得分:0)
这是一个相当非技术性的答案,但它包含了我根据自己的经验提出的建议。
当我刚学习HTML并且对php或javascript没有真正的想法时,我会花费数小时试图弄清楚登录是如何工作的。
过了一会儿,我发现了php和javascript,我有一个朋友的php登录脚本继续。
我设法让数据库正常工作,但注册并不是我发布this问题的原因。
最终我的登录工作正常,但是我的有限知识意味着我可以将人们(和朋友)的私人信息(例如他们在其他地方使用的密码)存储在可能存在重大缺陷的网站上。
现在不要误会我的意思,我不是说不要这样做我只是说你做研究。花时间观看这样的视频:
https://www.youtube.com/watch?v=8ZtInClXe1Q
如何不存储密码! - Computerphile
然后花更多时间做一些不涉及密码的数据库查询。
一旦你对如何使用查询有了很好的理解,并且对自己的查询有信心,就开始在php中研究hashing方法。
请查看:
Salting your passwords 您实际上是随意添加的 正在进行哈希处理的密码的字符,以便您无法使用 用于反转散列密码的散列表。
SQL Injection ,人们使用表单上的输入(名称字段或任何其他字段)来更改问题的语法,并基本上将代码添加到您的网站。这很危险,因为它们可以(取决于用户拥有的权限)删除表,删除数据库,选择*以及许多其他有害的东西。在前面提到的关于&#34;如何不存储密码的视频中也提到了这个主题!&#34;。
Do more research (不要仅使用不包含所有内容的链接)...当您存储人员信息时,您永远不会太安全。不要将这些提示视为过度使用,将其视为对用户的责任,他们可以相信密码不会发生任何变化!