2012-11-07 1 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

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) } 

내가 암호와 사용자 이름을 모두 입력 한 값은 (그들이 나를 신뢰, 올바른 열 아래에있는 데이터베이스에있는) 모두 유효 : 4, 5 라인에 암호가이 돌아왔다. mysqli_num_rows ($ select)의 var 덤프가 아무 것도 반환하지 않기 때문에 내가 선택한 쿼리에 뭔가 잘못되었다는 느낌이 들었다. 내가 말하고자하는 것은, 내가 생각할 수있는 쿼리에 대한 모든 변경을 시도했다는 것이다. 그것은 작동하고 여전히 아무것도 : [아무도 도와 줄 수 있습니까?

+0

사용자 이름 앞에 접미사와 접미사가 있습니까? 그건 오타가 아니야? – Daneo

+1

그리고'var_dump (md5 ($ _ POST [ 'password']));는 패스워드 컬럼에있는 데이터베이스와 같은 패스워드를 생성합니까? 또한 해당 쿼리에서 sql-injection에 취약합니다. – drew010

+0

+1에서 @ drew10. 사용자 이름이 정확하면 데이터베이스의 암호 암호화를 확인해야합니다. – janenz00

답변

1

첫째 : 쿼리에서 괄호를 제거하십시오 :

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

편집 : 중괄호가 괜찮아, drew010에 의해 코멘트를 참조하십시오. 그게 문제가 아닌 경우

, drew010에 의해 언급 된 바와 같이, 간단한 에코를 사용하여 결과 해시 (출력을 확인하고 데이터베이스에 비교합니다.

을 사람들이 일치하는 것 경우지만, 실종 조각이, 당신의 데이터베이스에 암호 필드의 용량을 조절합니다.

암호 필드는 대부분 전체 해시에 맞게 너무 작은 크기, 예를 들면 VARCHAR (20)가 있습니다. 데이터베이스의 크기를 조정하고 올바른 해시 결과를 저장하십시오.. 한 동안은 그래서 당신은 는 SHA-가족의 해시하여 교체해야하기 때문에

는 또한, 적어도 일부 염장으로보고, MD5는 파괴되었습니다.

당신은 online md5 hashing를 사용하여뿐만 아니라 데이터베이스의 해시를 확인하고 나 strlen

+0

변수 주위의 중괄호는 괜찮습니다. 특정 유형의 변수를 구문 분석해야합니다. [출처] (http://php.net/manual/en/language.types.string.php#language.types.string.parsing). – drew010

+0

@ drew010 사용하지 않았으므로 몰랐습니다. 건배 – Daneo

+0

@ JoanneDeBiasa 다음 답변으로 표시를 고려하십시오 :-) 건배! – Daneo

0

이 시도 사용하여 측정하여 길이를 얻을 수 있습니다 :

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

그것은 쿼리를 덤프합니다. 즉시 골라 낼 수있는 명백한 오류. 쿼리가 정상적으로 보이면 복사하여 PHPMyAdmin (또는 비슷한)에 붙여 넣어 쿼리를 테스트하십시오. 또한 0 행을 반환하면 User/Pass가 일치하지 않을 수 있습니다.