| 
0
 | 
     1 <?php
 | 
| 
 | 
     2 	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 | 
| 
 | 
     3 	 * Easy set variables
 | 
| 
 | 
     4 	 */
 | 
| 
 | 
     5 	
 | 
| 
 | 
     6 	/* Array of database columns which should be read and sent back to DataTables. Use a space where
 | 
| 
 | 
     7 	 * you want to insert a non-database field (for example a counter or static image)
 | 
| 
 | 
     8 	 */
 | 
| 
 | 
     9 	$aColumns = array( 'engine', 'browser', 'platform', 'version', 'grade' );
 | 
| 
 | 
    10 	
 | 
| 
 | 
    11 	/* Indexed column (used for fast and accurate table cardinality) */
 | 
| 
 | 
    12 	$sIndexColumn = "id";
 | 
| 
 | 
    13 	
 | 
| 
 | 
    14 	/* DB table to use */
 | 
| 
 | 
    15 	$sTable = "ajax";
 | 
| 
 | 
    16 	
 | 
| 
 | 
    17 	/* Database connection information */
 | 
| 
 | 
    18 	$gaSql['user']       = "";
 | 
| 
 | 
    19 	$gaSql['password']   = "";
 | 
| 
 | 
    20 	$gaSql['db']         = "";
 | 
| 
 | 
    21 	$gaSql['server']     = "localhost";
 | 
| 
 | 
    22 	
 | 
| 
 | 
    23 	/* REMOVE THIS LINE (it just includes my SQL connection user/pass) */
 | 
| 
 | 
    24 	include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" );
 | 
| 
 | 
    25 	
 | 
| 
 | 
    26 	
 | 
| 
 | 
    27 	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 | 
| 
 | 
    28 	 * If you just want to use the basic configuration for DataTables with PHP server-side, there is
 | 
| 
 | 
    29 	 * no need to edit below this line
 | 
| 
 | 
    30 	 */
 | 
| 
 | 
    31 	
 | 
| 
 | 
    32 	/* 
 | 
| 
 | 
    33 	 * Local functions
 | 
| 
 | 
    34 	 */
 | 
| 
 | 
    35 	function fatal_error ( $sErrorMessage = '' )
 | 
| 
 | 
    36 	{
 | 
| 
 | 
    37 		header( $_SERVER['SERVER_PROTOCOL'] .' 500 Internal Server Error' );
 | 
| 
 | 
    38 		die( $sErrorMessage );
 | 
| 
 | 
    39 	}
 | 
| 
 | 
    40 
 | 
| 
 | 
    41 	
 | 
| 
 | 
    42 	/* 
 | 
| 
 | 
    43 	 * MySQL connection
 | 
| 
 | 
    44 	 */
 | 
| 
 | 
    45 	if ( ! $gaSql['link'] = mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) )
 | 
| 
 | 
    46 	{
 | 
| 
 | 
    47 		fatal_error( 'Could not open connection to server' );
 | 
| 
 | 
    48 	}
 | 
| 
 | 
    49 
 | 
| 
 | 
    50 	if ( ! mysql_select_db( $gaSql['db'], $gaSql['link'] ) )
 | 
| 
 | 
    51 	{
 | 
| 
 | 
    52 		fatal_error( 'Could not select database ' );
 | 
| 
 | 
    53 	}
 | 
| 
 | 
    54 	
 | 
| 
 | 
    55 	
 | 
| 
 | 
    56 	/* 
 | 
| 
 | 
    57 	 * Paging
 | 
| 
 | 
    58 	 */
 | 
| 
 | 
    59 	$sLimit = "";
 | 
| 
 | 
    60 	if ( isset( $_POST['iDisplayStart'] ) && $_POST['iDisplayLength'] != '-1' )
 | 
| 
 | 
    61 	{
 | 
| 
 | 
    62 		$sLimit = "LIMIT ".intval( $_POST['iDisplayStart'] ).", ".
 | 
| 
 | 
    63 			intval( $_POST['iDisplayLength'] );
 | 
| 
 | 
    64 	}
 | 
| 
 | 
    65 	
 | 
| 
 | 
    66 	
 | 
| 
 | 
    67 	/*
 | 
| 
 | 
    68 	 * Ordering
 | 
| 
 | 
    69 	 */
 | 
| 
 | 
    70 	if ( isset( $_POST['iSortCol_0'] ) )
 | 
