Location: PHPKode > projects > phpLedAds > ad_class.php
<?php
/*
 *****************************************************************
 *			       	phpLedAds 2.x
 *
 * This program is distributed as freeware. We are not
 * responsible for any damages that the program causes	
 * to your system. It may be used and modified free of 
 * charge, as long as the copyright notice
 * in the program that give me credit remain intact.
 * If you find any bugs in this program. Please feel free 
 * to report it to hide@address.com
 * If you have any troubles installing this program. Please feel
 * free to post a message on our Support Forum.
 * Selling this script is absolutely forbidden and illegal.
 *
 *****************************************************************
 *
 *	               COPYRIGHT NOTICE:
 *	
 *	         Copyright 2004 Jon Coulter
 *	
 *	      Author:  Jon Coulter
 *	      Web Site: http://www.ledscripts.com
 *	      E-Mail: hide@address.com
 *	      Support: http://www.ledscripts.com/
 *
 *       This program is protected by the U.S. Copyright Law
 *****************************************************************
*/


if(defined('LEDPHPADS_OUTPUT')) {
	return;
} else {
	define('LEDPHPADS_OUTPUT', 1);
}

require_once(dirname(__FILE__) . '/common.inc.php');
$pla_class = new phpLedAdsOutput( $pla );

srand( _extras::make_seed() );

class phpLedAdsOutput
{
	function phpLedAdsOutput( &$pla ) {
		$this->core = &$pla;
		$this->conn = &$this->core->conn;
	}
	
	function random_key( $wanttype = false ) {
		static $total;
		
		if($this->core->config('display_unique')) {
			// reset this so its called each time
			unset($total);
		}
		
		/*
			Note:
				We could have used mysql's rand() function
				to save 1 query here, but that requires mysql version 3.23 or above...
				some people are still using 3.22 or less.
		*/
		
		// cache our count of all ads
		if(!isset($total)) {
			for($i = 0; $i < 2; $i++) {
				$sql = "select count(*) as total from "
						. $this->core->tables['ads'];

				/* have we shown any ads? */
				if($cur = $this->shown( )) {
					$sql .= " where aid not in ($cur)";
				}

				$result = mysql_query($sql, $this->conn)
						or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
				$row = mysql_fetch_object($result);
				mysql_free_result($result);

				if(($total = $row->total) == 0) {
					/* reset this and loop again */
					$this->shown(-1);
					continue;
				} else {
					break;
				}
			}
		}
		
		/* this means we couldn't find any ads */
		if($total == 0) {
			$this->core->croak("No ads found in database!");
		}
		
		$rand = rand(1, $total);
		
		// use mysql's limit atribute to get the random ad key
		$sql = "select aid, type, did from "
				. $this->core->tables['ads']
				/* don't forget to excludes shown ads */
				. ($cur ? " where aid not in ($cur)" : null)
				. " limit " . ($rand - 1) .", "
				. $total;
				
		$result = mysql_query($sql, $this->conn)
				or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		$row = mysql_fetch_object($result);
		mysql_free_result($result);
		
		if($this->core->config('display_unique')) {
			// record the ad
			$this->shown($row->aid);
		}
		
		/* return details or just the ad id? */
		return ($wanttype) ? array($row->aid, $row->type, $row->did) : $row->aid;
	}
	
	/* get the type of ad */
	function get_type( $key ) {
		static $cache;

		$key = intval($key);
		
		// cache it!
		if(isset($cache[$key])) {
			return $cache[$key];
		}
		
		$sql = "select type, did from "
			. $this->core->tables['ads']
			. " where (aid = $key)";
				
		$result = mysql_query($sql, $this->conn)
					or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		$row = mysql_fetch_object($result);
		
		return $cache[$key] = array($row->type, intval($row->did));
	}
	
	function adcode( $key = 0 ) {
		/* get a random key */
		if($key == 0) {
			list($key, $type, $did) = $this->random_key( true );
		}
		
		/* still no key? */
		if(!$key) {
			$this->core->croak("Unable to get a valid key ($key)");
		}
		
		/* if we can't get the type and data id,
		   make another call to get them 
		*/
		if(!$type or !$did) {
			list($type, $did) = $this->get_type( $key )
					or $this->core->croak("Unable to figure out the type of ($key)");
		}
		
		/* update the impression */
		$this->update_impression( $key );
		
		/* return the correct type of code now */
		if($type == 'image') {
			return $this->_image_code( $key );
		} else {
			return $this->_rich_code( $key );
		}
	}
	
	function update_impression( $key ) {
		$key = intval($key);
		$sql = "update "
			. $this->core->tables['impressions']
			. " set displays = displays + 1"
			. " where (impdate = now()) and (aid = $key)";
				
		/* execute the query */
		mysql_query($sql, $this->conn)
				or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		
		/* no rows affected, new day, new row */
		if(mysql_affected_rows($this->conn) <= 0) {
			$sql = "replace into "
				. $this->core->tables['impressions']
				. " (aid, impdate, displays, clicks)"
				. " values ($key, now(), 1, 0)";
			mysql_query($sql, $this->conn)
				or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		}
		
		return true;
	}
	
	function update_click( $key ) {
		$key = intval($key);
		$sql = "update "
			. $this->core->tables['impressions']
			. " set clicks = clicks + 1"
			. " where (impdate = now()) and (aid = $key)";
				
		mysql_query($sql, $this->conn)
				or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		if(mysql_affected_rows($this->conn) <= 0) {
			$sql = "replace into "
				. $this->core->tables['impressions']
				. " (aid, impdate, displays, clicks)"
				. " values ($key, now(), 0, 1)";
			mysql_query($sql, $this->conn) or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		}
		
		return true;
	}
	
