2013-11-15 53 views
0

我剛開始學習PDO ...

function authenticate($username,$password) 
{ 
    $result=$this->con->query("select * from user where UserName='".$username."' AND Password='".$password."'"); 
    var_dump($result->rowCount()); //return null 
    if($result) 
     echo "hey going great"; 
    else 
     echo "Hey are you gone mad?"; 
} 

我打電話上述功能與用戶名密碼 ...但它的返回哎都會很大部分每的時間,如果我會把錯誤的用戶名和密碼也...

我試着用$ result-> rowCount時()但它也返回空值...

你能告訴我我在做什麼錯嗎?

+1

你沒有做錯什麼。查詢執行OK(因此爲什麼'$ result' var是真的)。 – BenM

+0

我*強烈*建議閱讀[SQL注入](http://en.wikipedia.org/wiki/Sql_injection) – andyb

+0

你可以檢查的是,如果有1(或更多?)行,然後運行'嘿去偉大'。 – Albzi

回答

-1

你可以嘗試如下:

$result=$this->con->query("select * from user where UserName='".$username."' AND Password='".$password."'"); 
    var_dump($result->rowCount()); //return null 
    $num_row=$result->rowCount(); 
    if($num_row > 0) 
     echo "hey going great"; 
    else 
     echo "Hey are you gone mad?"; 
+0

SQL注入是一個避免 –

0
if($result->rowCount()>0){ 
     echo "hey going great"; 
    }else{ 
     echo "Hey are you gone mad?"; 
} 
+0

將返回行不串 –

+0

!=「」和!= NULL的數量相同。不是嗎? –

+0

,但根據文檔,它會返回受影響的行不爲空。 –

0
if($result) 

這將經常檢查是否變量的任何信息。當你運行一個查詢並存儲在這個var中時,它將存儲返回的行數。即使它錯了,它也會返回一個設置變量的負值。

基本上你的如果只是檢查變量是否存在,它在兩種情況下都存在。

1

假設$this->conPDO一個實例:

  • PDO->query()只返回falsefailure
  • $result將是PDOStatement一個實例,其計算結果始終爲true
  • PDOStatement->rowCount()返回受上一DELETE,INSERT,UPDATE或由相應PDOStatement對象的對象執行的語句的行數。

    如果由相關PDOStatement對象執行的最後一個SQL語句是SELECT語句,有些數據庫返回該語句返回的行數。但是,對於所有數據庫,的行爲不保證,不應將其依賴於便攜式應用程序。

編輯:順便問一下,你的應用會更安全,如果使用PDO->prepare()(&約束參數),而不是PDO->query()

2

你正在做的幾乎一切錯誤的。

首先,使用PDO的唯一原因是在查詢中使用佔位符。
您不應該在函數中檢查查詢結果。所以,使其

function authenticate($username,$password) 
{ 
    $sql = "SELECT * FROM user WHERE UserName=? AND Password=?"; 
    $stm = $this->con->prepare($sql); 
    $stm->execute([$username,$password]); 
    return $stm->fetch(); 
} 

,然後調用

if($userdata = $user->authenticate($username,$password)) 
    echo "hey going great"; 
else 
    echo "Hey are you gone mad?"; 
+0

謝謝它真的幫助理解準備聲明... –

+0

+1,這是一個很好的答案。 –