2011-05-09 8 views
3

안녕하십니까. PHP 페이지에 문제가 있습니다. this 자습서를 사용하여 약간의 CMS를 작성하고 있습니다. 메뉴와 상호 작용하는 데 사용하는 클래스를 작성하고 모두 잘 작동합니다. 순서를 변경할 수있는 페이지에서 메뉴의 모든 항목을 삽입, 삭제 및 가져올 수 있습니다. 나는 사용자가 동일한 페이지를 쓰기 시작했을 때 , 나는 문제가 발생했습니다 : 이제PHP의 로컬 변수 덮어 쓰기 세션 변수

require_once('../includes/Sentry.php'); 
$theSentry = new Sentry(); 
if (!$theSentry->checkLogin(1)){ header("Location: index.php"); die(); } 

: I는 각 페이지에서 사용자의 유효성을 검사 센트리 클래스를 사용하고 나 혼자이 유효성 검사를 사용하는 경우, 페이지입니다 잘 작동하지만 데이터베이스를 조회하고 user_admin.php 페이지에있는 모든 사용자를 추출 할 필요가 : 나는 두 개의 섹션 중 하나를 언급하면, 모두가 잘 작동

require_once('../includes/DbUser.php'); 
$user_connector = new DbUser(); 
$all_users = array(); 
$all_users = $user_connector->getUserArray(); 
foreach($all_users as $id => $user){ echo " ... " }; 

,하지만 난이 코드가 실행 상태로 남아있는 경우 함께 페이지를 올바르게 만들었지 만 다음에 Sentry 클래스를 사용하여 페이지를 실행할 때 오류가있는 로그인 페이지로 리디렉션됩니다. Sentry 클래스는 Validator 클래스를 사용하여 자격 증명을 확인하며이 클래스의 메서드는 단일 값 입력 대신 배열 입력을보고합니다.

내 질문은 : 두 개의 서로 다른 클래스에서 생성 된 두 개의 서로 다른 개체가 이러한 문제를 일으키는 상호 작용할 수 있습니다.

class Sentry { 

... 

function checkLogin($group=9,$user='',$pass='',$goodRedirect='',$badRedirect='') { 
     // Include database and validation classes, and create objects 
     require_once('DbConnector.php'); 
     require_once('Validator.php'); 
     $validate = new Validator(); 
     $loginConnector = new DbConnector(); 

     // If user is already logged in then check credentials 
     if ($_SESSION['user'] && $_SESSION['pass']){ 

      // Validate session data 
      if (!$validate->validateTextOnly($_SESSION['user'])){return false;} 
      if (!$validate->validateTextOnly($_SESSION['pass'])){return false;} 

      if ($_SESSION['gruppo'] <= $group){ 
       // Existing user ok, continue 
       if ($goodRedirect != '') { 
        header("Location: ".$goodRedirect) ; 
       }   
       return true; 
      }else{ 
       // Existing user not ok, logout 
       //$this->logout(); 
       header("Location: low_perm.php"); 
       die; 
       //return false; 
      } 

     // User isn't logged in, check credentials 
     }else{ 
      // Validate input 
      if (!$validate->validateTextOnly($user)){return false;} 
      if (!$validate->validateTextOnly($pass)){return false;} 

      // Look up user in DB 
      $getUser = $loginConnector->query("SELECT * FROM `utenti` WHERE `usr` = '".$user."' AND `psw` = PASSWORD('".$pass."') AND `gruppo` <= ".$group." AND `attivo` = 1"); 
      $this->userdata = $loginConnector->fetchArray($getUser); 

      if ($loginConnector->getNumRows($getUser) > 0){ 
       // Login OK, store session details 
       // Log in 
       $_SESSION["user"] = $user; 
       $_SESSION["pass"] = $this->userdata['pass']; 
       $_SESSION["gruppo"] = $this->userdata['gruppo']; 

       if ($goodRedirect) { 
        header("Location: ".$goodRedirect); 
       } 
       return true; 

      }else{ 
       // Login BAD 
       unset($this->userdata); 
       if ($badRedirect) { 
        header("Location: ".$badRedirect) ; 
       }  
       return false; 
      } 
     }   
    } 
} 

그리고 이것은 사용자가 얻을 수있는 기능입니다 : 나는 당신이 두 방법의 코드를 필요가 있다고 생각 나는 그것이 알고

class DbUser extends DbConnector{ 

... 

    function getUserArray() { 
     while ($row = mysql_fetch_object($this->user_result)) { 
      $this->users[$row->id] = $row; 
     } 
     return $this->users;  
    } 
} 

을 어려운 - 투 - 설명 질문을, 그래서 알려주세요 뭔가 다른 ... 감사를 지정해야하는 경우

편집 :

function validateTextOnly($theinput,$description = ''){ 
    $result = preg_match ("/^[A-Za-z0-9\ ]+$/", $theinput); 
    if ($result AND $theinput!=''){ 
     return true; 
    }else{ 
     $this->errors[] = $description; 
     return false; 
    } 
} 
: 오류은 (는 preg_match와 라인()) Validator 클래스에서이 기능에

