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"; ?>


Created by Matt Groening; began in 1989; 335 episodes to date

"It might be a cartoon, but The Simpsons is the best television comedy ever. It's unfair because it's almost too good. The characters are beautiful. The writing is out of this world. I sometimes sit back in amazement and wonder how they didn't miss a trick. There are episodes when I've nearly been in tears, they're so beautiful and ambitious. Favourite episodes? The thing is, I was never a nerd. I've never been that sort of geek or had that sort of male autism where you know things off by heart. I never quoted Monty Python. But I do it with The Simpsons. I get with a like-minded person and I'm crying with laughter, telling them bits I remember. I met Matt Groening and I was even doing it to him. Although he just wanted to talk about The Office! It was a mutual back-slapping fest. I was going, 'Oh, The Simpsons is the greatest TV show on earth: and he was saying the same about The Office. He [Groening] said I could do a voice in an episode. I'm not well known enough to have a cameo. Just a character is fine. I'll probably end up being in a bar brawl."

Created by Larry David and Jerry Seinfeld; ran from 1990-1998; 180 episodes

"The first episode I saw was the 'master of my domain' one ['The Contest', about masturbation]. It was a beautiful metaphor. Nothing else needed to be said. The only way they knew they had one [a wank] is that they slept well. That lovely symbolism. No one said c** * or fuck. They take chances, but with the structure. Deconstructing the sitcom. They all do thatall that postmodern, looking-at-yourself stuff has been done before. Since the '30s or '40s. George Burns did it. But on Seinfeldthey do it a little better. It's a great example of a show not aiming to get 30 million viewers, but doing everything so beautifully that you can't help but get 30 million. And Jason Alexander as George Costanza is the greatest sitcom character of all time. He carries around a picture of his 'dead wife' because he thinks it will make girls like him."

Created by Dennis Klein and Garry Shandling; ran from 1992-1998; 89 episodes

"This is strange. It's like working out. You don't look forward to it because you know it's going to hurt, but you feel good afterwards. Larry Sanders and Curb Your Enthusiasm, sometimes you're not sure you should go through with them. But they're brilliant. I possibly don't get the emotional effect I get watching Seinfeld and The Simpsons. I want to hug Homer. I want to hug George. The Larry Sanders characters are successfuJ media types, so you can't feel sorry for their petty insecurities, their jealousies, their back-biting. It plumbed new depths. But what a character! And so believable. The detail is spine-chilling. The Office owes more to Larry Sanders than anything British, just in terms of realism. It has real people, acting normally. It's filmed very rugged, very warts'n'all. No laughter. Almost filmic. I think we stole the white-out-of-black credits as well."

Created by Nat Hiken; ran from 1955-1959; 143 episodes

"He's a winner in the same way I thought Fletch in Porridge was a winner when I watched it as a kid. He's a wise-cracker, but he's not a winner because he's incarcerated. Bilko is trapped: he's in the army. He's got the people he's trying to rip off, the military police, the ineffectual boss, and his future wife keeping an eye on him. Everyone wants a piece of him, but all he wants to do is get one over on them. He's pathetic, except you like him because he's a loser. And he's no threat. He's a middle-aged ~ man with a funny hairdo and big glasses. And f he's surrounded by idiots - waifs and strays - 2 and he's got to look after them. It's lovely big themes as well: getting on, making a difference, standing by friends. I know we're looking at an antique, but it hasn't dated at all."

Created by Larry David; began in 2000; 40 episodes to date

"They've all been Jewish comedies so far - I love Jewish humour. I love Woody Allen. It's difficult to say what Jewish humour is, but it's there, from the Marx brothers through to Curb... You can follow the trail of behaviour from Seinfeld to Curb... This is paranoia taken to the nth degree. It's the furthest out there. People who watch The Office sometimes say they have to watch it through their fingers, but this goes way beyond that. I have to keep mumbling 'Oh god, oh god' just to get me through it. The 'Beloved Aunt' episode. The golf club episode ('The 5 Wood'). The one about the incest survivors' group ('The Group'). Unbelievable. Pretension is beautiful. From Groucho through Bilko and Hancock, you're watching losers trying to better themselves but getting it so wrong. Lying seems worth it, but it never is. Larry David lies his way through the whole show."

