| 1 |
<?php
|
| 2 |
// $Id: banner_db.php,v 1.24.2.1 2006/09/23 14:39:43 wulff Exp $
|
| 3 |
|
| 4 |
/**
|
| 5 |
* @file
|
| 6 |
* The database cache handler for the banner module.
|
| 7 |
*/
|
| 8 |
|
| 9 |
header("Content-Type: application/x-javascript; charset=utf-8");
|
| 10 |
|
| 11 |
include_once './includes/bootstrap.inc';
|
| 12 |
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
|
| 13 |
|
| 14 |
$group = (int) $_GET['group'];
|
| 15 |
$count = (int) $_GET['count'];
|
| 16 |
$terms = (string) $_GET['terms'];
|
| 17 |
|
| 18 |
// build queries
|
| 19 |
$queries = array();
|
| 20 |
$columns = ', b.nid, b.chance, b.cache, b.views, b.views_max, b.views_day, b.views_day_max, b.views_week, b.views_week_max, n.uid';
|
| 21 |
if ($terms != '0') {
|
| 22 |
// build query to group terms by vocabulary
|
| 23 |
$tids = explode(',', $terms);
|
| 24 |
for ($i = 0; $i < count($tids); $i++) {
|
| 25 |
$like[] = '%d';
|
| 26 |
}
|
| 27 |
$query = 'SELECT DISTINCT(tn.tid), td.vid FROM {term_node} tn INNER JOIN {term_data} td ON tn.tid = td.tid WHERE tn.tid IN ('. implode(',', $like) .')';
|
| 28 |
|
| 29 |
$result = db_query($query, $tids);
|
| 30 |
|
| 31 |
$tidgroup = array();
|
| 32 |
while ($row = db_fetch_array($result)) {
|
| 33 |
$tidgroup[$row['vid']][] = $row['tid'];
|
| 34 |
}
|
| 35 |
|
| 36 |
// build query for AND matching between vocabularies
|
| 37 |
$join = '';
|
| 38 |
$where = array();
|
| 39 |
foreach ($tidgroup as $vid => $tids) {
|
| 40 |
$join .= ' INNER JOIN {term_node} tn'. $vid .' ON b.nid = tn'. $vid .'.nid';
|
| 41 |
$where[] = 'tn'. $vid .'.tid IN ('. implode(',', $tids) .')';
|
| 42 |
}
|
| 43 |
$query = 'SELECT DISTINCT(b.vid)'. $columns .' FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid INNER JOIN {banner} b ON n.vid = b.vid'. $join .' WHERE tn.tid = %d AND b.workflow = 1';
|
| 44 |
|
| 45 |
if ($where) {
|
| 46 |
$query .= ' AND ('. implode(' AND ', $where) .')';
|
| 47 |
}
|
| 48 |
$queries[] = array($query , $group);
|
| 49 |
|
| 50 |
// build query for OR matching between vocabularies
|
| 51 |
$join = '';
|
| 52 |
$where = array();
|
| 53 |
foreach ($tidgroup as $vid => $tids) {
|
| 54 |
$join .= ' INNER JOIN {term_node} tn'. $vid .' ON b.nid = tn'. $vid .'.nid';
|
| 55 |
$where[] = 'tn'. $vid .'.tid IN ('. implode(',', $tids) .')';
|
| 56 |
}
|
| 57 |
$query = 'SELECT DISTINCT(b.vid)'. $columns .' FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid INNER JOIN {banner} b ON n.vid = b.vid'. $join .' WHERE tn.tid = %d AND b.workflow = 1';
|
| 58 |
if ($where) {
|
| 59 |
$query .= ' AND ('. implode(' OR ', $where) .')';
|
| 60 |
}
|
| 61 |
$queries[] = array($query , $group);
|
| 62 |
}
|
| 63 |
$queries[] = array('SELECT b.vid'. $columns .' FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid INNER JOIN {banner} b ON n.vid = b.vid WHERE tn.tid = %d AND b.workflow = 1', $group);
|
| 64 |
|
| 65 |
// run queries, stop after first query which returns one or more rows
|
| 66 |
foreach ($queries as $query) {
|
| 67 |
$result = db_query($query[0], $query[1]);
|
| 68 |
if (db_num_rows($result) > 0) {
|
| 69 |
break;
|
| 70 |
}
|
| 71 |
}
|
| 72 |
|
| 73 |
// build ballot
|
| 74 |
$ballot = array();
|
| 75 |
while ($banner = db_fetch_object($result)) {
|
| 76 |
for ($i = 0; $i < $banner->chance; $i++) {
|
| 77 |
$ballot[] = $banner->nid;
|
| 78 |
}
|
| 79 |
$banners[$banner->nid] = $banner;
|
| 80 |
}
|
| 81 |
|
| 82 |
// get uid of current user
|
| 83 |
$result = db_query("SELECT uid, sid FROM {sessions} WHERE sid = '%s'", $_COOKIE[session_name()]);
|
| 84 |
if (db_num_rows($result)) {
|
| 85 |
$session = db_fetch_array($result);
|
| 86 |
$uid = $session['uid'];
|
| 87 |
}
|
| 88 |
else {
|
| 89 |
$uid = 0;
|
| 90 |
}
|
| 91 |
|
| 92 |
$counter = 0;
|
| 93 |
while ($counter < $count && count($ballot)) {
|
| 94 |
// choose random banner
|
| 95 |
$max = count($ballot) - 1;
|
| 96 |
if ($max > 0) {
|
| 97 |
$random = mt_rand(0, $max);
|
| 98 |
}
|
| 99 |
else {
|
| 100 |
$random = 0;
|
| 101 |
}
|
| 102 |
$nid = $ballot[$random];
|
| 103 |
|
| 104 |
// get banner and remove it from the ballot
|
| 105 |
$banner = $banners[$nid];
|
| 106 |
array_splice($ballot, $random, 1);
|
| 107 |
|
| 108 |
// update view statistics, admin and owner views are not counted
|
| 109 |
if ($uid != 1 && $uid != $banner->uid) {
|
| 110 |
db_query('UPDATE {banner} SET views = views + 1, views_day = views_day + 1, views_week = views_week + 1 WHERE vid = %d', $banner->vid);
|
| 111 |
}
|
| 112 |
|
| 113 |
// change banner status?
|
| 114 |
if ($banner->views_max > 0 && $banner->views >= $banner->views_max) {
|
| 115 |
// limit reached
|
| 116 |
db_query('UPDATE {banner} SET workflow = 5 WHERE vid = %d', $banner->vid);
|
| 117 |
}
|
| 118 |
else if ($banner->views_day_max > 0 && $banner->views_day >= $banner->views_day_max) {
|
| 119 |
// day limit reached
|
| 120 |
db_query('UPDATE {banner} SET workflow = 2 WHERE vid = %d', $banner->vid);
|
| 121 |
}
|
| 122 |
else if ($banner->views_week_max > 0 && $banner->views_week >= $banner->views_week_max) {
|
| 123 |
// week limit reached
|
| 124 |
db_query('UPDATE {banner} SET workflow = 3 WHERE vid = %d', $banner->vid);
|
| 125 |
}
|
| 126 |
|
| 127 |
print $banner->cache;
|
| 128 |
|
| 129 |
$counter++;
|
| 130 |
}
|