0

好的,我有一个问题。我试图通过检查用户输入的电子邮件地址(用户名)和密码来验证用户的合法性。用户表具有以下列:

#   Name               Type          Collation      
     1  User_ID     int(10)UNSIGNED 
     3  Phone       bigint(10)              
     4  Street_Address  varchar(30)     latin1_swedish_ci       
     5  Apartment   int(5)              
     6  City        varchar(35)     latin1_swedish_ci            
     7  State       varchar(35)     latin1_swedish_ci           
     8  Zip_Code    int(5)              
     10 Login_Password  char(32)        latin1_swedish_ci               
     11 UserType    varchar(5)      latin1_swedish_ci   

在我验证了电子邮件和密码的输入并且它们满足了它们的约束之后。我将布尔变量“$insert”设置为 true。接下来我有以下PHP代码:

$check= "SELECT Name FROM users WHERE Email='$emailLogin' AND Login_Password='$passwordLogin'";

if(($result= ($db->query($check))) != false) // <--- PROBLEM HERE
     {
             $resultArray = $result->fetch();
             $name= $resultArray['Name'];

             $checkID= "SELECT User_ID FROM users WHERE Name= '$name'";
             $idResult= $db->query($checkID);

             if(count($idResult) >0)
             {
                $idArray= $idResult->fetch();
                $id= $idArray['User_ID'];
                    echo "userID is = ". $id;
                $_SESSION['user']= $name;
                $_SESSION['login']= true;
                $_SESSION['userID']= $id;
                //header('location:../view/userHome.php');
             }
             else
             {
                 include("../view/error.php?message=19");
                 exit();
             }
     }
     else
     {

         header("location: ../controller/login.php");
     }
}//end function

长话短说“if($result= ($db->query($check))) != false ”如果给我造成问题,我在上面的代码中有。如果找不到匹配的电子邮件地址和密码,我永远不应该输入 if 子句,但确实如此。有人可以帮我指出我的代码中的 FLAW 还是给我一个更好的检查方法。

以防万一您需要“database.php”文件,它是:

<?php
    $dsn = 'mysql:host=localhost;dbname=store';
    $username = 'alex';
    $password = 'asdf1234';

    try {
        $db = new PDO($dsn, $username, $password);
    } catch (PDOException $e) {
        $error_message = $e->getMessage();
        include('database_error.php');
        exit();
    }
?>
4

2 回答 2

0

数据库.php

<?php
$dsn = 'mysql:host=localhost;dbname=store';
$username = 'alex';
$password = 'asdf1234';
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
);
$db = new PDO($dsn, $username, $password, $opt);

请注意,不应该有专用database_error.php文件,而是错误处理程序显示的通用错误页面。

请注意对您的问题最重要的 ERRMODE 事物。它会告诉您查询实际上有什么问题。

这里是密码检查的正确代码,所有无用的代码都被删除了。

$sql = "SELECT Name, User_ID FROM users WHERE Email= ? AND Login_Password=?";
$stm = $db->prepare($sql);
$stm->execute([$emailLogin, $passwordLogin]);
if($row = $stm->fetch())
{
    $_SESSION['user']   = $row['name'];
    $_SESSION['userID'] = $row['id'];
    header('location:../view/userHome.php');
    exit();
}
else
{
    header("location: ../controller/login.php");
    exit();
}

长话短说:只有在查询错误的情况下,query() 结果才会为假。所以,你不能用它来检查密码。您必须改为检查获取的值。然而,它清楚地表明您的查询存在错误,您必须先修复它。

对同一个表运行 2 个查询以从同一行获取两个不同的值几乎没有意义。以及许多变量赋值。

哦,是的。切勿query()与动态构建的查询一起使用。您应该使用带有占位符的准备/执行。

于 2013-10-25T07:19:41.257 回答
-1

请尝试以下

数据库.php

$pdo = new PDO("mysql:host=localhost;dbname=store", 'alex', 'asdf1234');

登录页面

$_query = "SELECT Name, User_ID FROM users WHERE Email= :email AND Login_Password=:password";

$stmt = $pdo->prepare($_query); 
$stmt->bindparam(":email",$_POST['email']); 
$stmt->bindparam(":password",$_POST['password']);
$stmt->execute();
$total = $stmt->rowCount();
if($total > 0)
{
    //code here that you want   
}

于 2013-10-25T07:34:37.433 回答