source: trunk/include/functions_rate.inc.php @ 19703

Last change on this file since 19703 was 19703, checked in by plg, 11 years ago

update Piwigo headers to 2013 (the end of the world didn't occur as expected on r12922)

  • Property svn:eol-style set to LF
File size: 5.8 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2013 Piwigo Team                  http://piwigo.org |
6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
8// +-----------------------------------------------------------------------+
9// | This program is free software; you can redistribute it and/or modify  |
10// | it under the terms of the GNU General Public License as published by  |
11// | the Free Software Foundation                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
23
24/**
25 * rate a picture by a user
26 *
27 * @param int image identifier
28 * @param int rate
29 * @return void
30 */
31function rate_picture($image_id, $rate)
32{
33  global $conf, $user;
34
35  if (!isset($rate)
36      or !$conf['rate']
37      or !in_array($rate, $conf['rate_items']))
38  {
39    return false;
40  }
41
42  $user_anonymous = is_autorize_status(ACCESS_CLASSIC) ? false : true;
43
44  if ($user_anonymous and !$conf['rate_anonymous'])
45  {
46    return false;
47  }
48
49  $ip_components = explode('.', $_SERVER["REMOTE_ADDR"]);
50  if (count($ip_components) > 3)
51  {
52    array_pop($ip_components);
53  }
54  $anonymous_id = implode ('.', $ip_components);
55
56  if ($user_anonymous)
57  {
58    $save_anonymous_id = pwg_get_cookie_var('anonymous_rater', $anonymous_id);
59
60    if ($anonymous_id != $save_anonymous_id)
61    { // client has changed his IP adress or he's trying to fool us
62      $query = '
63SELECT element_id
64  FROM '.RATE_TABLE.'
65  WHERE user_id = '.$user['id'].'
66    AND anonymous_id = \''.$anonymous_id.'\'
67;';
68      $already_there = array_from_query($query, 'element_id');
69
70      if (count($already_there) > 0)
71      {
72        $query = '
73DELETE
74  FROM '.RATE_TABLE.'
75  WHERE user_id = '.$user['id'].'
76    AND anonymous_id = \''.$save_anonymous_id.'\'
77    AND element_id IN ('.implode(',', $already_there).')
78;';
79         pwg_query($query);
80       }
81
82       $query = '
83UPDATE '.RATE_TABLE.'
84  SET anonymous_id = \'' .$anonymous_id.'\'
85  WHERE user_id = '.$user['id'].'
86    AND anonymous_id = \'' . $save_anonymous_id.'\'
87;';
88       pwg_query($query);
89    } // end client changed ip
90
91    pwg_set_cookie_var('anonymous_rater', $anonymous_id);
92  } // end anonymous user
93
94  $query = '
95DELETE
96  FROM '.RATE_TABLE.'
97  WHERE element_id = '.$image_id.'
98    AND user_id = '.$user['id'].'
99';
100  if ($user_anonymous)
101  {
102    $query.= ' AND anonymous_id = \''.$anonymous_id.'\'';
103  }
104  pwg_query($query);
105  $query = '
106INSERT
107  INTO '.RATE_TABLE.'
108  (user_id,anonymous_id,element_id,rate,date)
109  VALUES
110  ('
111    .$user['id'].','
112    .'\''.$anonymous_id.'\','
113    .$image_id.','
114    .$rate
115    .',NOW())
116;';
117  pwg_query($query);
118
119  return update_rating_score($image_id);
120}
121
122
123/* update images.rating_score field
124  * we use a bayesian average (http://en.wikipedia.org/wiki/Bayesian_average) with
125C = average number of rates per item
126m = global average rate (all rates)
127
128 * param int $element_id optional, otherwise applies to all
129 * @return array(rating_score, count) if element_id is specified
130*/
131function update_rating_score($element_id = false)
132{
133  $query = '
134SELECT element_id,
135    COUNT(rate) AS rcount,
136    SUM(rate) AS rsum
137  FROM '.RATE_TABLE.'
138  GROUP by element_id';
139
140  $all_rates_count = 0;
141  $all_rates_avg = 0;
142  $item_ratecount_avg = 0;
143  $by_item = array();
144
145  $result = pwg_query($query);
146  while ($row = pwg_db_fetch_assoc($result))
147  {
148    $all_rates_count += $row['rcount'];
149    $all_rates_avg += $row['rsum'];
150    $by_item[$row['element_id']] = $row;
151  }
152
153  if ($all_rates_count>0)
154  {
155    $all_rates_avg /= $all_rates_count;
156    $item_ratecount_avg = $all_rates_count / count($by_item);
157  }
158
159  $updates = array();
160  foreach ($by_item as $id => $rate_summary )
161  {
162    $score = ( $item_ratecount_avg * $all_rates_avg + $rate_summary['rsum'] ) / ($item_ratecount_avg + $rate_summary['rcount']);
163    $score = round($score,2);
164    if ($id==$element_id)
165    {
166      $return = array(
167        'score' => $score,
168        'average' => round($rate_summary['rsum'] / $rate_summary['rcount'], 2),
169        'count' => $rate_summary['rcount'],
170        );
171    }
172    $updates[] = array( 'id'=>$id, 'rating_score'=>$score );
173  }
174  mass_updates(
175    IMAGES_TABLE,
176    array(
177      'primary' => array('id'),
178      'update' => array('rating_score')
179      ),
180    $updates
181    );
182
183  //set to null all items with no rate
184  if ( !isset($by_item[$element_id]) )
185  {
186    $query='
187SELECT id FROM '.IMAGES_TABLE .'
188  LEFT JOIN '.RATE_TABLE.' ON id=element_id
189  WHERE element_id IS NULL AND rating_score IS NOT NULL';
190
191    $to_update = array_from_query( $query, 'id');
192
193    if ( !empty($to_update) )
194    {
195      $query='
196UPDATE '.IMAGES_TABLE .'
197  SET rating_score=NULL
198  WHERE id IN (' . implode(',',$to_update) . ')';
199    pwg_query($query);
200    }
201  }
202
203  return isset($return) ? $return : array('score'=>null, 'average'=>null, 'count'=>0 );
204}
205
206?>
Note: See TracBrowser for help on using the repository browser.