2012-06-06 2 views
-1

데이터베이스에있는 사용자 이름과 암호를 일치 시켜서 교사를 기록하는 코드가 있습니다. 올바르다면 로그인하고, 틀린 경우 메시지를 표시하십시오. mysql에서 mysqli로 변경할 때 로그인이 작동하지 않습니다.

<?php 

session_start(); 

$username="xxx"; 
$password="xxx"; 
$database="mobile_app"; 

$link = mysqli_connect('localhost',$username,$password); 

mysqli_select_db($link, $database) or die("Unable to select database"); 

foreach (array('teacherusername','teacherpassword') as $varname) { 
     $$varname = (isset($_POST[$varname])) ? $_POST[$varname] : ''; 
     } 

?> 

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">   
<p>Username</p><p><input type="text" name="teacherusername" /></p>  <!-- Enter Teacher Username--> 
<p>Password</p><p><input type="password" name="teacherpassword" /></p> <!-- Enter Teacher Password--> 
<p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p> 
</form> 

<?php 
if (isset($_POST['submit'])) { 

$query = " 
SELECT * FROM Teacher t 
WHERE 
(t.TeacherUsername = '".mysqli_real_escape_string($teacherusername)."') 
AND 
(t.TeacherPassword = '".mysqli_real_escape_string($teacherpassword)."') 
"; 

$result = mysqli_query($link, $query); 
$num = mysqli_num_rows($result); 

$loged = false; 

while($row = mysqli_fetch_array($result)) 
    { 

     if ($_POST['teacherusername'] == ($row['TeacherUsername']) && $_POST['teacherpassword'] == ($row['TeacherPassword'])) 
     { 
      $loged = true; 
     } 

$_SESSION['teacherforename'] = $row['TeacherForename']; 
$_SESSION['teachersurname'] = $row['TeacherSurname']; 
$_SESSION['teacherusername'] = $row['TeacherUsername']; 

    } 

    if ($loged == true){ 
    header('Location: menu.php') ; 
}else{ 
    echo "The Username or Password that you Entered is not Valid. Try Entering it Again."; 
} 

mysqli_close($link); 

} 
?> 

지금 문제가 교사가 올바른 사용자 이름과 암호를 입력 한 경우에도 위의 코드를 기존의 MySQL은() 코드를 때, 그것은 여전히. 교사가 로그인하지 않는다는 것입니다, 그것은 일 교사는 사용자 이름과 비밀번호가 일치 할 때 로그인 할 수 있었지만, 코드를 mysqli로 변경하려고 시도하면 사용자 이름과 비밀번호가 일치하더라도 로그인이 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

불행히도, 실제 문제가있는 곳을 찾으려면 주위를 파고 들고 디버깅해야합니다 (많은 코드가 있음). 데이터베이스에 저장된 암호가 암호 또는 일반 텍스트의 해시입니까? SQL 쿼리를 반향 출력하고 PMA 또는 그 밖의 오류가있는 경우 표시하는 것으로 직접 연결하십시오. PHP 오류/경고가 있습니까? – craig1231

+0

@ craig1231 오류가 없습니다. 암호와 사용자 이름이 데이터베이스에서 삭제된다는 점에 유의하십시오. 앞서 언급 한 것처럼 mysql 섹션을 mysqli로 변경 한 다음 로그인이 완벽하게 작동하기 전에는 작동하지 않습니다. mysqli 코드에서 뭔가 잘못 됐는지 알고 싶습니다. – user1394925

+0

구문이 정상적으로 보이므로 디버깅 할 수없는 문제가 무엇인지 알 수 없습니다. – craig1231

답변

0

성공한 로그인 리디렉션이있는 곳에서는 헤더가 이미 전송 되었기 때문에 mysqli가 mysqli 이상으로 변경된 것 같습니다. 따라서 로그인에 성공하면 로그인 양식을 다시 볼 수 있습니다.

이를 방지하려면 모든 처리를 맨 위로 이동해야합니다. 이때 html 출력을 시작하기 전에해야합니다.

별개로 나는 escape_string 혼란을 피하기 위해 준비된 명령문으로 전환하는 것이 좋지만 사용자 이름/암호에 이스케이프 기능의 영향을받는 문자가 포함될 수 없다면 문제와 관련이 없습니다.

2

PHP에 익숙하지 않지만 mysql에서 mysqli로 코드를 변환 할 때 일부 mysqli 명령에 synatx가 다른 것을 발견했습니다. 마찬가지로 mysqli_connect 네 번째 매개 변수 db_name (이 필요한 경우 몰라)있다. 다르다 : mysql_real_escape_string($string)mysqli_real_escape_string($link, $string)

관련 문제