title: PHP page view counter
body: <p>I downloaded a php view counter and I set it the database but when it comes to show the hits I am getting error. The documentation says </p>
  
  <ul>
  <li>USAGE:
  <ul>
  <li>In your script, use reqire_once() to import this script, then call the</li>
  <li>functions like PHPCount::AddHit(...); See each function for help.
  *</li>
  </ul></li>
  </ul>
  
  <p>Here is my demo.php where I want to show the view. But it is throwing</p>
  
  <p><code>Notice: Undefined variable: pageID in C:\xampp\htdocs\test\demo.php on line 4
  1</code></p>
  
  <pre><code> &lt;?php
  include_once("hit.php");
  echo //this is what I added.
  PHPCount::AddHit($pageID);
  ?&gt;
  </code></pre>
  
  <p>The below is hit.php and <strong>what I wanna know is how can I show the views on the above demo.php?</strong></p>
  
  <pre><code>    &lt;?php
  /*
   * USAGE:
   *        In your script, use reqire_once() to import this script, then call the
   *        functions like PHPCount::AddHit(...); See each function for help.
   *
   * NOTE: You must set the database credentials in the InitDB method.
   */
  
  class PHPCount
  {
      /*
      * Defines how many seconds a hit should be rememberd for. This prevents the
      * database from perpetually increasing in size. Thirty days (the default)
      * works well. If someone visits a page and comes back in a month, it will be
      * counted as another unique hit.
       */
       const HIT_OLD_AFTER_SECONDS = 2592000; // default: 30 days.
  
      // Don't count hits from search robots and crawlers.
      const IGNORE_SEARCH_BOTS = true;
  
       // Don't count the hit if the browser sends the DNT: 1 header.
  const HONOR_DO_NOT_TRACK = false;
  
  private static $IP_IGNORE_LIST = array(
      '127.0.0.1',
  );
  
  private static $DB = false;
  
  private static function InitDB()
  {
      if(self::$DB)
          return;
  
      try
      {
          // TODO: Set the database login credentials.
          self::$DB = new PDO(
              'mysql:host=localhost;dbname=test',
              'root', // Username
              '', // Password
              array(PDO::ATTR_PERSISTENT =&gt; true)
          );
      }
      catch(Exception $e)
      {
          die('Failed to connect to phpcount database');
      }
  }
  
  /*
   * Adds a hit to a page specified by a unique $pageID string.
   */
  public static function AddHit($pageID)
  {
      if(self::IGNORE_SEARCH_BOTS &amp;&amp; self::IsSearchBot())
          return false;
      if(in_array($_SERVER['REMOTE_ADDR'], self::$IP_IGNORE_LIST))
          return false;
      if(
          self::HONOR_DO_NOT_TRACK &amp;&amp;
          isset($_SERVER['HTTP_DNT']) &amp;&amp; $_SERVER['HTTP_DNT'] == "1"
      ) {
          return false;
      }
  
      self::InitDB();
  
      self::Cleanup();
      self::CreateCountsIfNotPresent($pageID);
      if(self::UniqueHit($pageID))
      {
          self::CountHit($pageID, true);
          self::LogHit($pageID);
      }
      self::CountHit($pageID, false);
  
      return true;
  }
  
  /*
   * Returns (int) the amount of hits a page has
   * $pageID - the page identifier
   * $unique - true if you want unique hit count
   */
  public static function GetHits($pageID, $unique = false)
  {
      self::InitDB();
  
      self::CreateCountsIfNotPresent($pageID);
  
      $q = self::$DB-&gt;prepare(
          'SELECT hitcount FROM hits
           WHERE pageid = :pageid AND isunique = :isunique'
      );
      $q-&gt;bindParam(':pageid', $pageID);
      $q-&gt;bindParam(':isunique', $unique);
      $q-&gt;execute();
  
      if(($res = $q-&gt;fetch()) !== FALSE)
      {
          return (int)$res['hitcount'];
      }
      else
      {
          die("Missing hit count from database!");
          return false;
      }
  }
  
  /*
   * Returns the total amount of hits to the entire website
   * When $unique is FALSE, it returns the sum of all non-unique hit counts
   * for every page. When $unique is TRUE, it returns the sum of all unique
   * hit counts for every page, so the value that's returned IS NOT the 
   * amount of site-wide unique hits, it is the sum of each page's unique
   * hit count.
   */
  public static function GetTotalHits($unique = false)
  {
      self::InitDB();
  
      $q = self::$DB-&gt;prepare(
          'SELECT hitcount FROM hits WHERE isunique = :isunique'
      );
      $q-&gt;bindParam(':isunique', $unique);
      $q-&gt;execute();
      $rows = $q-&gt;fetchAll();
  
      $total = 0;
      foreach($rows as $row)
      {
          $total += (int)$row['hitcount'];
      }
      return $total;
  }
  
  /*====================== PRIVATE METHODS =============================*/
  
  private static function IsSearchBot()
  {
      // Of course, this is not perfect, but it at least catches the major
      // search engines that index most often.
      $keywords = array(
          'bot',
          'spider',
          'spyder',
          'crawlwer',
          'walker',
          'search',
          'yahoo',
          'holmes',
          'htdig',
          'archive',
          'tineye',
          'yacy',
          'yeti',
      );
  
      $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
  
      foreach($keywords as $keyword) 
      {
          if(strpos($agent, $keyword) !== false)
              return true;
      }
  
      return false;
  }
  
  private static function UniqueHit($pageID)
  {
      $ids_hash = self::IDHash($pageID);
  
      $q = self::$DB-&gt;prepare(
          'SELECT time FROM nodupes WHERE ids_hash = :ids_hash'
      );
      $q-&gt;bindParam(':ids_hash', $ids_hash);
      $q-&gt;execute();
  
      if(($res = $q-&gt;fetch()) !== false)
      {
          if($res['time'] &gt; time() - self::HIT_OLD_AFTER_SECONDS)
              return false;
          else
              return true;
      }
      else
      {
          return true;
      }
  }
  
  private static function LogHit($pageID)
  {
      $ids_hash = self::IDHash($pageID);
  
      $q = self::$DB-&gt;prepare(
          'SELECT time FROM nodupes WHERE ids_hash = :ids_hash'
      );
      $q-&gt;bindParam(':ids_hash', $ids_hash);
      $q-&gt;execute();
  
      $curTime = time();
  
      if(($res = $q-&gt;fetch()) !== false)
      {
          $s = self::$DB-&gt;prepare(
              'UPDATE nodupes SET time = :time WHERE ids_hash = :ids_hash'
          );
          $s-&gt;bindParam(':time', $curTime);
          $s-&gt;bindParam(':ids_hash', $ids_hash);
          $s-&gt;execute();
      }
      else
      {
          $s = self::$DB-&gt;prepare(
              'INSERT INTO nodupes (ids_hash, time)
               VALUES( :ids_hash, :time )'
          );
          $s-&gt;bindParam(':time', $curTime);
          $s-&gt;bindParam(':ids_hash', $ids_hash);
          $s-&gt;execute();
      }
  }
  
  private static function CountHit($pageID, $unique)
  {
      $q = self::$DB-&gt;prepare(
          'UPDATE hits SET hitcount = hitcount + 1 ' .
          'WHERE pageid = :pageid AND isunique = :isunique'
      );
      $q-&gt;bindParam(':pageid', $pageID);
      $unique = $unique ? '1' : '0';
      $q-&gt;bindParam(':isunique', $unique);
      $q-&gt;execute();
  }
  
  private static function IDHash($pageID)
  {
      $visitorID = $_SERVER['REMOTE_ADDR'];
      return hash("SHA256", $pageID . $visitorID);
  }
  
  private static function CreateCountsIfNotPresent($pageID)
  {
      // Non-unique
      $q = self::$DB-&gt;prepare(
          'SELECT pageid FROM hits WHERE pageid = :pageid AND isunique = 0'
      );
      $q-&gt;bindParam(':pageid', $pageID);
      $q-&gt;execute();
  
      if($q-&gt;fetch() === false)
      {
          $s = self::$DB-&gt;prepare(
              'INSERT INTO hits (pageid, isunique, hitcount) 
               VALUES (:pageid, 0, 0)'
          );
          $s-&gt;bindParam(':pageid', $pageID);
          $s-&gt;execute();
      }
  
      // Unique
      $q = self::$DB-&gt;prepare(
          'SELECT pageid FROM hits WHERE pageid = :pageid AND isunique = 1'
      );
      $q-&gt;bindParam(':pageid', $pageID);
      $q-&gt;execute();
  
      if($q-&gt;fetch() === false)
      {
          $s = self::$DB-&gt;prepare(
              'INSERT INTO hits (pageid, isunique, hitcount) 
               VALUES (:pageid, 1, 0)'
          );
          $s-&gt;bindParam(':pageid', $pageID);
          $s-&gt;execute();
      }
  }
  
  private static function Cleanup()
  {
      $last_interval = time() - self::HIT_OLD_AFTER_SECONDS;
  
      $q = self::$DB-&gt;prepare(
          'DELETE FROM nodupes WHERE time &lt; :time'
      );
      $q-&gt;bindParam(':time', $last_interval);
      $q-&gt;execute();
  }
  }
  </code></pre>