2013-10-25 59 views
0

好的我有個問題。我試圖通過檢查他們輸入的電子郵件地址(用戶名)和密碼來驗證用戶的合法性。用戶表具有以下列:SQL PDO Query()方法

# 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 

長話短說「如果($結果=($ DB->查詢($檢查)))=假的!」這是我在上面的代碼,如果造成了我問題。如果沒有找到匹配的電子郵件地址和密碼,我不應該輸入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(); 
    } 
?> 

回答

0

database.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(); 
} 

長話短說:查詢()結果只會在查詢錯誤的情況下是錯誤的。所以,你不能用它來檢查密碼凋謝的方式。您必須檢查提取的值。然而它清楚地說,你的查詢有一個錯誤,你必須先解決。

對同一個表運行2個查詢以從同一行獲取兩個不同的值是沒有意義的。以及許多變量分配。

哦,是的。切勿使用動態構建的查詢來使用query()。您應該使用佔位符的準備/執行代替。

+0

你的常識,我真的很感謝你的幫助。感謝您詳細解釋清楚的答案。 – user2917241

-1

請嘗試以下

database.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 
}