| 
 | 
    71 	{
 | 
| 
 | 
    72 		$sOrder = "ORDER BY  ";
 | 
| 
 | 
    73 		for ( $i=0 ; $i<intval( $_POST['iSortingCols'] ) ; $i++ )
 | 
| 
 | 
    74 		{
 | 
| 
 | 
    75 			if ( $_POST[ 'bSortable_'.intval($_POST['iSortCol_'.$i]) ] == "true" )
 | 
| 
 | 
    76 			{
 | 
| 
 | 
    77 				$sOrder .= "`".$aColumns[ intval( $_POST['iSortCol_'.$i] ) ]."` ".
 | 
| 
 | 
    78 				 	($_POST['sSortDir_'.$i]==='asc' ? 'asc' : 'desc') .", ";
 | 
| 
 | 
    79 			}
 | 
| 
 | 
    80 		}
 | 
| 
 | 
    81 		
 | 
| 
 | 
    82 		$sOrder = substr_replace( $sOrder, "", -2 );
 | 
| 
 | 
    83 		if ( $sOrder == "ORDER BY" )
 | 
| 
 | 
    84 		{
 | 
| 
 | 
    85 			$sOrder = "";
 | 
| 
 | 
    86 		}
 | 
| 
 | 
    87 	}
 | 
| 
 | 
    88 	
 | 
| 
 | 
    89 	
 | 
| 
 | 
    90 	/* 
 | 
| 
 | 
    91 	 * Filtering
 | 
| 
 | 
    92 	 * NOTE this does not match the built-in DataTables filtering which does it
 | 
| 
 | 
    93 	 * word by word on any field. It's possible to do here, but concerned about efficiency
 | 
| 
 | 
    94 	 * on very large tables, and MySQL's regex functionality is very limited
 | 
| 
 | 
    95 	 */
 | 
| 
 | 
    96 	$sWhere = "";
 | 
| 
 | 
    97 	if ( $_POST['sSearch'] != "" )
 | 
| 
 | 
    98 	{
 | 
| 
 | 
    99 		$sWhere = "WHERE (";
 | 
| 
 | 
   100 		for ( $i=0 ; $i<count($aColumns) ; $i++ )
 | 
| 
 | 
   101 		{
 | 
| 
 | 
   102 			if ( isset($_POST['bSearchable_'.$i]) && $_POST['bSearchable_'.$i] == "true" )
 | 
| 
 | 
   103 			{
 | 
| 
 | 
   104 				$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string( $_POST['sSearch'] )."%' OR ";
 | 
| 
 | 
   105 			}
 | 
| 
 | 
   106 		}
 | 
| 
 | 
   107 		$sWhere = substr_replace( $sWhere, "", -3 );
 | 
| 
 | 
   108 		$sWhere .= ')';
 | 
| 
 | 
   109 	}
 | 
| 
 | 
   110 	
 | 
| 
 | 
   111 	/* Individual column filtering */
 | 
| 
 | 
   112 	for ( $i=0 ; $i<count($aColumns) ; $i++ )
 | 
| 
 | 
   113 	{
 | 
| 
 | 
   114 		if ( $_POST['bSearchable_'.$i] == "true" && $_POST['sSearch_'.$i] != '' )
 | 
| 
 | 
   115 		{
 | 
| 
 | 
   116 			if ( $sWhere == "" )
 | 
| 
 | 
   117 			{
 | 
| 
 | 
   118 				$sWhere = "WHERE ";
 | 
| 
 | 
   119 			}
 | 
| 
 | 
   120 			else
 | 
| 
 | 
   121 			{
 | 
| 
 | 
   122 				$sWhere .= " AND ";
 | 
| 
 | 
   123 			}
 | 
| 
 | 
   124 			$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_POST['sSearch_'.$i])."%' ";
 | 
| 
 | 
   125 		}
 | 
| 
 | 
   126 	}
 | 
| 
 | 
   127 	
 | 
| 
 | 
   128 	
 | 
| 
 | 
   129 	/*
 | 
| 
 | 
   130 	 * SQL queries
 | 
| 
 | 
   131 	 * Get data to display
 | 
| 
 | 
   132 	 */
 | 
| 
 | 
   133 	$sQuery = "
 | 
| 
 | 
   134 		SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
 | 
| 
 | 
   135 		FROM   $sTable
 | 
| 
 | 
   136 		$sWhere
 | 
