2012-05-28 60 views
0

好的..我完全是這個PDO的東西..我試圖重新創建我的mysql腳本(工作)到一個PDO腳本(不工作)..我測試了我的數據庫登錄信息是正確編程爲PDO ..PDO驗證登錄數據

這是我的PDO腳本...

<? 

session_start(); 
//connect to DB 
require_once("connect.php"); 

//get the posted values 
$email=htmlspecialchars($_POST['email'],ENT_QUOTES); 
$pass=md5($_POST['psw']); 

//now validating the email and password 
$sql - $conn_business->prepare("SELECT email, password FROM members WHERE email='".$email."'"); 
$sql -> execute(); 
$count = $sql->rowCount(); 
$result = $sql -> fetch(); 
// Now use $result['rowname']; 

$stmt = $conn_business->prepare("SELECT * FROM members WHERE email='".$email."'"); 
$stmt ->execute(); 
$act = $stmt -> fetch(); 

//if email exists 
if($count > 0) 
{ 
//compare the password 
if(strcmp($result["password"],$pass)==0) 
{ 
    // check if activated 
    if($act["activated"] == "0") 
    { 
     echo "act"; //account is not activated yet 
    } 
    else 
    { 
     echo "yes"; //Logging in 
     //now set the session from here if needed 
     $_SESSION['email'] = $email; 
    } 
} 
else 
     echo "no"; //Passwords don't match 
} 
else 
    echo "no"; //Invalid Login 

?> 

這是我的舊版本的MySQL腳本...

session_start(); 
require_once("connect.php"); 
//get the posted values 
$email=htmlspecialchars($_POST['email'],ENT_QUOTES); 
$pass=md5($_POST['psw']); 

//now validating the username and password 
$sql="SELECT email, password members WHERE email='".$email."'"; 
$result=mysql_query($sql); 
$row=mysql_fetch_array($result); 

$sql2="SELECT * FROM members WHERE email='".$email."'"; 
$result2=mysql_query($sql2); 
$row2=mysql_fetch_array($result2); 
$act = $row2['activated']; 

//if username exists 
if(mysql_num_rows($result)>0) 
{ 
    //compare the password 
    if(strcmp($row['password'],$pass)==0) 
    { 
     // check if activated 
     if($act == "0") 
     { 
      echo "act"; 
     } 
     else 
     { 
      echo "yes"; 
      //now set the session from here if needed 
      $_SESSION['email'] = $email; 
     } 
    } 
    else 
      echo "no"; 
} 
else 
     echo "no"; //Invalid Login 

有誰知道,我做了什麼錯誤?它是一個自動腳本..它通過AJAX調用,並根據'no','yes'和'act'返回數據,告訴AJAX/jQuery腳本要做什麼。正如我所說 - mysql腳本正在工作,所以請如果有人能告訴我,我做了什麼不對的PDO腳本..

編輯:

時將數據返回到jQuery腳本,發生這種情況: 如果是:啓動會話,重定向到page2.php會話開始。 否則如果行爲:在字段中寫入該帳戶未激活。 其他:寫電子郵件和密碼不匹配。

事情是,當我嘗試寫出正確的電子郵件和密碼 - 它繼續寫:「電子郵件和密碼不匹配」,而不是重定向。當我說它不工作它是因爲mysql腳本沒有描述,但PDO腳本沒有...

而我試圖改變'回聲'沒有「;」回聲「是」;「看是否登錄無論如何都會開始,但不知何故,繼續編寫電子郵件和密碼不匹配..

SOLUTION:

我ahven't告訴本報,因爲我認爲這是不必要的,但它不工作的原因是因爲我有我的舊mysql代碼在頁面頂部的註釋標記,以便session_start命令不起作用。刪除舊代碼後,它的工作,但後來我發現其他東西要改變,這是PDO腳本,當它驗證它說: $ sql - $ conn_business-> prepare(「SELECT email,password FROM members WHERE email ='」。$ email。「'」); 然後我只是將$ sql後的' - '改爲'=',現在,一切都完美無缺......無論如何,謝謝大家......希望此代碼可以幫助其他人..

+2

「不工作」是非常寬泛的......看到任何錯誤信息或其他調試指標? – GDP

+0

有一點引人注目的是你在查詢後沒有發生任何錯誤。請參閱http://stackoverflow.com/questions/3726505/how-to-squeeze-error-message-out-of-pdo關於如何做到這一點。 –

+0

@Pekka我已經閱讀過它,但我仍然不知道到底是如何,在哪裏以及爲什麼要這樣做..:/這是很容易與普通的MySQL,我只是認爲它不會是更先進的處理PDO ... – Dimser

回答

0

在「開始使用」PDO之前,您是否還閱讀過手冊?

  • 這不是準備好的語句應該如何使用!你的代碼充滿了SQL注入。
  • 你爲什麼選擇同一行兩次?
  • strcmp()而不是爲checing,如果一個字符串是相同的另一個。
  • 和散列密碼一樣簡單MD5只是一個生病的笑話。

    session_start(); 
    
    //very stupid way to acquire connection 
    require_once("connect.php"); 
    
    //get the posted values 
    $email = htmlspecialchars($_POST['email'],ENT_QUOTES); 
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) 
    { 
        // posted value is not an email 
    } 
    
    // MD5 is not even remotely secure 
    $pass = md5($_POST['psw']); 
    
    $sql = 'SELECT email, password, activated FROM members WHERE email = :email'; 
    
    $statement = $conn_business->prepare($sql); 
    $statement->bindParam(':email', $email, PDO::PARAM_STR); 
    
    $output = 'login error'; 
    
    if ($statement->execute() && $row = $statement->fetch()) 
    { 
        if ($row['password'] === $pass) 
        { 
         // use account confirmed 
         if ($row['activated'] !== 0) { 
          $output = 'not activated'; 
          $_SESSION['email'] = $email; 
         } 
    
         $output = 'logged in'; 
        } 
    } 
    
    echo $output; 
    
+0

我瞭解您所寫的代碼,並非常感謝您展示了完成此操作的完美方式。但連接到數據庫的最佳方式將如何?如果我必須將發佈的密碼與數據庫中的密碼相匹配,則必須對md5進行編碼以進行比較。 – Dimser

+0

而不是「裸」MD5,你應該使用[crypy()](http://php.net/manual/en/function.crypt.php),與Sha512或Blowfish。至於連接數據庫,它包含了更大的問題:用戶身份驗證應該由服務(一個對象)完成,該對象在構造函數中提供了連接對象。我會考慮應用程序,其中通過在全局範圍內包含大量帶有變量的文件來實現模塊化,這是非常有缺陷的。 –

0

我相信第二個查詢你的腳本是沒有必要的,你可以簡單的做

SELECT * FROM members WHERE email=:EMAIL AND password=:PWS; 

使用bindParam方法

$qCredentials->bindParam(":EMAIL",$EMAIL); 
    $qCredentials->bindParam(":PWS",$PWS); 

然後做更多understable個產出,而不是沒有 ..
嘗試「無法登錄:憑據無效提供的」無效類型的值或
「無法登錄:證書無效,找不到用戶」
無效的用戶憑證。
你可以嘗試啓動會話後,用戶在你的IF條件返回已成功登錄,並且這些方法

$PDOstatement->debugDumpParams() 
$PDOstatement->errorInfo() 
$PDOstatement->errorCode() 

將有助於你理解了什麼錯查詢!