CodeIgniter 500 Internal Server Error [closed]-Collection of common programming errors


  • teresko

    ANSWERED! IT WAS A TYPO OMG. Always check EVERY CHARACTER

    I have three controllers, Site, Login and Admin. Site and Login work perfectly. I know I am logging in correctly, because I set the “incorrect username” blah blah error message, which shows up if I have incorrect login details. When I log in successfully however, I get a 500 Internal Server Error:

    HTTP Error 500 (Internal Server Error): An unexpected condition was encountered while the server was attempting to fulfill the request.

    Here’s the admin controller:

    function __construct()
        {
            parent::Controller();
            $this->isLogged();
        }
    
        function isLogged()
        {
            $isLogged = $this->session->userdata('isLogged');
    
            if (!isset($isLogged) || $isLogged != true)
            {
                redirect('login/index');
            }
        }
    
        function index()
        {
            $data['metaDescription'] = 'Admin area of danaemc.com';
            $data['keywords'] = '';
            $data['title'] = 'danaemc :: admin :: home';
    
            $data['main_content'] = 'admin_view';
            $this->load_view('includes/admin_template', $data);
        }
    

    In which where it tries to access index(), the 500 error happens.

    If you need more code, let me know in a comment. I hope it is something obvious.


  • Damien Pirsy

    Looks like a problem with your function that checks login. From the code you provide, I see this workflow:

    • User is not logged: he’s redirected to login/index and logs in.
    • I suppose then he’s redirected to admin controller, right? (when succesfully logged). Ok, now when admin controller is initialized it checks, within the controller itself, if the user is logged.
    • It is, ok, but you don’t tell it to go to some other page if the user is logged, so: you go to admin/index, but the constructor “intercepts” your request BEFORE it being routed (since the constructor is called as soon as the class is initialized, before the index() method is ever reached), and it hangs there: index() is called from the URL but the request doesn’t go past isLogged(), and this discrepancy can cause you those troubles (I had a similar problem once).

    You should do like this instead of using a controller’s method:

    function __construct()
    {
           parent::__construct();   //what is parent::Controller() you wrote??
          if(!isset($this->session->userdata('isLogged')) OR $this->session->userdata('isLogged') == FALSE)
          {
             redirect('login', 'refresh'); // 'login/index' should be automatically called
          }
    
    }
    

    Moreover, as a side note, I’d do this check in some method in a library, and have it just return TRUE/FALSE and use that in my controller’s constructor. Like

     function __construct()
     {
       parent::__construct();
       if(FALSE === $this->myauthlibrary->is_logged())
       {
         redirect('login','refresh');
       }
     }
    

    This just for the sake of business logic and encapsulation, but it’s just an idea and an advice.
    If you still want to use the isLogged() of your Controller (but in this way every controller that checks for login needs is own method…) just put an ELSE clause, that redirects to index() if the checking gives positive response.

    Edited after comment:

    By chance are you calling a favicon in your meta tags? or whatever url you have? Did you spelled it RIGHT? And don’t have a href="http://mysite/favicon_ico", which CI things is a controller?


  • Wesley Murch

    You have an infinite redirect loop.

    isLogged() is run in __construct() before index(), so it keeps redirecting as long as your session data isn’t met.

    Another thing: !isset($isLogged) will always return false, because $this->session->userdata() will return boolean FALSE if there is no value, which is set. Make sense?

    $this->session->userdata('anything') is always “set”.

    Quick fix, assuming “index” is your login page in the same controller:

    function isLogged()
    {
        $isLogged = $this->session->userdata('isLogged');
        $isLoginPage = $this->router->method === 'index';
    
        if ( ! $isLogged && ! $isLoginPage)
        {
            redirect('login/index');
        }
    }
    

    Also, make sure to redirect somewhere else from your login page if the user is logged in.