| 
 | 
   137 		$sOrder
 | 
| 
 | 
   138 		$sLimit
 | 
| 
 | 
   139 	";
 | 
| 
 | 
   140 	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or fatal_error( 'MySQL Error: ' . mysql_errno() );
 | 
| 
 | 
   141 	
 | 
| 
 | 
   142 	/* Data set length after filtering */
 | 
| 
 | 
   143 	$sQuery = "
 | 
| 
 | 
   144 		SELECT FOUND_ROWS()
 | 
| 
 | 
   145 	";
 | 
| 
 | 
   146 	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or fatal_error( 'MySQL Error: ' . mysql_errno() );
 | 
| 
 | 
   147 	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
 | 
| 
 | 
   148 	$iFilteredTotal = $aResultFilterTotal[0];
 | 
| 
 | 
   149 	
 | 
| 
 | 
   150 	/* Total data set length */
 | 
| 
 | 
   151 	$sQuery = "
 | 
| 
 | 
   152 		SELECT COUNT(".$sIndexColumn.")
 | 
| 
 | 
   153 		FROM   $sTable
 | 
| 
 | 
   154 	";
 | 
| 
 | 
   155 	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or fatal_error( 'MySQL Error: ' . mysql_errno() );
 | 
| 
 | 
   156 	$aResultTotal = mysql_fetch_array($rResultTotal);
 | 
| 
 | 
   157 	$iTotal = $aResultTotal[0];
 | 
| 
 | 
   158 	
 | 
| 
 | 
   159 	
 | 
| 
 | 
   160 	/*
 | 
| 
 | 
   161 	 * Output
 | 
| 
 | 
   162 	 */
 | 
| 
 | 
   163 	$sOutput = '{';
 | 
| 
 | 
   164 	$sOutput .= '"sEcho": '.intval($_POST['sEcho']).', ';
 | 
| 
 | 
   165 	$sOutput .= '"iTotalRecords": '.$iTotal.', ';
 | 
| 
 | 
   166 	$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
 | 
| 
 | 
   167 	$sOutput .= '"aaData": [ ';
 | 
| 
 | 
   168 	while ( $aRow = mysql_fetch_array( $rResult ) )
 | 
| 
 | 
   169 	{
 | 
| 
 | 
   170 		$sOutput .= "[";
 | 
| 
 | 
   171 		for ( $i=0 ; $i<count($aColumns) ; $i++ )
 | 
| 
 | 
   172 		{
 | 
| 
 | 
   173 			if ( $aColumns[$i] == "version" )
 | 
| 
 | 
   174 			{
 | 
| 
 | 
   175 				/* Special output formatting for 'version' */
 | 
| 
 | 
   176 				$sOutput .= ($aRow[ $aColumns[$i] ]=="0") ?
 | 
| 
 | 
   177 					'"-",' :
 | 
| 
 | 
   178 					'"'.str_replace('"', '\"', $aRow[ $aColumns[$i] ]).'",';
 | 
| 
 | 
   179 			}
 | 
| 
 | 
   180 			else if ( $aColumns[$i] != ' ' )
 | 
| 
 | 
   181 			{
 | 
| 
 | 
   182 				/* General output */
 | 
| 
 | 
   183 				$sOutput .= '"'.str_replace('"', '\"', $aRow[ $aColumns[$i] ]).'",';
 | 
| 
 | 
   184 			}
 | 
| 
 | 
   185 		}
 | 
| 
 | 
   186 		
 | 
| 
 | 
   187 		/*
 | 
| 
 | 
   188 		 * Optional Configuration:
 | 
| 
 | 
   189 		 * If you need to add any extra columns (add/edit/delete etc) to the table, that aren't in the
 | 
| 
 | 
   190 		 * database - you can do it here
 | 
| 
 | 
   191 		 */
 | 
| 
 | 
   192 		
 | 
| 
 | 
   193 		
 | 
| 
 | 
   194 		$sOutput = substr_replace( $sOutput, "", -1 );
 | 
| 
 | 
   195 		$sOutput .= "],";
 | 
| 
 | 
   196 	}
 | 
| 
 | 
   197 	$sOutput = substr_replace( $sOutput, "", -1 );
 | 
| 
 | 
   198 	$sOutput .= '] }';
 | 
| 
 | 
   199 	
 | 
| 
 | 
   200 	echo $sOutput;
 | 
| 
 | 
   201 ?> |