2013-06-05 2 views
0

Я должен предоставить пользователям возможность входа в систему для задания. Сначала мне показалось, что этот скрипт был достаточно прост для работы, но каждый раз, когда я пытаюсь войти в существующую учетную запись, он дает мне сообщение «с ошибкой входа». Я не знаю, где моя ошибка. Это база данных PostgreSQL, я приложу ее изображение ниже.PHP login script всегда возвращает «login failed»

<?php 

require 'databaseaccess.php'; 
try { 
$conn = new PDO('pgsql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USERNAME,DB_PASSWORD); 
} catch (PDOException $e) { 
print "Error: " . $e->getMessage() . "\n"; 
phpinfo(); 
die(); 
} 

$username = $_POST['username']; 
$password = $_POST['password']; 
$tablename = "users"; 

// sql-injection counter 
$username = stripslashes($username); 
$password = stripslashes($password); 
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 

$qry = $conn->prepare("SELECT * FROM $tablename WHERE userid = :username and userpass = :password"); 
$qry->bindParam(':username', $username, PDO::PARAM_STR, 16); 
$qry->bindParam(':password', $password, PDO::PARAM_STR, 16); 
$qry->execute(); 
$result = pg_query($qry); 
$count = pg_num_rows($result); 

// If result matched $myusername and $mypassword, table row must be 1 row 

if ($count == 1) { 

    $_SESSION['loggedin'] = true; 
    $_SESSION['username'] = $username; 
    header("location:logingelukt.php"); 
} elseif ($count = -1) { 
    echo "there has been an error"; 
} else{ 
    print $count; 
    echo "login failed"; 
} 
?> 

У меня нет никаких проблем с подключением к базе данных, так что это не проблема, это просто, что он всегда видит $count как-то иначе, чем ноль. Другая странность заключается в том, что команда print $count ничего не выводит. Я использую учетную запись, которую я сделал с postgresql за пределами страницы, которая равна admin:admin. Кроме того, я уверен, что правильные переменные передаются из формы.

EDIT: после использования var_dump ($ result), как советовал Kingalligator, кажется, что $ result действительно является NULL, таким образом, пустым. Я попробую использовать fetch() вместо pg_query().

+2

Обратите внимание, что 'ElseIf ($ Count = -1)' является назначение. Предназначено ли это для сравнения? Кроме того, 'stripslashes' и' mysql_real_escape_string' не нужны, поскольку они параметризуются. – Caramiriel

+0

Увидит небольшой промах. Однако это ничего не меняет. Я также уже пробовал комментировать защиту sql, и это тоже не сработало. –

+0

@Caramiriel опубликуйте его как ответ, который вы указали на главную ошибку. –

ответ

1

Я думаю, проблема в том, что вы смешиваете функции PDO и pg_.

Заменить:

$result = pg_query($qry); 
$count = pg_num_rows($result); 

С:

$result = $qry->fetchAll(); 
$count = count($result); 

PDO ссылка Функция может быть найдена здесь: http://www.php.net/manual/en/class.pdostatement.php

+0

'rowCount()' здесь не выглядит. Он представляет строки, затронутые в запросе на вставку/удаление/обновление. – Caramiriel

+0

@Caramiriel ... oops ... Я знал это ... fixed – keithhatfield

+0

Кроме того, count показывает количество элементов в массиве (представляет столбцы одной строки). Я думаю, что здесь нужен '$ result-> fetch (PDO :: FETCH_NUM),' с 'count()'. Может подтвердить? – Caramiriel

0

Вы подтвердили, что на самом деле получаете данные, возвращаемые из вашего запроса? Попробуйте следующее:

var_dump($result); 

Чтобы гарантировать, что данные будут возвращены из вашего запроса. У вас все еще есть успешное соединение с базой данных, но у вас есть запрос, который ничего не возвращает.

0

Вероятно, вы должны проверить свой идентификатор столбца в предложении WHERE. Я не знаю, столбцы таблицы, но странно, что «USERID» имеет имя пользователя в:

"SELECT * FROM $tablename WHERE userid = :username and userpass = :password" 

Может быть, это вызывает проблему.

+0

Нет, я сделал это так, в ретроспективе это должно быть имя пользователя, поэтому я, вероятно, собираюсь изменить имя столбца, но это тоже не проблема. –