2012-11-03 80 views
-3

我知道我應該使用準備的語句和消毒的數據我只是檢查PDO驅動

我只是想知道爲什麼,如果我只是路過返回true隨機數據查詢返回true?爲什麼這個說法時,我查詢數據庫

只是注意到這個PDO ::查詢 - 執行SQL語句,返回設置爲PDOStatement對象對象

$dbuser = 'root'; 
$dbpass = 'root'; 
$formpost = false; 
try 
{ 
    $dbh = new PDO('mysql:host=127.0.0.1;dbname=loginexample', $dbuser, $dbpass); 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 
if(!empty($_POST['username']) && !empty($_POST['password'])) 
{ 
    $formpost = true; 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
} 

if($dbh && $formpost) 
{ 
    $sql= "SELECT username, password FROM user WHERE username='$username' AND password='$password'"; 
    if($dbh->query($sql)) 
    { 
     echo 'true'; 
    } 
} 
+0

我想查看誰是第一個評論此SQL注入漏洞的smartass。 –

+2

它返回true,因爲你的查詢是成功的..沒有其他 –

+0

哦,上帝,你們都是如此*** –

回答

1

此行:if($dbh->query($sql))可能不會返回包含任何找到的記錄的對象,但它會返回一個對象。例如,一個對象可能會告訴您發現的行數等於零。

嘗試根據查找到的記錄數返回真或假....

+0

你會用什麼來獲取這些記錄的Fetch_all? –

+0

'$ stmt = $ db-> query($ theQueryString); while($ row = $ stmt-> fetch(PDO :: FETCH_ASSOC)){/ *用$ row * /}做東西' –

0

PDO ::查詢結果()返回一個PDOStatement對象的對象,或FALSE的失敗。

我的猜測是,查詢成功地讓所有零行匹配

+0

是的,即使沒有記錄返回true,我會chech fetall然後count()> 0玩安全。 –

3

PDO::query總是返回PDOStatement對象,除非查詢導致了錯誤。 (不返回行不是錯誤。)在PHP中,任何對象都會計算布爾值true,因此if條件將會通過。

3

因爲PDO::query()返回一個PDOStatement對象來表示結果集。即使沒有返回結果,查詢仍然是成功的(即它不包含語法錯誤,表格存在等)。

要檢查是否有空,可以使用fetchAll()並在其上運行count()函數。

+0

知道它fetchAll,然後count(); –

+0

太棒了!如果此答案解決了您的問題,請考慮通過點擊答案評分下的大綠色勾號(✔)進行投票並接受。 –

相關問題