2011-01-14 2 views
3

MySQL 데이터베이스에 세션 데이터를 저장하기 위해 사용자 정의 세션 핸들러를 사용하려고합니다. "mysql_close() : 제공된 인수가 유효한 MySQL-Link 자원이 아닙니다.

function _open(){ 

    global $_sess_db; 
    $_sess_db = mysql_connect("localhost", "root", "******"); 
    if ($_sess_db) { 
     return mysql_select_db('style', $_sess_db); 
    } 
    return false; 
} 

function _close(){ 
    global $_sess_db; 
    return mysql_close($_sess_db); //error happens here 
} 

오류 메시지의 전체 텍스트가 궁극적으로 최종 점 : i here에서 가져온 내가 사용하는 코드를 여기

mysql_close(): supplied argument is not a valid MySQL-Link resource 

것 : 그러나, 나는 다음과 같은 경고가 계속 return mysql_close ($ _ sess_db); " 선. mysql_connect 정보가 실제로 작동한다는 것을 확인할 수 있으며 나머지 세션 핸들러 함수도 정의되어 있습니다.

그리고 도움이 될 경우 실제로 세션 핸들러 함수를 호출하지 않고 현재 세션을 열지 않고도 페이지로드시 즉시 이러한 오류가 발생합니다. _open 일부 디버그 출력물을 추가


답변

3

문제는 가변 범위입니다. 변수가 먼저 함수 외부에 정의되지 않은 경우 global 키워드는 아무 것도 수행하지 않습니다. 대안으로는 슈퍼 글로벌 $ GLOBALS [ '_ sess_db']를 사용하거나 먼저 모든 함수 외부에서 $ _sess_db를 정의하는 것입니다.

+0

위에 여러 데이터베이스를 사용하지 않는 경우 인수가 전달되지 않으면 마지막으로 열린 연결을 자동으로 닫으므로 닫을 DB 연결을 지정하지 않아도됩니다. – dqhendricks

+1

또한 비 영구적 인 db 연결은 스크립트의 끝에서 자동으로 닫히므로 db 연결을 닫는 것이 프로젝트에 따라 필요하지 않을 수도 있습니다. – dqhendricks

+0

네, 가변 범위가 문제였습니다. 더 이상 오류가 발생하지 않습니다. 그러나, 세션을 시작한 후 $ _SESSION [ 'uid'] = 4 할 노력하고있어.하지만이 전혀 데이터베이스에 반영 점점 보이지 않는다. session_write 함수를 정의했기 때문에, $ _SESSION [ 'uid'] = ... 맞습니까? 이 경우 사용자 지정 처리기 함수에 문제가 있습니까? – maxedison

0

보십시오()와 _close() 그들이 당신이 그들을 것으로 기대하지 않을 때 호출하는 경우를 참조하십시오.

+0

나는 그들이 언제 불러야하는지 잘 모르겠다. 페이지가로드 될 때마다 자동으로 호출되지 않아야합니까? 그게 무슨 일이야. 즉, 나는 session_start()를 호출하지 않고 이전 세션도 존재하지 않는다. – maxedison

+0

또한 php.ini 파일에서 세션이 자동 시작으로 설정되어 있지 않습니다. – maxedison

관련 문제