我正在尝试使用php和mysql创建一个登录表单,并且在过去的3天内失败了。
我基本上都是php表单,并且在同一页面上有用于将用户登录到网站的脚本。
form.php的
<form id="superAdminForm" method="post" action="">
<input type="email" name="email" required class="txtInput" placeholder="Email..." autocomplete="off"/> <br />
<input type="password" name="password" required class="txtInput" placeholder="Password..."/> <br />
<input type="submit" name="submit" value="Enter" id="submit" />
</form>
form.php的php代码
<?php
require("../php_includes/db-connect.php");
if (isset($_POST["submit"])) {
$email = $_POST["email"];
$password = $_POST["password"];
$sql = "SELECT * FROM users WHERE email='$email' AND password='$password' LIMIT 1";
$query = mysqli_query($con, $sql);
$row = mysqli_fetch_array($query);
if ($row['email'] == 1) {
header("Location: admin-index.php");
}
}
mysqli_close($con);
?>
问题是登录没有成功。我不知道背后的原因。所以请帮助我。还指导我在哪里犯错误。
我是PHP新手,我正尽力应对自己的知识。
答案 0 :(得分:1)
我认为您需要做的是将您的视图逻辑与您的身份验证逻辑分开。将PHP块移动到自己的文件中,并将表单的action参数设置为该文件(相对位置)。
这是因为所有这些php代码都是在发送到客户端之前由服务器解释的,因此这个表单实际上不能在同一页面中使用该PHP逻辑。
如果身份验证失败会将您重定向到登录页面(或您想要的任何地方),您可能还想写一个后备,否则用户将会留下白屏。
修改强>
正如其他人所说,你应该研究安全性,尤其是挂钩$_SESSION
。您的代码也需要一些工作。我认为$row['email'] == 1
永远不会成真,所以你的剧本会失败并最终无所作为。再次,添加else语句来处理身份验证失败。
就修复而言,我建议在if中比较$row['email'] == $email
,但这也会使您的SQL查询中的电子邮件检查变得多余。我建议重组你的逻辑。
答案 1 :(得分:1)
1 .. 谈论安全性
您的代码容易受到sql injection的攻击,因此即使它无效,
也是如此 ' or '1'='1' /* '
会做魔术
所以要么使用mysqli_real_escape_string功能要手动转义字符串中的特殊字符,要么使用 prepared statements和参数化查询(推荐)。
2 .. email='$email' AND password='$password' LIMIT 1";
那么为什么电子邮件不应该是唯一的,要么在登录时检查电子邮件是否已经存在 如果存在,则显示错误消息(电子邮件已存在)
所以你不需要使用limit 1
这是没有意义的
3 .. 为什么不在SESSION
中设置登录ID或其他内容,以便您可以确定已记录使用
您的上述登录脚本不执行任何操作,只需检查天气电子邮件和密码是否存在于数据库中
4 .. 将文字计划为密码是非常糟糕的主意而是使用哈希检查此How do you use bcrypt for hashing passwords in PHP?
好读
答案 2 :(得分:0)
rows=mysqli_num_rows( $query);
if ($rows == 1) {
header("Location: admin-index.php");
}
您正在将数组与int进行比较,请使用上面的代码。