2014-01-14 134 views
0

我正嘗試使用php和sql創建登錄頁面。這是我的PHP代碼從MySQL並檢查得到的用戶名和密碼的數據,如果他們是正確的,使用戶獲取登錄我得到這個錯誤:PHP SQL登錄錯誤

Call to a member function fetch() on a non-object

就行了:

$row = $result->fetch(PDO::FETCH_ASSOC); 

這裏是我的代碼:

<?php session_start(); 

$db = new PDO("mysql:host=localhost;dbname=database","user","pass"); 
    if(mysqli_connect_errno()) 
    { 
    echo "fail!". mysqli_connect_errnor(); 
    } 

$first =$_POST['username']; 
$last=$_POST['password']; 

$sql="SELECT count(user_id) as records FROM table WHERE username='$first' AND password='$last'"; 
$result = $db->query($sql); 
$row = $result->fetch(PDO::FETCH_ASSOC); 
if ($row['records'] == 1); 
{ 
    $_SESSION['loggedIN'] =true; 
    header("Location:logged.php"); 
    die(); 

} 
else { 

    $_SESSION['loggedIN'] = null; 
    header("Location:home.php"); 
    die(); 

} 


?> 
+3

表是一個保留字,你確定你的表名是表?使用反引號如果是這樣\'表\'。還有谷歌準備語句。 – Mihai

+4

所以你試圖使用PDO,但是你仍然在查詢中直接放置'$ _POST'數據?尼斯... – Ryan

+0

你不能假設你的查詢工作,你需要在'fetch()'之前檢查錯誤。 'if($ result === FALSE){var_dump($ db-> errorInfo());死; }'。附: PDO不會神奇地使您的查詢無需注入,您需要使用[預先準備的語句](http://www.php.net/pdo.prepared-statements)。 P.P.S. 'mysqli_connect_errno'不會幫助你。你正在使用PDO而不是MySQLi。 –

回答

1

嘗試與

$db = new PDO("mysql:host=localhost;dbname=database","user","pass"); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

使錯過可能發生的錯誤更難。
然後按照 - Stanyer指出的 - 不要直接將參數放入查詢中,而是將它們作爲參數傳遞。

$stmt = $db->prepare('SELECT count(user_id) as records FROM `table` WHERE username=? AND password=?'); 
$stmt->execute(array($_POST['username'], $_POST['password'])); 
$row = $result->fetch(PDO::FETCH_ASSOC);