2012-11-07 3 views
0

Я пытался решить эту проблему самостоятельно и за жизнь мне не может это исправить ..mysqli_num_rows = 0, когда он должен быть 1

//If they are, retreive them from the Person table  
var_dump($_POST['username']); 
var_dump($_POST['password']); 
$select = $this-> doQuery("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '".md5($_POST['password'])."'"); 
var_dump($select); 

try {  
    if (mysqli_num_rows($select) > 0){ 
     var_dump(mysqli_num_rows($select)); 
     //fetching username and password from database 
     $fetch_array = mysqli_fetch_assoc($select); 
     var_dump($fetch_array);  
     //Building a session for the user 
     $_SESSION['username'] = $fetch_array['username']; 

     //var_dump($_SESSION['username']); 

     //Redirecting the user to the index page   
     header('Location:index.php'); 
     return true; 
    } 

Эти два var_dumps на имя пользователя и пароль на 4-й и 5-й линии вернулся в этом:

string(8) "johnny03" 
string(9) "password3" 
object(mysqli_result)#3 (5) { ["current_field"]=> int(0) ["field_count"]=> int(8) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } 

значения, которые я введенные как для пароля и имени пользователя являются действительными (они находятся в базе данных под правильными колоннами, поверьте мне). У меня есть ощущение, что что-то не так с моим запросом на выбор, потому что дамп var на mysqli_num_rows ($ select) ничего не возвращает. Как сказано, я пробовал почти каждое изменение запроса, о котором я мог думать, чтобы сделать он работает и до сих пор ничего: [Может ли кто-нибудь помочь?

+0

Является ли имя пользователя pre- и suffixed фигурной скобкой? Это не опечатка? – Daneo

+1

И делает 'var_dump (md5 ($ _ POST ['password']));' дает тот же пароль, который находится в базе данных в столбце пароля? Также вы уязвимы для SQL-инъекций в этом запросе. – drew010

+0

+1 к @ drew10. Если вы уверены, что имя пользователя верное, необходимо проверить шифрование пароля в базе данных. – janenz00

ответ

1

Первое: Попробуйте удалить скобки из запроса:

$select = $this-> doQuery("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '" . md5($_POST['password']) . "'"); 

Edit: Брекеты хорошо, смотрите комментарии по drew010.

Если это не проблема, как было отмечено drew010, проверьте полученный хэш (вывод его с помощью простого эхо и сравнить его в базу данных.

Если те, кажется, совпадают, но есть часть отсутствует, то отрегулируйте производительность вашего поля ввода пароля в базе данных.

Ваше поле пароля, скорее всего, имеет размер, например, VARCHAR (20), который слишком мал для всей хэш, чтобы поместиться в. Отрегулируйте размер в вашей базе данных и сохраните правильный результат хэша.

Кроме того, по крайней мере видеть в какой-посола, md5 была нарушена, так как некоторое время сейчас, чтобы вы должны заменить его хэш SHA-семейства.

Вы можете проверить хэш в базе данных, а также с помощью online md5 hashing и получить длину, измеряя его с помощью STRLEN

+0

Скобки вокруг переменной в порядке, необходимо проанализировать определенные типы переменных. [Источник] (http://php.net/manual/en/language.types.string.php#language.types.string.parsing). – drew010

+0

@ drew010 Никогда не использовал их, поэтому не знал. Cheers – Daneo

+0

@JoanneDeBiasa подумайте о том, как это ответить, пожалуйста, пожалуйста :-) Привет! – Daneo

0

Попробуйте это:

var_dump("SELECT * FROM Person WHERE username = '{$_POST['username']}' AND password = '".md5($_POST['password'])."'"); 

Это дамп запрос. Любые очевидные ошибки, которые вы должны сразу выбрать. Если запрос выглядит нормально, попробуйте скопировать и вставить его в PHPMyAdmin (или аналогичный) для проверки запроса. Если он также возвращает нулевые строки, возможно, пользователь/пропуск не совпадают?