Written by Dick Clement and Ian La Frenais; ran from 1973-1977; 19 episodes

"Fletch was a lovely character: a man in a prison cell with the weight of the world on his shoulders. When you're growing up, you think he's cool - but he's a loser who pays the price for his bravado. The only way for him to survive is an almost parental desire to stop Godber [Richard Beckinsale] making the same mistakes as him. It's Bilko all over again - he's surrounded by idiots, but he's got to save them. And he's got to come out looking good. He's got to play Harry Grout off against the screws, and Barraclough, and Mackay. There's compassion there, and laughter in the face of adversity. It was Clement-La Frenais. I prefer the singular vision of this or Steptoe & Son to something like Friends, which was written by committee. Ronnie Barker underrated? I don't think so. They called him The Gaffer, didn't they? "

Created by James Burrows, Glen Charles and Les Charles; ran from 1982-1993; 275 episodes

"This has got to be cited as the blueprint for the classic modern US sitcom. And it stands up. Americans are so good at setting up a character and then letting the audience in on the joke, so they can take short cuts and you automatically know what the character will do in the situation. Cheers set a precedent: every character was a potential spin-off. You could cover up the name and you'd know who was saying it. They were so well drawn, and their relationships were great. It wasn't particularly edgy. I don't care about something being cutting edge or innovative, unless it's incidental. because innovation dates so quickly. Saying 'c***' doesn't excite me. Things being done better than before does. Not, 'Lets shock, let's do something new.' Just, 'Let's do something really well.' Good comedy comes from a nice, warm place, not from shocking people."

Written by David Nobbs; ran from 1976-1978; 21 episodes

"Along with Richard Briers, Leonard Rossiter is the greatest British sitcom actor. Perrin is almost too good to be a sitcom. It's above sitcoms. It's about the futility of existence, the dilemmas we all face. It's really heavy stuff. Reggie loves his wife, but what's the point of it all? You don't have that sort of thing in a knockabout family comedy. It's a satire. There's one lovely scene where Reggie's about to have an affair with his secretary Joan [Sue Nicholls] -I just realised I stole a bit of this, it's a bit David Brent - where he leans up against the wall, and gets a whiff of underarm and comes back down with a new shirt on. Then he does it again... That stayed with me for 25 years! It's really dark, and quite sad. And even the music is melancholy and depressing. But it's got real heart."

Written by John Cleese and Connie Booth; ran from 1975-1979; 12 episodes

"Could it have gone on longer? I doubt whether sitting down for the third series would have been as exciting as watching episode one of the second series, because we'd been waiting for four years. Cleese and [Connie] Booth put everything into it. It was a Whitehall farce, but the best one ever. It had wobbly walls, it was old-fashioned but, again, it's not that you've got to be an innovator, but that you've got to be better than anyone else. 'I know, let's do it in French with our heads in plant pots!' No. Fawlty Towers bridged the new and the old. It had a conventional setting, but it also had that scene where he's in hospital and he [Fawlty] jumps back when he sees the black doctor. We did that in The Office, where Brent couldn't act normally around the black guy. It's about exposing prejudice."

Written by John Esmonde and Bob Larbey; ran from 1984-1989; 27 episodes

"Richard Briers' character, Martin, is a nerd, an anal, obsessive jobsworth. Meanwhile, next door lives witty, clever, handsome Paul. But there's no chance Anne is going to cheat on Martin. Without the jokes, this could be a serious drama. On an emotional level, it connects with me more than, say, Blackadder or Alan Partridge. They're braver and funnier, but this gets so many points in the bank for elegance and honesty. For Briers, it was more of a stretch than The Good Life. You can't compare Briers with Cleese because Cleese is an auteur. You can only compare like with like. Rossiter went deeper, but he's dead, so Briers won't mind if I call him the greatest sitcom actor of all time. But Briers is the greatest living British sitcom actor."


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