	function redirect( $key ) {
		$key = intval($key);
		
		list($type, $did) = $this->get_type($key);
		
		$sql = "select url from "
			. $this->core->tables['images']
			. " where (did = $did)";
				
		$result = mysql_query($sql, $this->conn) or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		$row = mysql_fetch_object($result);
		
		/* redirect them */
		return $this->location( $row->url );
	}
	
	function location( $url ) {
		header("Location: " . $url);
		exit;
	}
	
	function _image_code( $key ) {
		$aid = intval($key);
		list($type, $key) = $this->get_type($aid);
		$sql = "select * from "
				. $this->core->tables['images']
				. " where (did = $key)";
				
		$result = mysql_query($sql, $this->conn)
						or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
		
		if(mysql_num_rows($result) <= 0) {
			$this->core->croak("No rows returned for image (from images table)!");
		} else {
			$row = mysql_fetch_object($result);
			
			$path = $this->core->config('usefullpath') ?
						$this->core->webpath :
						$this->core->path .'/';
			
			$click = $path . 'click.php';
			return $this->_head( ) .
					'<a href="' . $click . '?key=' . $aid . '" target="' . $row->target .'">'
					. '<img src="' 
					. $row->image_url . '"'
					. ' width="' . $row->width . '"'
					. ' height="' . $row->height . '"'
					. ' alt="' . htmlentities($row->alt_text) . '"'
					. ' border="0"></a>'
					. $this->_foot( );
		}
	}
	
	function _rich_code( $key ) {
		$rkey = $key;
		list($type, $key) = $this->get_type(intval($key));
		$sql = "select * from "
			. $this->core->tables['richtext']
			. " where (did = " . $key  . ")";
		
		$result = mysql_query($sql, $this->conn)
						or $this->core->croak("Mysql Error: ($sql) " . mysql_error());
						
		if(mysql_num_rows($result) <= 0) {
			$this->core->croak("No Rows returend for rich text ad (from rich text table)! (ID: $key)");
		} else {
			$row = mysql_fetch_object($result);
			
			return $this->_head( ) .
				str_replace(array('[random]', '[key]'),
					array(
						preg_replace('/[^0-9]/', '', uniqid(rand(1, (getrandmax() - 100)))),
						$rkey
					), $row->data)
				. $this->_foot( );
		}
	}
	
	/* our stuff */ 
	function _head( ) {
		return sprintf(
			'<!-- Generated by LedAds V%s -- http://www.ledscripts.com -->',
			$this->core->version
		);
	}
	
	function _foot( ) {
		return $this->_head( );
	}
	
	// added for 2nd release to track which ads have displayed
	function shown( $key = null ) {
		$note = 'ledads_shownkeys';
		
		if(isset($key)) {
			if($key == -1) {
				// reset
				return $this->note($note, '');
			} else {
				$cur = $this->note($note);
				
				if($cur) $cur .= ',';
				$cur .= $key;
				
				$this->note($note, $cur);
				
				return $cur;
			}
		} else {
			return $this->note($note);
		}
	}
	
	// added for 2nd release
	// wrapper around apache_note
	function note( $key, $val = null ) {
		if($this->core->config('extern_unique')) {
			// boo
			// store it on the file system
			return $this->fnote( $key, $val );
		}
		if(function_exists("apache_note")) {
			$ret = apache_note($key);
			
			if(isset($val)) {
				apache_note($key, $val);
			}
			
			return $ret;
		} else {
			// internal work around
			$ret = $this->_notes[$key];
			
			if(isset($val)) {
				$this->_notes[$key] = $val;
			}
			
			return $ret;
		}
	}
	
	// overhead city
	function fnote( $key, $val ) {
		$dir = $this->core->config('datadir');
		$life = intval( $this->core->config('unique_life') );
		$prefix = 'exterm_unique-';
		$time = time( );
		
		/* set a default life if none set */
		if($life <= 0) {
			$life = 10;
		}
		
		// nada
		if(!is_dir($dir)) return;
		
		$timer = _extras::catfile(array($dir, $prefix.'timer'));
		
		// clean how every 5 min
		/* this doesn't even try to execute except every 5 mintues
		   so this will save a tiny bit of overhead
		*/
		if($t = @filemtime($timer)) {
			// give 'expired' cache's a 5 min life
			if($t < ($time - 900)) {
				// clean out stuff
				if($fp = opendir($dir)) {
					while($f = readdir($fp)) {
						if(substr($f, 0, strlen($prefix)) == $prefix) {
							$file = _extras::catfile(array($dir, $f));
							if(filemtime($file) < ($time - $life)) {
								@unlink($file);
							}
						}
					}
				
					closedir($fp);
				}
				
				touch($timer) or die("Could not modify timer: $timer");
			}
		} else {
			/* create the timer */
			touch($timer) or die("Could not modify timer ($timer)");
		}
		
		$file = _extras::catfile(array(
				$dir,
				$prefix . str_replace('.', '-', getenv('REMOTE_ADDR'))
			)
		);
		
		if(file_exists($file)) {
			// give it a '$life'-second life
			if(filemtime($file) < ($time - $life)) {
				@unlink($file);
			}
		}
		
		/* get/set values now */
		$ret = @implode('', @file($file));

		if(isset($val)) {
			fwrite(fopen($file, 'w'), $val);
		}

		return $ret;
	}
}

?>
Return current item: phpLedAds