2014-01-14 102 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);