time = time(); $this->startSession(); } /** * startSession - Performs all the actions necessary to * initialize this session object. Tries to determine if the * the user has logged in already, and sets the variables * accordingly. Also takes advantage of this page load to * update the active visitors tables. */ function startSession(){ global $database; //The database connection session_start(); //Tell PHP to start the session /* Determine if user is logged in */ $this->logged_in = $this->checkLogin(); /** * Set guest value to users not logged in, and update * active guests table accordingly. */ if(!$this->logged_in){ $this->username = $_SESSION['username'] = GUEST_NAME; $this->userlevel = GUEST_LEVEL; $database->addActiveGuest($_SERVER['REMOTE_ADDR'], $this->time); } /* Update users last active timestamp */ else{ $database->addActiveUser($this->username, $this->time); } /* Remove inactive visitors from database */ $database->removeInactiveUsers(); $database->removeInactiveGuests(); /* Set referrer page */ if(isset($_SESSION['url'])){ $this->referrer = $_SESSION['url']; }else{ $this->referrer = "/"; } /* Set current url */ $this->url = $_SESSION['url'] = $_SERVER['PHP_SELF']; } /** * checkLogin - Checks if the user has already previously * logged in, and a session with the user has already been * established. Also checks to see if user has been remembered. * If so, the database is queried to make sure of the user's * authenticity. Returns true if the user has logged in. */ function checkLogin(){ global $database; //The database connection /* Check if user has been remembered */ if(isset($_COOKIE['cookname']) && isset($_COOKIE['cookid'])){ $this->username = $_SESSION['username'] = $_COOKIE['cookname']; $this->userid = $_SESSION['userid'] = $_COOKIE['cookid']; } /* Username and userid have been set and not guest */ if(isset($_SESSION['username']) && isset($_SESSION['userid']) && $_SESSION['username'] != GUEST_NAME){ /* Confirm that username and userid are valid */ if($database->confirmUserID($_SESSION['username'], $_SESSION['userid']) != 0){ /* Variables are incorrect, user not logged in */ unset($_SESSION['username']); unset($_SESSION['userid']); return false; } /* User is logged in, set class variables */ $this->userinfo = $database->getUserInfo($_SESSION['username']); $this->username = $this->userinfo['username']; $this->userid = $this->userinfo['userid']; $this->userlevel = $this->userinfo['userlevel']; return true; } /* User not logged in */ else{ return false; } } /** * login - The user has submitted his username and password * through the login form, this function checks the authenticity * of that information in the database and creates the session. * Effectively logging in the user if all goes well. */ function login($subuser, $subpass, $subremember){ global $database, $form; //The database and form object /* Username error checking */ $field = "user"; //Use field name for username if(!$subuser || strlen($subuser = trim($subuser)) == 0){ $form->setError($field, "* Username not entered"); } else{ /* Check if username is not alphanumeric */ if(!eregi("^([0-9a-z])*$", $subuser)){ $form->setError($field, "* only letters and numbers allowed and no spaces"); } } /* Password error checking */ $field = "pass"; //Use field name for password if(!$subpass){ $form->setError($field, "* Password not entered"); } /* Return if form errors exist */ if($form->num_errors > 0){ return false; } /* Checks that username is in database and password is correct */ $subuser = stripslashes($subuser); $result = $database->confirmUserPass($subuser, md5($subpass)); /* Check error codes */ if($result == 1){ $field = "user"; $form->setError($field, "* Username not found"); } else if($result == 2){ $field = "pass"; $form->setError($field, "* Invalid password"); } /* Return if form errors exist */ if($form->num_errors > 0){ return false; } /* Username and password correct, register session variables */ $this->userinfo = $database->getUserInfo($subuser); $this->username = $_SESSION['username'] = $this->userinfo['username']; $this->userid = $_SESSION['userid'] = $this->generateRandID(); $this->userlevel = $this->userinfo['userlevel']; /* Insert userid into database and update active users table */ $database->updateUserField($this->username, "userid", $this->userid); $database->addActiveUser($this->username, $this->time); $database->removeActiveGuest($_SERVER['REMOTE_ADDR']); /** * This is the cool part: the user has requested that we remember that * he's logged in, so we set two cookies. One to hold his username, * and one to hold his random value userid. It expires by the time * specified in constants.php. Now, next time he comes to our site, we will * log him in automatically, but only if he didn't log out before he left. */ if($subremember){ setcookie("cookname", $this->username, time()+COOKIE_EXPIRE, COOKIE_PATH); setcookie("cookid", $this->userid, time()+COOKIE_EXPIRE, COOKIE_PATH); } /* Login completed successfully */ return true; } /** * logout - Gets called when the user wants to be logged out of the * website. It deletes any cookies that were stored on the users * computer as a result of him wanting to be remembered, and also * unsets session variables and demotes his user level to guest. */ function logout(){ global $database; //The database connection /** * Delete cookies - the time must be in the past, * so just negate what you added when creating the * cookie. */ if(isset($_COOKIE['cookname']) && isset($_COOKIE['cookid'])){ setcookie("cookname", "", time()-COOKIE_EXPIRE, COOKIE_PATH); setcookie("cookid", "", time()-COOKIE_EXPIRE, COOKIE_PATH); } /* Unset PHP session variables */ unset($_SESSION['username']); unset($_SESSION['userid']); /* Reflect fact that user has logged out */ $this->logged_in = false; /** * Remove from active users table and add to * active guests tables. */ $database->removeActiveUser($this->username); $database->addActiveGuest($_SERVER['REMOTE_ADDR'], $this->time); /* Set user level to guest */ $this->username = GUEST_NAME; $this->userlevel = GUEST_LEVEL; } /** * register - Gets called when the user has just submitted the * registration form. Determines if there were any errors with * the entry fields, if so, it records the errors and returns * 1. If no errors were found, it registers the new user and * returns 0. Returns 2 if registration failed. */ function register($subuser, $subpass, $subemail){ global $database, $form, $mailer; //The database, form and mailer object /* Username error checking */ $field = "user"; //Use field name for username if(!$subuser || strlen($subuser = trim($subuser)) == 0){ $form->setError($field, "* Username not entered"); } else{ /* Spruce up username, check length */ $subuser = stripslashes($subuser); if(strlen($subuser) < 5){ $form->setError($field, "* Username below 5 characters"); } else if(strlen($subuser) > 30){ $form->setError($field, "* Username above 30 characters"); } /* Check if username is not alphanumeric */ else if(!eregi("^([0-9a-z])+$", $subuser)){ $form->setError($field, "* * only letters and numbers allowed and no spaces"); } /* Check if username is reserved */ else if(strcasecmp($subuser, GUEST_NAME) == 0){ $form->setError($field, "* Username reserved word"); } /* Check if username is already in use */ else if($database->usernameTaken($subuser)){ $form->setError($field, "* Username already in use"); } /* Check if username is banned */ else if($database->usernameBanned($subuser)){ $form->setError($field, "* Username banned"); } } /* Password error checking */ $field = "pass"; //Use field name for password if(!$subpass){ $form->setError($field, "* Password not entered"); } else{ /* Spruce up password and check length*/ $subpass = stripslashes($subpass); if(strlen($subpass) < 4){ $form->setError($field, "* Password too short"); } /* Check if password is not alphanumeric */ else if(!eregi("^([0-9a-z])+$", ($subpass = trim($subpass)))){ $form->setError($field, "* * only letters and numbers allowed and no spaces"); } /** * Note: I trimmed the password only after I checked the length * because if you fill the password field up with spaces * it looks like a lot more characters than 4, so it looks * kind of stupid to report "password too short". */ } /* Email error checking */ $field = "email"; //Use field name for email if(!$subemail || strlen($subemail = trim($subemail)) == 0){ $form->setError($field, "* Email not entered"); } else{ /* Check if valid email address */ $regex = "^[_+a-z0-9-]+(\.[_+a-z0-9-]+)*" ."@[a-z0-9-]+(\.[a-z0-9-]{1,})*" ."\.([a-z]{2,}){1}$"; if(!eregi($regex,$subemail)){ $form->setError($field, "* Email invalid"); } $subemail = stripslashes($subemail); } /* Errors exist, have user correct them */ if($form->num_errors > 0){ return 1; //Errors with form } /* No errors, add the new account to the */ else{ if($database->addNewUser($subuser, md5($subpass), $subemail)){ if(EMAIL_WELCOME){ $mailer->sendWelcome($subuser,$subemail,$subpass); } return 0; //New user added succesfully }else{ return 2; //Registration attempt failed } } } /** * editAccount - Attempts to edit the user's account information * including the password, which it first makes sure is correct * if entered, if so and the new password is in the right * format, the change is made. All other fields are changed * automatically. */ function editAccount($subcurpass, $subnewpass, $subemail){ global $database, $form; //The database and form object /* New password entered */ if($subnewpass){ /* Current Password error checking */ $field = "curpass"; //Use field name for current password if(!$subcurpass){ $form->setError($field, "* Current Password not entered"); } else{ /* Check if password too short or is not alphanumeric */ $subcurpass = stripslashes($subcurpass); if(strlen($subcurpass) < 4 || !eregi("^([0-9a-z])+$", ($subcurpass = trim($subcurpass)))){ $form->setError($field, "* Current Password incorrect"); } /* Password entered is incorrect */ if($database->confirmUserPass($this->username,md5($subcurpass)) != 0){ $form->setError($field, "* Current Password incorrect"); } } /* New Password error checking */ $field = "newpass"; //Use field name for new password /* Spruce up password and check length*/ $subpass = stripslashes($subnewpass); if(strlen($subnewpass) < 4){ $form->setError($field, "* New Password too short"); } /* Check if password is not alphanumeric */ else if(!eregi("^([0-9a-z])+$", ($subnewpass = trim($subnewpass)))){ $form->setError($field, "* New Password not alphanumeric"); } } /* Change password attempted */ else if($subcurpass){ /* New Password error reporting */ $field = "newpass"; //Use field name for new password $form->setError($field, "* New Password not entered"); } /* Email error checking */ $field = "email"; //Use field name for email if($subemail && strlen($subemail = trim($subemail)) > 0){ /* Check if valid email address */ $regex = "^[_+a-z0-9-]+(\.[_+a-z0-9-]+)*" ."@[a-z0-9-]+(\.[a-z0-9-]{1,})*" ."\.([a-z]{2,}){1}$"; if(!eregi($regex,$subemail)){ $form->setError($field, "* Email invalid"); } $subemail = stripslashes($subemail); } /* Errors exist, have user correct them */ if($form->num_errors > 0){ return false; //Errors with form } /* Update password since there were no errors */ if($subcurpass && $subnewpass){ $database->updateUserField($this->username,"password",md5($subnewpass)); } /* Change Email */ if($subemail){ $database->updateUserField($this->username,"email",$subemail); } /* Success! */ return true; } /** * isAdmin - Returns true if currently logged in user is * an administrator, false otherwise. */ function isAdmin(){ return ($this->userlevel == ADMIN_LEVEL || $this->username == ADMIN_NAME); } /** * generateRandID - Generates a string made up of randomized * letters (lower and upper case) and digits and returns * the md5 hash of it to be used as a userid. */ function generateRandID(){ return md5($this->generateRandStr(16)); } /** * generateRandStr - Generates a string made up of randomized * letters (lower and upper case) and digits, the length * is a specified parameter. */ function generateRandStr($length){ $randstr = ""; for($i=0; $i<$length; $i++){ $randnum = mt_rand(0,61); if($randnum < 10){ $randstr .= chr($randnum+48); }else if($randnum < 36){ $randstr .= chr($randnum+55); }else{ $randstr .= chr($randnum+61); } } return $randstr; } }; /** * Initialize session object - This must be initialized before * the form object because the form uses session variables, * which cannot be accessed unless the session has started. */ $session = new Session; /* Initialize form object */ $form = new Form; ?> Ricky Gervais... Obviously. " ."" .""; $forminput = "" ."" ."" . ""; if($session->logged_in){ $toptagline ="" ."" .""; $forminput = ""; } else{ /** * User not logged in, display the login form. * If user has already tried to login, but errors were * found, display the total number of errors. * If errors occurred, they will be displayed. */ if($form->num_errors > 0){ $errorline = ""; } } $membersline = "There are ".$database->getNumMembers()." members signed up to Ricky Gervais.Com - ". $database->num_active_users ." are signed in now and there are " . $database->num_active_guests. " people just visiting"; ?>


The Office man talks exclusively to DVD REVIEW about his new star-studded series extras, his awkward relationship with fame and giving Tom Cruise a call on the blower ...

When you were considering your next project after The Office was Extras the first idea you came up with?
No, even during The Office's early days we had this backlog of ideas that we were considering because we always knew we were going to end The Office quickly. We had a couple of other projects that we came up with before Extras - one was about community service workers and that was called The Black Sheep Of Garstang Park. That was going to be like the new Auf Wiedersehen Pet and then the old Auf Wiedersehen Pet came back, so we thought, 'Well, that's pointless'. Then the other idea, which we might still do, is a movie called Man At The Pru, which is about a group of twenty- to thirtysomethings in 1970 in a seaside town where the '60s didn't really happen. It's just about them mucking around and wasting their lives and then getting married ... while working at the Prudential.

So why did you opt for Extras? It just felt right. It felt like we were starting where we left off with The Office, because the Christmas Special started exploring that desperation for fame. So it continued my fascination with celebrity, desperation, ego, and acceptance. And you write about what you know - I worked in an office for seven years, and the last seven years I've been working in the media industry. It seemed ripe and it was nice to cash in with what we'd earned with The Office, which was becoming the Hollywood darlings.

How come your writing partner Stephen Merchant has opted to appear in front of the camera? I think he was fed up of me getting sent free things (laughs). He had a little cameo in The Office but we had to think of a part that was right for him.

But wasn't he originally going to play Gareth in The Office? No, that's not true. What happened was that Mackenzie Crook came in for the part and thought it would be funny to speak like Steve. Actually, maybe it was our idea that Gareth was from the West Country, because we both think it's a funny accent ... particularly when you're talking about post-apocalyptic survival.

Because you were so ingrained in people's minds as David Brent. did you ever consider just writing and directing the series and not starring as Andy? Yeah. Well, before we knew it was going to be Extras, I thought I wouldn't be in the next thing that we did. And that wasn't to avoid being David Brent, it was to avoid the fame aspect. I didn't like it when I first became famous, it gave me the creeps. I didn't like the attention, I didn't like the recognition. I didn't like any of it. I still don't, but I've gotten over it now.

You seem pretty at ease with with your celebrity status ... There are a few things that I'm still not comfortable with. And there are different levels of fame. Obviously, what I don't do is turn up at premieres of films that I'm not in. I don't go to showbiz events because there is free champagne. I don't hang around after awards ceremonies. I don't do reality game shows. I don't sell my story to Hello!. I don't do any of those things because I'm not interested in them and I want to downplay my fame I certainly don't crave the mainstream.

Which of the celebs that featured in Extras were you most in awe of? Well, when Sam Jackson walked into the room you knew someone pretty damn impressive had entered the building.

Which of the six episodes is your favourite? I think for pure comedy and the deconstruction of a person, Les Dennis' is probably the most complete. With Les Dennis you knew what you were getting and I think that episode might be most people's favourites. Everyone got the references and everyone knows him so intimately; you don't really know what Sam Jackson is like in his life. I'm very proud of the Kate Winslet one, because of the storylines and the issues that we addressed. It's also nice to have the star of the biggest film ever, dressed as a nun, talking to a Nazi, about phonesex - now that that didn't happen in Terry And June.

How did you find writing your Simpsons episode? I'm such a fan and know the show back to front, it felt like I was one of the team writers. You've also got to realise that when it comes out in March and the credit that says 'written by Ricky Gervais', it was a joint effort. I sent them the script and they sent back ideas which I incorporated - it was constantly back and forth. It was the closest I've come to collaboration.

Would you want to work collaboratively like that again? Well, I did it because it was The Simpsons, but I usually say no to anything that's not my project. I like being uncompromised and doing exactly what I want. But there's a couple of things that I'm doing this year which you just don't say no to: one of which is The Simpsons (which is one of the greatest shows ever); the other is Christopher Guest's new film For Your Consideration.

You've famously turned down roles in a host of big-budget Hollywood films, so what made you go for this? Well, he's the biggest influence on my comedy certainly my comedy acting style - and Spinal Tap is probably the greatest comedy of all time. It's another thing that I've never done before, because it's completely improvised. People think The Office was improvised but it's not, it was all on the page.

You turned down a role in The Merchant Of Venice were you not tempted to do it just to meet AI Pacino? Well, yeah, I was, but then I thought, 'Why am I doing this?'. I don't love Shakespeare, I don't know if I'd be any good at it, and if I really wanted to meet Pacino I'm sure I could, I'd write to Jim 'II Fix It! But you have to be disciplined with my cache from The Office I could spend the next 10 years popping up in all my favourite things ever, but to what end? I could spend six months in a Winnebago and cameo as a pirate for five minutes, but in that time I could have broken the back of a new sitcom in a room in central London with Steve Merchant, and for me that's more exciting.

How's the Mission Impossible II part working out? I'm not going to do it now, because I want to do Chris' film instead.

So no Cruise in Extras, then? Well I don't mind phoning him up and saying, 'Oil Cruise, what you doing next June?' I'm not proud, I don't mind if all I hear back is, "CLICK, buzzzzzzzzzzz ... " If we come up with an idea for him, we'd approach him. We're not scared of approaching anyone; we're not scared of getting a no. We've also found out that he likes The Office, which is bizarre to think that Tom settles down to watch the show.

Will your Xfm radio show return? We're actually going to do a podcast with me, Steve and Karl Pilkington (Yes, he is for real- he's brilliant). What we want to do is a radio show for ourselves and just stick it straight onto the internet at a regular time each week so people can download it, and we're trying to make it free.

And finally, we've got an idea for a film for you: it's a new Carry On movie with you, Catherine Tate, Peter Kay and Bradley Walsh - what do you reckon? Well, let's think (long, long, long pause) when Hell freezes over.

Sign up now and you'll have full access to the site and get the odd email from Ricky when he's got something to tell you.

" ."sign up | forgotten your password?

Already signed up? Sign in here...


Hello, " .$session->username .". You're signed in.

" ."username\">my details | " ."edit details"; if($session->isAdmin()){ $toptagline = $toptagline." | admin"; } $toptagline = $toptagline." | sign off
".$form->num_errors." error(s) found

From top: Andy Millman (Gervais) and his hapless agent (Stephen Merchant) in Extras; as David Brent in The Office; relaxing on the set of Extras