2014-01-14 6 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

таблица является зарезервированным словом, вы уверены, что ваше имя таблицы является таблицей? Используйте обратные ссылки, если таковая \ 'table \'. Также подготовленные Google заявления. – Mihai

+4

Итак, вы пытаетесь использовать PDO, но вы по-прежнему размещаете данные '$ _POST' непосредственно в запросе? Nice ... – Ryan

+0

Вы не можете просто предположить, что ваш запрос сработал, вам нужно проверить ошибки до 'fetch()' ing. '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); 

затрудняет провал ошибок, которые могут возникнуть.
А затем, как указал Станир, не ставьте параметры непосредственно в свой запрос, а передавайте их как ..параметры.

$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);