gpt4 book ai didi

php - 准备好的 PDO 语句在设置变量后中断代码

转载 作者:行者123 更新时间:2023-11-30 21:53:54 25 4
gpt4 key购买 nike

我从我的其他项目中获取了一个登录脚本,并正在为我当前的项目设置它。创建数据库(它没有条目)并将文件上传到 FTP 后,我转到了 INDEX 页面,但在我尝试使用不正确的详细信息登录一次后,没有任何反应,通常它应该显示一条消息说“不正确的凭据”但它没有。我在代码中的不同位置设置了 echo 命令,并设法将错误缩小到一行。该行将名为 $sql 的变量设置为准备好的 SELECT 语句,出于某种原因,这将停止代码,因为任何 echo 命令放在后面那不会运行。关于发生了什么以及如何解决它的任何想法?或者你们认为跟进更多会更好吗login system ?这似乎包括也有助于安全的 token 。

        // Confirm login
echo "1";
include("config.php");
$username = $_POST['username'];
$password = $_POST['pass'];
if(isset($_POST) && $username != '' && $password != ''){
echo "2".$username;
$sql = $dbh->prepare("SELECT id,password,psalt FROM users WHERE username=?");
echo "3";
$sql->execute(array($username));
if($sql->rowCount() > 0) {
while($result = $sql -> fetch()){
$pass = $result['password'];
$p_salt = $result['psalt'];
$id = $result['id'];
}
echo "3";
$site_salt="salthashhere";
$salted_hash = hash('sha256',$password.$site_salt.$p_salt);
if($pass == $salted_hash){
echo "5";
$_SESSION['user'] = $id;
header("Location:home.php");
} else {
echo "<h2>Username/Password is Incorrect.</h2>";
echo "<a href='register.php'>Register Here</a>";
}
}

最佳答案

需要注意的一件事 rowCount()SELECT 语句中使用时不能保证提供准确的结果,它通常用于返回受影响的行数由相应的 PDOStatement 对象执行的最后一个 DELETEINSERTUPDATE 语句。

在您的情况下选择后,您可能需要将所有结果作为数组获取,然后使用 count()方法来计算返回的元素数量。

所以试试下面的代码:

<?php
// Confirm login
echo "1";
include("config.php");
$username = $_POST['username'];
$password = $_POST['pass'];
if (isset($_POST) && $username != '' && $password != '') {
echo "2" . $username;
$sql = $dbh->prepare("SELECT id,password,psalt FROM users WHERE username=?");
echo "3";
$sql->execute(array($username));
$result = $sql->fetchall(); //fetch all results as array
if (count($result) > 0) {
foreach ($result as $key => $row) {
$pass = $row['password'];
$p_salt = $row['psalt'];
$id = $row['id'];

echo "3";
$site_salt = "salthashhere";
$salted_hash = hash('sha256', $password . $site_salt . $p_salt);
if ($pass == $salted_hash) {
echo "5";
$_SESSION['user'] = $id;
header("Location:home.php");
} else {
echo "<h2>Username/Password is Incorrect.</h2>";
echo "<a href='register.php'>Register Here</a>";
}
}//end foreach

} else {
// account does not exist
echo "<h2>account does not exist.</h2>";
echo "<a href='register.php'>Register Here</a>";
}
}
?>

PS : You might wanna look and take the advantage of php builtin password_hash() and password_verify() they are much more secured.

关于php - 准备好的 PDO 语句在设置变量后中断代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46033572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com