You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							392 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							392 lines
						
					
					
						
							11 KiB
						
					
					
				<?php
 | 
						|
/* For licensing terms, see /license.txt */
 | 
						|
 | 
						|
/**
 | 
						|
*	This is the statistic utility functions library for Chamilo.
 | 
						|
*	Include/require it in your code to use its functionality.
 | 
						|
*	@package chamilo.library
 | 
						|
*/
 | 
						|
class StatsUtils
 | 
						|
{
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @desc return one result from a sql query (1 single result)
 | 
						|
	 */
 | 
						|
	public static function getOneResult($sql)
 | 
						|
	{
 | 
						|
		$query = Database::query($sql);
 | 
						|
		if ($query !== false) {
 | 
						|
			$res = @Database::fetch_array($query, 'NUM');
 | 
						|
		} else {
 | 
						|
			$res = array();
 | 
						|
		}
 | 
						|
		return $res[0];
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @desc Return many results of a query in a 1 column tab
 | 
						|
	 */
 | 
						|
	public static function getManyResults1Col($sql)
 | 
						|
	{
 | 
						|
		$res = Database::query($sql);
 | 
						|
		if ($res !== false) {
 | 
						|
			$i = 0;
 | 
						|
			while ($resA = Database::fetch_array($res, 'NUM')) {
 | 
						|
				$resu[$i++] = $resA[0];
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return $resu;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @desc Return many results of a query
 | 
						|
	 */
 | 
						|
	public static function getManyResults2Col($sql)
 | 
						|
	{
 | 
						|
		$res = Database::query($sql);
 | 
						|
		if ($res !== false) {
 | 
						|
			$i = 0;
 | 
						|
			while ($resA = Database::fetch_array($res, 'NUM')) {
 | 
						|
				$resu[$i][0] = $resA[0];
 | 
						|
				$resu[$i][1] = $resA[1];
 | 
						|
				$i++;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return $resu;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @desc Return many results of a query in a 3 column tab
 | 
						|
	 * in $resu[$i][0], $resu[$i][1],$resu[$i][2]
 | 
						|
	 */
 | 
						|
	public static function getManyResults3Col($sql)
 | 
						|
	{
 | 
						|
		$res = Database::query($sql);
 | 
						|
		if ($res !== false) {
 | 
						|
			$i = 0;
 | 
						|
			while ($resA = Database::fetch_array($res, 'NUM')) {
 | 
						|
				$resu[$i][0] = $resA[0];
 | 
						|
				$resu[$i][1] = $resA[1];
 | 
						|
				$resu[$i][2] = $resA[2];
 | 
						|
				$i++;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $resu;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @desc Return many results of a query in a X column tab
 | 
						|
	 * in $resu[$i][0], $resu[$i][1],$resu[$i][2],...
 | 
						|
	 * this function is more 'standard' but use a little
 | 
						|
	 * more ressources
 | 
						|
	 * So I encourage to use the dedicated for 1, 2 or 3
 | 
						|
	 * columns of results
 | 
						|
	 */
 | 
						|
	public static function getManyResultsXCol($sql, $X)
 | 
						|
	{
 | 
						|
		$res = Database::query($sql);
 | 
						|
		if ($res !== false) {
 | 
						|
			$i = 0;
 | 
						|
			while ($resA = Database::fetch_array($res, 'NUM')) {
 | 
						|
				for ($j = 0; $j < $X; $j++) {
 | 
						|
					$resu[$i][$j] = $resA[$j];
 | 
						|
				}
 | 
						|
				$i++;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return $resu;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @return hours_array
 | 
						|
	 * @desc        Return an assoc array.  Keys are the hours, values are
 | 
						|
	 * the number of time this hours was found.
 | 
						|
	 * key 'total' return the sum of all number of time hours
 | 
						|
	 * appear
 | 
						|
	 */
 | 
						|
	public static function hoursTab($sql)
 | 
						|
	{
 | 
						|
		$hours_array = array('total' => 0);
 | 
						|
		$res = Database::query($sql);
 | 
						|
		if ($res !== false) {
 | 
						|
			$last_hours = -1;
 | 
						|
			while ($row = Database::fetch_row($res)) {
 | 
						|
				$date_array = getdate($row[0]);
 | 
						|
				if ($date_array['hours'] == $last_hours) {
 | 
						|
					$hours_array[$date_array['hours']]++;
 | 
						|
				} else {
 | 
						|
					$hours_array[$date_array['hours']] = 1;
 | 
						|
					$last_hours = $date_array['hours'];
 | 
						|
				}
 | 
						|
				$hours_array['total']++;
 | 
						|
			}
 | 
						|
			Database::free_result($res);
 | 
						|
		}
 | 
						|
		return $hours_array;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @return days_array
 | 
						|
	 * @desc        Return an assoc array.  Keys are the days, values are
 | 
						|
	 * the number of time this hours was found.
 | 
						|
	 * key "total" return the sum of all number of time days
 | 
						|
	 * appear
 | 
						|
	 */
 | 
						|
	public static function daysTab($sql)
 | 
						|
	{
 | 
						|
		$MonthsShort = api_get_months_short();
 | 
						|
		$days_array = array('total' => 0);
 | 
						|
		$res = Database::query($sql);
 | 
						|
		if ($res !== false) {
 | 
						|
			$last_day = -1;
 | 
						|
			while ($row = Database::fetch_row($res)) {
 | 
						|
				$date_array = getdate($row[0]);
 | 
						|
				$display_date = $date_array['mday'] . ' ' . $MonthsShort[$date_array['mon'] - 1] . ' ' . $date_array['year'];
 | 
						|
				if ($date_array['mday'] == $last_day) {
 | 
						|
					$days_array[$display_date]++;
 | 
						|
				} else {
 | 
						|
					$days_array[$display_date] = 1;
 | 
						|
					$last_day = $display_date;
 | 
						|
				}
 | 
						|
				$days_array['total']++;
 | 
						|
			}
 | 
						|
			Database::free_result($res);
 | 
						|
		}
 | 
						|
		return $days_array;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param sql : a sql query (as a string)
 | 
						|
	 * @return month_array
 | 
						|
	 * @desc        Return an assoc array.  Keys are the days, values are
 | 
						|
	 * the number of time this hours was found.
 | 
						|
	 * key "total" return the sum of all number of time days
 | 
						|
	 * appear
 | 
						|
	 */
 | 
						|
	public static function monthTab($sql)
 | 
						|
	{
 | 
						|
		$MonthsLong = api_get_months_long();
 | 
						|
		$month_array = array('total' => 0);
 | 
						|
		$res = Database::query($sql);
 | 
						|
		if ($res !== false) {
 | 
						|
			// init tab with all months
 | 
						|
			for ($i = 0; $i < 12; $i++) {
 | 
						|
				$month_array[$MonthsLong[$i]] = 0;
 | 
						|
			}
 | 
						|
			while ($row = Database::fetch_row($res)) {
 | 
						|
				$date_array = getdate($row[0]);
 | 
						|
				$month_array[$MonthsLong[$date_array['mon'] - 1]]++;
 | 
						|
				$month_array['total']++;
 | 
						|
			}
 | 
						|
			Database::free_result($res);
 | 
						|
		}
 | 
						|
		return $month_array;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param period_array : an array provided by hoursTab($sql) or daysTab($sql)
 | 
						|
	 * @param periodTitle : title of the first column, type of period
 | 
						|
	 * @param linkOnPeriod :
 | 
						|
	 * @desc        Display a 4 column array
 | 
						|
	 * Columns are : hour of day, graph, number of hits and %
 | 
						|
	 * First line are titles
 | 
						|
	 * next are informations
 | 
						|
	 * Last is total number of hits
 | 
						|
	 */
 | 
						|
	public static function makeHitsTable($period_array, $periodTitle, $linkOnPeriod = '???')
 | 
						|
	{
 | 
						|
		echo "<table width='100%' cellpadding='0' cellspacing='1' border='0' align=center class='minitext'>";
 | 
						|
		// titles
 | 
						|
		echo "<tr bgcolor='#E6E6E6' align='center'>
 | 
						|
				<td width='15%' >
 | 
						|
					<b>$periodTitle</b>
 | 
						|
				</td>
 | 
						|
				<td width='60%'>
 | 
						|
					 
 | 
						|
				</td>
 | 
						|
				<td width='10%'>
 | 
						|
					<b>" . get_lang('Hits') . "</b>
 | 
						|
				</td>
 | 
						|
				<td width='15%'>
 | 
						|
					<b>%</b>
 | 
						|
				</td>
 | 
						|
			</tr>
 | 
						|
		";
 | 
						|
		$factor = 4;
 | 
						|
		$maxSize = $factor * 100; //pixels
 | 
						|
		while (list($periodPiece, $cpt) = each($period_array)) {
 | 
						|
			if ($periodPiece != 'total') {
 | 
						|
				$pourcent = round(100 * $cpt / $period_array['total']);
 | 
						|
				$barwidth = $factor * $pourcent;
 | 
						|
				echo "<tr>
 | 
						|
					<td align='center' width='15%'>";
 | 
						|
				echo $periodPiece;
 | 
						|
				echo "</td>
 | 
						|
					<td width='60%' style='padding-top: 3px;' align='center'>"
 | 
						|
					// display hitbar
 | 
						|
					. "<img src='../img/bar_1.gif' width='1' height='12' alt='$periodPiece : $cpt hits – $pourcent %' />";
 | 
						|
				if ($pourcent != 0) {
 | 
						|
					echo "<img src='../img/bar_1u.gif' width='$barwidth' height='12' alt='$periodPiece : $cpt hits – $pourcent %' />";
 | 
						|
				}
 | 
						|
				// display 100% bar
 | 
						|
				if ($pourcent != 100 && $pourcent != 0) {
 | 
						|
					echo "<img src='../img/bar_1m.gif' width='1' height='12' alt='$periodPiece : $cpt hits – $pourcent %' />";
 | 
						|
				}
 | 
						|
				if ($pourcent != 100) {
 | 
						|
					echo "<img src='../img/bar_1r.gif' width='" . ($maxSize - $barwidth) . "' height='12' alt='$periodPiece : $cpt hits – $pourcent %' />";
 | 
						|
				}
 | 
						|
				echo "<img src='../img/bar_1.gif' width='1' height='12' alt='$periodPiece : $cpt hits – $pourcent %' />
 | 
						|
					</td>
 | 
						|
					<td align='center' width='10%'>
 | 
						|
						$cpt
 | 
						|
					</td>
 | 
						|
					<td align='center' width='15%'>
 | 
						|
						$pourcent %
 | 
						|
					</td>
 | 
						|
					</tr>
 | 
						|
				";
 | 
						|
			}
 | 
						|
		}
 | 
						|
		echo "<tr bgcolor='#E6E6E6'>
 | 
						|
				<td width='15%' align='center'>
 | 
						|
					" . get_lang('Total') . "
 | 
						|
				</td>
 | 
						|
				<td align='right' width='60%'>
 | 
						|
					 
 | 
						|
				</td>
 | 
						|
				<td align='center' width='10%'>
 | 
						|
					" . $period_array['total'] . "
 | 
						|
				</td>
 | 
						|
				<td width='15%'>
 | 
						|
					 
 | 
						|
				</td>
 | 
						|
			</tr>
 | 
						|
		";
 | 
						|
		echo "</table>";
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param array_of_results : a 2 columns array
 | 
						|
	 * @param title1 : string, title of the first column
 | 
						|
	 * @param title2 : string, title of the ... second column
 | 
						|
	 * @desc        display a 2 column tab from an array
 | 
						|
	 * @deprecated seem not to be use
 | 
						|
	 * titles of columns are title1 and title2
 | 
						|
	 */
 | 
						|
	public static function buildTab2col($array_of_results, $title1, $title2)
 | 
						|
	{
 | 
						|
		echo "<table cellpadding='2' cellspacing='1' border='1' align='center'>\n";
 | 
						|
		echo "<tr>
 | 
						|
				<td bgcolor='#E6E6E6'>
 | 
						|
				$title1
 | 
						|
				</td>
 | 
						|
				<td bgcolor='#E6E6E6'>
 | 
						|
				$title2
 | 
						|
				</td>
 | 
						|
			</tr>\n";
 | 
						|
 | 
						|
		if (is_array($array_of_results)) {
 | 
						|
			for ($j = 0; $j < count($array_of_results); $j++) {
 | 
						|
				echo '<tr>';
 | 
						|
				echo '<td bgcolor="#eeeeee">' . $array_of_results[$j][0] . '</td>';
 | 
						|
				echo '<td align="right">' . $array_of_results[$j][1] . '</td>';
 | 
						|
				echo "</tr>\n";
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			echo '<tr>';
 | 
						|
			echo '<td colspan="2" align="center">' . get_lang(
 | 
						|
					'NoResult'
 | 
						|
				) . '</td>';
 | 
						|
			echo "</tr>\n";
 | 
						|
		}
 | 
						|
		echo "</table>\n";
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param array_of_results : a 2 columns array
 | 
						|
	 * @desc        display a 2 column tab from an array
 | 
						|
	 * this tab has no title
 | 
						|
	 * @deprecated seem not to be use
 | 
						|
	 */
 | 
						|
	public static function buildTab2ColNoTitle($array_of_results)
 | 
						|
	{
 | 
						|
		echo "<table cellpadding='3' cellspacing='1' border='0' align='center'>\n";
 | 
						|
 | 
						|
		if (is_array($array_of_results)) {
 | 
						|
			for ($j = 0; $j < count($array_of_results); $j++) {
 | 
						|
				echo '<tr>';
 | 
						|
				echo '<td bgcolor="#eeeeee">' . $array_of_results[$j][0] . '</td>';
 | 
						|
				echo '<td align="right">  ' . $array_of_results[$j][1] . '</td>';
 | 
						|
				echo "</tr>\n";
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			echo '<tr>';
 | 
						|
			echo '<td colspan="2" align="center">' . get_lang(
 | 
						|
					'NoResult'
 | 
						|
				) . '</td>';
 | 
						|
			echo "</tr>\n";
 | 
						|
		}
 | 
						|
		echo "</table>\n";
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @author Sebastien Piraux <piraux_seb@hotmail.com>
 | 
						|
	 * @param array_of_results : a 2 columns array
 | 
						|
	 * @desc        this function is used to display
 | 
						|
	 * integrity errors in the platform
 | 
						|
	 * if array_of_results is not an array there is
 | 
						|
	 * no error, else errors are displayed
 | 
						|
	 * @deprecated seem not to be use
 | 
						|
	 */
 | 
						|
	public static function buildTabDefcon($array_of_results)
 | 
						|
	{
 | 
						|
		echo "<table width='60%' cellpadding='2' cellspacing='1' border='0' align=center class='minitext'>\n";
 | 
						|
 | 
						|
		if (is_array($array_of_results)) {
 | 
						|
			// there are some strange cases...
 | 
						|
			echo '<tr>';
 | 
						|
			echo '<td colspan="2" align="center" bgcolor="#eeeeee"><font color="#ff0000">' . get_lang(
 | 
						|
					'Defcon'
 | 
						|
				) . '</font></td>';
 | 
						|
			echo "</tr>\n";
 | 
						|
 | 
						|
			for ($j = 0; $j < count($array_of_results); $j++) {
 | 
						|
				if ($array_of_results[$j][0] == "") {
 | 
						|
					$key = get_lang('NULLValue');
 | 
						|
				} else {
 | 
						|
					$key = $array_of_results[$j][0];
 | 
						|
				}
 | 
						|
				echo '<tr>';
 | 
						|
				echo '<td width="70%" class="content">' . $key . '</td>';
 | 
						|
				echo '<td width="30%" align="right">' . $array_of_results[$j][1] . '</td>';
 | 
						|
				echo "</tr>\n";
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			// all right
 | 
						|
			echo '<tr>';
 | 
						|
			echo '<td colspan="2" align="center"><font color="#00ff00">' . get_lang(
 | 
						|
					'AllRight'
 | 
						|
				) . '</font></td>';
 | 
						|
			echo "</tr>\n";
 | 
						|
		}
 | 
						|
		echo "</table>\n";
 | 
						|
	}
 | 
						|
}
 | 
						|
 |