2009-10-26 6 views
-1

사용자가 로그인 할 때 데이터베이스의 데이터를 저장하기 위해 SESSIONS를 사용하고 있습니다. 그러나 다른 페이지의 데이터베이스를 쿼리 할 때 SESSION 변수가 새 값을 할당하지 않고 변경됩니다.

누구에게 어떤 문제가 있는지 알 수 있습니까?

변수 저장 로그인 페이지 :

enter code here 
    session_start(); 

    if($_POST['login_button']) { 

    require_once('includes/config.inc.php'); 

    $username = $_POST['login_username']; 
    $password = $_POST['login_password']; 

    $hash_pwd = sha1($password); 

    if(($username != NULL) && ($password != NULL)) { 

    $conn = mysql_connect('localhost', 'admin', 'root') or die(mysql_error()); 
mysql_select_db('main') or die(mysql_error()); 

    $check_users = "SELECT * ". 
      "FROM users ". 
      "WHERE email = '{$username}' AND password = '{$hash_pwd}'   ". 
      "LIMIT 1"; 

    $result = mysql_query($check_users); 
    $counted = mysql_num_rows($result); 

    if($counted != 1) { 

    header("location:login.php?fail"); } else { 

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

$useR_login_un = $row['name']; 
$useR_login_user_id = $row['user_id']; 
$useR_login_login_time = $row['login_times']; 
$useR_login_user_email = $row['email']; 
$useR_login_course = $row['course']; 
$useR_login_campus = $row['campus']; 

$useR_login_login_time = $useR_login_login_time + 1; 

$useR_login_datenow = date("Y-m-d") . " " . date("H:i:s"); 

$useR_login_sid = sha1($useR_login_user_id) . rand() . md5($pinch_o_salt); 

$update_login_times = "UPDATE users ". 
         "SET login_times = '{$useR_login_login_time}', last_login = '{$useR_login_datenow}' ". 
         "WHERE email = '{$useR_login_user_email}' AND user_id = '{$useR_login_user_id}'"; 

mysql_query($update_login_times); 


mysql_close($conn); 

$_SESSION['sid'] = sha1($useR_login_user_id) . $pinch_o_salt; 
$_SESSION['user_id'] = $useR_login_user_id; 
$_SESSION['username'] = $useR_login_user_email; 
$_SESSION['name'] = $useR_login_un; 
$_SESSION['course'] = $useR_login_course; 

if($useR_login_login_time == 0) { 
session_write_close(); 
header("Location: first_run.php"); 
exit; 
} 
else { 
session_write_close(); 
header("Location: home.php"); 
exit; 
} 
    } 

    } 

    } else { header("Location: login.php?fail"); exit; } } 

편집 : 그것은 변수를 저장하고 내가 다른 페이지로 이동하면 변수가 나타납니다,하지만 난 새로 고칠 때, 그들 중 일부는 그 중 일부를 손실을 동일하게 유지하고 일부는 데이터베이스의 다른 사용자의 정보로 변경합니다.

EDIT2 : 데이터베이스를 다시 쿼리 할 때만 발생한다는 것을 깨달았습니다. 문제를 일으키는

것은 (home.php ON)입니다 :이 주석 경우

$conn = mysql_connect('localhost', 'ggordan_admin', 'valeg0r') or die(mysql_error()); 
mysql_select_db('ggordan_wmin') or die(mysql_error()); 

$query = "SELECT * ". 
      "FROM users ". 
      "WHERE course = '".$_SESSION['course']."' ". 
      "LIMIT 3"; 

$result = mysql_query($query); 
$numrows = mysql_num_rows($result); 

echo $numrows; 

while ($my = mysql_fetch_array($result)) { 

$id = $row['user_id']; 
$name = $row['name']; 

} 

, 그런 일은하지 않는 것 같습니다.

편집 : 다른 스크립트의 변수 충돌과 관련이 있다는 것을 깨달았습니다. 그 페이지가 HTTPS 또는 다른 서버에 HTTP로 전환하는 경우가 될 수 이유에

$conn = mysql_connect('localhost', 'ggordan_admin', 'valeg0r') or die(mysql_error()); 
mysql_select_db('ggordan_wmin') or die(mysql_error()); 

$query = "SELECT * ". 
      "FROM users ". 
      "WHERE course = '".$_SESSION['course']."' ". 
      "LIMIT 3"; 

$result = mysql_query($query); 
$numrows = mysql_num_rows($result); 

echo $numrows; 

while ($my = mysql_fetch_array($result)) { 

    // if i change $id to $user_id it breaks the login script 
$id = $row['user_id']; 
$name = $row['name']; 

} 
+1

코드?     –

답변

1

을 일이있을 경우,이 새로운 세션 ID가 생성되는 원인이됩니다.

0

브라우저는 세션에 대한 쿠키를 기록하고 동일한 브라우저 인스턴스에서 동일한 도메인에 대한 모든 호출에 대해 브라우저를 반환합니다. (즉, IE 또는 FireFox의 두 가지 사본을 실행 한 경우 다른 세션이있을 수 있습니다.)

PHP는로드 및 저장 이외의 세션에서 어떤 작업도 수행하지 않습니다. 세션 변수를 변경하는 유일한 방법은 다음과 같습니다. 서버 페이지에서 직접 변경하고 다른 클래스는 저장/검색 할 때 세션을 직렬화/역 직렬화 할 수 있습니다. 복잡한 클래스가 있으면 번역에서 혼란 스러울 수 있습니다.

페이지에서 세션 변수의 내용을 표시하고 브라우저의 새 탭에서 실행하고 다른 탭에서 페이지를 업데이트 할 때마다 새로 고치십시오.

필자는 프로그래머 오류라고 생각합니다 : 프로그래머를 교체하고 다시 시도하십시오.

+0

세션의 내용을 표시 할 페이지가 있습니다. 처음로드 될 때 모든 것이 나타나지만 새로 고쳐질 때 세션 $ _SESSION [ 'name']이 사라집니다. – Stephen

0

내가이 세션 몇 가지 문제를 일으킬 들었다으로

session_write_close() 

에 호출을 제거하려고합니다.

0

내가 가진 첫 번째 인상은 클라이언트의 유효성을 검사 한 직후 세션을 종료한다는 것입니다. 맞습니까?

// if user does not validate close session and take him back to login 
if($useR_login_login_time == 0) { 
    session_write_close(); 
    header("Location: first_run.php");  
    exit; 
    } 
// if user validates DO NO CLOSE SESSION and take him home 
else { 
    //session_write_close(); 
    header("Location: home.php"); 
    exit; 
} 

로직 부분을 살펴보고 문제가 해결되었는지 알려주세요.

희망이 있습니다.

+0

나는 session_write_close()를 제거하려고 시도했다. 그러나 문제는 여전히 존재합니다. – Stephen

0

register_globals은에 이었습니다.

간단한 질문을하는 복잡한 방식에 답하려고 한 모든 사람에게 감사드립니다.