无法进行身份验证的登录函数,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(),因此当它发送其变量时。它变为空。很抱歉,必须查看我的代码:(