无法进行身份验证的登录函数,PHP
你好,我很难理解为什么我的身份验证一直失败。我尝试了很多调试方法,我想我被难住了。请记住,我还是一个初学者,现在安全不是问题。我只是想让它工作 因此,对于我的注册脚本,我让用户输入用户名和密码无法进行身份验证的登录函数,PHP,php,sql,authentication,login,Php,Sql,Authentication,Login,你好,我很难理解为什么我的身份验证一直失败。我尝试了很多调试方法,我想我被难住了。请记住,我还是一个初学者,现在安全不是问题。我只是想让它工作 因此,对于我的注册脚本,我让用户输入用户名和密码 $username = $_POST['username']; $password = $_POST['password']; //正在保存的Post数据 $createTable = $db->prepare("CREA
$username = $_POST['username'];
$password = $_POST['password'];
//正在保存的Post数据
$createTable = $db->prepare("CREATE TABLE `$username` (Title varchar(40) ,
About varchar(1000) ,
Chapter int(4),
Img varchar(100) ,
Url varchar(50)) ");
$createTable->execute();
///为用户创建一个表
$Register = $db->prepare("INSERT INTO library (id,
username, password) VALUES ($id ,
'$username','$password')");
$Register ->execute();
//将数据插入到库表中。库中有用户和密码
echo 'user sucessfully registered';
$_SESSION['user'] = $username;
$_SESSION['pass'] = $password;
我遇到的问题是对登录进行身份验证。
使用两个会话变量作为参数调用登录函数
function login($SentUser , $SentPass)
{
echo 'trying to log in '.'<br>';
require_once 'Connection.php';
$user = $SentUser;
$pass = $SentPass;
/// check data base for match user and pass
$sth = $db->prepare('SELECT username , password from `library` where username = ? And password = ? ');
$sth->bindParam(1, $user);
$sth->bindParam(2, $pass);
$sth->execute();
while ($row = $sth->fetch(PDO::FETCH_ASSOC))
{
echo 'user : ' . $row['username'] , '<br>';
echo 'pass: ' . $row['password'] , '<br>';
echo '<br>';
}
.
// fetchcolumn returns true false if select took a row or not.
if($sth->fetchColumn() != false) { /// This is where the code fails as it almost always goes to the else case.
$_SESSION['user'] = $user;
$_SESSION['pass'] = $pass;
$_SESSION['passed'] = TRUE;
echo 'Welcome '.$user.'<br>';}
else
{
echo 'failed authenticate'.'<br>';
}
函数登录($SentUser,$SentPass)
{
回显“正在尝试登录”。
;
需要一次'Connection.php';
$user=$SentUser;
$pass=$SentPass;
///检查数据库中是否有匹配的用户和密码
$sth=$db->prepare('从'library'中选择用户名、密码,其中用户名=?和密码=?');
$sth->bindParam(1,$user);
$sth->bindParam(2$pass);
$sth->execute();
而($row=$sth->fetch(PDO::fetch_ASSOC))
{
回显“用户:”.$row[“用户名”],“
”;
回显“pass:”.$row[“password”],“
”;
回声“
”;
}
.
//如果select是否获取行,则FETCHTCOLUMN返回true false。
如果($sth->fetchColumn()!=false){///这就是代码失败的地方,因为它几乎总是转到else的情况。
$\会话['user']=$user;
$\会话['pass']=$pass;
$\u会话['passed']=TRUE;
回显“欢迎”。$user.
;}
其他的
{
回显“身份验证失败”。
;
}
为了更加清晰,这里是正在调用的connection.php。它基本上只是将我连接到数据库,并提供$db对象
<?php
$config['db'] = array(
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'mywebsite'
);
$db = new PDO('mysql:host=' . $config['db']['host']. ';dbname=' . $config['db']['dbname'] , $config['db']['username'] , $config['db']['password']);
?>
您提到的
库
表有用户/密码。因此,每个用户必须只有一行。更改代码如下:
if($sth->rowCount() == 1) {
//row exists, so user exists
$row = $sth->fetch(PDO::FETCH_ASSOC);
echo 'user : ' . $row['username'] , '<br>';
echo 'pass: ' . $row['password'] , '<br>';
echo '<br>';
//set session
$_SESSION['user'] = $user;
$_SESSION['pass'] = $pass;
$_SESSION['passed'] = TRUE;
echo 'Welcome '.$user.'<br>';
} else {
//auth failed
echo 'failed authenticate'.'<br>';
}
if($sth->rowCount()==1){
//行存在,所以用户存在
$row=$sth->fetch(PDO::fetch\U ASSOC);
回显“用户:”.$row[“用户名”],“
”;
回显“pass:”.$row[“password”],“
”;
回声“
”;
//设置会话
$\会话['user']=$user;
$\会话['pass']=$pass;
$\u会话['passed']=TRUE;
回显“欢迎”。$user.
;
}否则{
//身份验证失败
回显“身份验证失败”。
;
}
为什么要为每个用户创建一个表?这个网站只是跟踪用户输入的特定信息。因此每个用户都有自己的表。这不是最有效的方法。谢谢,你能告诉我我做错了什么吗。我对sql函数仍然是新手,在while($row=$sth->fetch(PDO::fetch\u ASSOC))行中
,您已经提取了行。现在将没有行可提取。因此,如果($sth->fetchColumn()!=false){
将始终返回false
因此,当您选择某个内容时,您会将其放入保留区。当您获取该内容时,它会将其从保留区中取出?我刚才看到的另一个问题是,我愚蠢地忘了在register.php上包含session_start(),因此当它发送其变量时。它变为空。很抱歉,必须查看我的代码:(