좋은 소식은 : 오류가 어디에 내가 찾았지만,이 코드가 작동하지 않는 이유를 이해할 수 아니에요 :

$user_connector = new DbUser(); 
$all_users = array(); 
$all_users = $user_connector->getUsers(); 
foreach($all_users as $id => $user){ ... } 

foreach는 문이 지점입니다 : 내가 $all_user 등을 사용하고 때 $id=>$user 일 때 실제로 $ _SESSION [ 'user']의 내용을 싸이클에서 마지막으로 사용한 객체 ("user"객체)로 덮어 씁니다. 누구나 로컬 변수가 세션 변수를 덮어 쓰는 방법을 설명 할 수 있습니까? 나는 그것을 명확하게하고 싶다 : 나는 문제를 해결한다 ($id => $user$id => $userObj로 바꾸는 것). 그러나 나는 설명을 찾고있다. 감사합니다.

+0

오류 메시지가 표시 될 수 있습니까? – krifur

+0

물론 유용하다고 생각하지는 않습니다 ... Validator 클래스에 관한 오류입니다 : 경고 : preg_match()는 매개 변수 2가 /web/htdocs/www.subamiata.it/에 지정된 문자열 일 것으로 기대합니다. home/nuovo/includes/Validator.php on line 21 – Paciotti

+0

글쎄, 이제 Validator.php를 보여주고 우리는 21 줄을 살펴볼 것입니다. –

답변

5

필자와 똑같은 문제가 있었는데, 내 경우에는 PHP의 전역 변수가 활성화 되었기 때문입니다.

register globals는 $ _SESSION에 설정된 각 변수에 대한 지역 변수를 만드는 PHP 구성 설정입니다. 즉, $ _SESSION [ 'user']을 설정하면 지역 변수 $ user가 생성됩니다. 코드에서이 변수를 덮어 쓰는 경우보고 한대로 $ _SESSION에 새 값이 설정됩니다. 등록 글로벌에 대한 자세한 내용은 here을 참조하십시오.

이 설정을 해제하려면 사용중인 웹 서버용으로로드 된 php.ini 파일을 편집하고 register_globals 설정을 Off로 설정 한 다음 웹 서버를 다시 시작해야합니다. 다른 웹 서버에서이 코드를 실행하려는 경우 코드가 제대로 작동하려면이 설정을 해제해야합니다.

+0

오, 이런! 나는 등록 글로벌에 대해 생각하지 않았다! 나는 그것이 무엇인지는 알지만 최신 버전의 php에서는 기본적으로 꺼져 있다는 것을 알고 있습니다 ... 저는 지난 버전을 실행하고 있지만 오래된 서버는 과거에 몇 시간 업그레이드했습니다. 많은 분들께 감사드립니다. – Paciotti

0

프레임 워크를 만드는 경우 자동로드를 사용하는 것이 좋습니다. 인덱스 컨트롤러에서 클래스를 찾을 수 없을 때 호출 할 함수를 지정할 수 있습니다. 예.

다음을 사용하십시오. require_once ('../ includes/DbUser.php'); $ user_connector = new DbUser();

먼저 파일을 포함하면 항상 제어해야합니다. 이것은 PHP 프로세스에서 시간을 보낸다. 길은 "require"또는 "include"라고 쓰지 말고 php가 찾고자하는 클래스를 "찾지 못하게"하십시오. 그런 다음 Dbuser 클래스가 같은 이름의 Dbuser.php 파일 안에 있는지 제어해야합니다. 마지막으로 한 번만 실행될 수있는 자동로드를 삽입하십시오 (예 : root의 index.php). 당신은 그런 식으로 작업을 수행해야합니다

 
function classAutoload($className){ 
    if (!class_exists($className, false)){ 
     @include_once(dirname(__FILE__).'/includes/'.$className.'.php'); 
} 
spl_autoload_register('classAutoload'); 

클래스가 포함 된 경우 PHP 관리되며, 그렇지 않은 경우 이전에로드 인스턴스를 얻을 것이다. 더 이상 포함하고 필요 없으며 수업을 들으십시오. 필요한만큼 자동로드를 추가 할 수 있습니다. 항상이 코드를 한 번만 인스턴스화해야합니다.

또한 "AND"대신 "& &"을 사용해야합니다. AND는 별칭 일 뿐이며, 큰 따옴표로 PHP는 정확히이 문자를 internaly로 찾아야합니다. 효율성은 프레임 워크에서 중요합니다. 모든 웹 호출에서이 기능을 사용한다는 것을 기억하십시오.

프레임 워크를 도와 주시면 감사하겠습니다.

+0

좋아, 잘 모르겠다. 나는이 클래스를 사용할 수 있지만 모든 파일에 써야한다. 권리? 대신, 나는 별도의 파일에 쓸 수 있고 그것을 포함 할 수 있지만,이 방법은 약간 역설이다! 어쨌든이게 어떻게 내 문제를 해결할 수 있니? – Paciotti

+0

알았어, 알았다! 역설적 인 것은 없습니다! 죄송합니다 ... – Paciotti

+0

...하지만 여전히 내 문제에 대한 해결책이 필요합니다 ... – Paciotti