php - php 只将数据库的第一行作为正确的凭据
问题描述
这是我登录论坛的代码。它的问题是它只接受第一个用户名和密码(基本上只有第一行)作为正确的凭据,关于我如何更改它的任何想法?!
<?php
session_start();
include_once("connect.php");
$token = "";
if($con->connect_error){
die("Connection failed: ".$con->connect_error);
}
$sql = "SELECT * FROM authme";
$result = mysqli_query($con, $sql) or die(mysqli_error($con));
while(mysqli_num_rows($result)>0){
while($row = $result->fetch_assoc()){
if(isset($_POST['realname']))
$username = $_POST['realname'];
if($result->num_rows>1){
if(mysqli_num_rows($result)>1){
$_SESSION['uid'] = $row['id'];
$_SESSION['realname'] = $row['realname'];
}
$password = '$SHA$'.substr($row['password'],5,16).'$'.hash('sha256', hash('sha256',$_POST['password']).substr($row['password'],5,16));
if($password == $row['password'] ){
header("Location: index.php");
exit();
}
else {
echo "INVALID INFORMATION, PLEASE RETURN!";
// header("location: index.php");
session_destroy();
exit();
}
}
}
}
?>
?
我决定尝试创建一个使用数据库的登录论坛,该数据库对通过注册表接收的密码进行加密。此代码仅将我输入的第一个用户名和密码视为正确,这还不够,正如您可以想象的那样。
解决方案
欢迎使用 PHP 编程。我将尝试分享一些可以帮助您解决问题的原则。
1.) PHP 中最好的特性之一是 print_r() 函数。使用此功能,您几乎可以在浏览器中将任何内容输出为文本。因此,在这种情况下,您可能希望在“$result = mysqli_query($con, $sql) or die(mysqli_error($con));”这一行之后立即插入一个 print_r($result)。这将输出 PHP 正在接收的查询结果。这可用于帮助您排除故障并确定您的代码无法正常工作的原因。完成故障排除后,删除该行。
2.) 您似乎对 while 循环内的行数进行了多次检查。我不确定你为什么在那里有这些,但你可能想通过使用 echo 或 print 在浏览器中显示值以进行故障排除来检查这些是否导致你的麻烦。完成故障排除后,删除该行。
3.) 您正在查询的数据的另一个整体概念。发送一个获取整个表并将其返回给程序的查询是低效的,然后程序会遍历每一行以查找数据。相反,您应该编写一个 SQL 查询以仅返回您想要的数据行。确保您使用准备好的语句。
4.) 你的编码标准可能会有所改进,如果你清楚地标记你的语句,它会更容易阅读。考虑阅读PSR-2。例如,此代码似乎缺少 {}。
if(isset($_POST['realname']))
$username = $_POST['realname'];
推荐阅读
- virtual-machine - 有没有办法使用 virt-manager 从内核和 initrd 创建 VM?
- php - PHP 无法完成正则表达式
- java - 如何通过 php 从数据库中获取 JSONarray 值并将 JSONarray 传送到列表视图?
- azure - Azure function app powershell 触发两次/三次
- c# - Addforce 不会击退我的玩家角色
- javascript - 打印后的 Javascript 事件
- hyperlink - 如何使用 RestructuredText 插入无标题的超链接?
- function - React Native ArrowFunction 针对正常功能(Appstate)
- r - 如何找到对应于 R 中 y 最大值一半的 x 值?
- android - Android房间没有正确删除缓存