sql_exec( $bindings, "SELECT ".implode(", ", self::pluck($columns, 'db'))." FROM $table $where $order $limit" ); // Data set length after filtering $resFilterLength = $jakdb->sql_exec( $bindings, "SELECT COUNT({$primaryKey}) FROM $table $where" ); $recordsFiltered = $resFilterLength[0][0]; // Total data set length $resTotalLength = $jakdb->sql_exec( "SELECT COUNT({$primaryKey}) FROM $table" ); $recordsTotal = $resTotalLength[0][0]; /* * Output */ return array( "draw" => isset ( $request['draw'] ) ? intval( $request['draw'] ) : 0, "recordsTotal" => intval( $recordsTotal ), "recordsFiltered" => intval( $recordsFiltered ), "data" => self::data_output( $columns, $data ) ); } /* Run the query, quite heavy with joins */ static function join ( $request, $table, $table2, $table3, $primaryKey, $columns, $whereResult=null, $whereAll=null ) { $bindings = array(); $whereAllSql = ''; global $jakdb; // Build the SQL query string from the request $limit = self::limit( $request, $columns ); $order = self::order( $request, $columns ); $where = self::filter( $request, $columns, $bindings ); $whereResult = self::_flatten( $whereResult ); $whereAll = self::_flatten( $whereAll ); if ( $whereResult ) { $where = $where ? $where .' AND '.$whereResult : 'WHERE '.$whereResult; } if ( $whereAll ) { $where = $where ? $where .' AND '.$whereAll : 'WHERE '.$whereAll; $whereAllSql = 'WHERE '.$whereAll; } // Main query to actually get the data $data = $jakdb->sql_exec( $bindings, "SELECT ".implode(", ", self::pluck($columns, 'db'))." FROM $table$table2$table3 $where $order $limit" ); // Data set length after filtering $resFilterLength = $jakdb->sql_exec( $bindings, "SELECT COUNT({$primaryKey}) FROM $table$table2$table3 $where" ); $recordsFiltered = $resFilterLength[0][0]; // Total data set length $resTotalLength = $jakdb->sql_exec( "SELECT COUNT({$primaryKey}) FROM $table$table2$table3". $whereAllSql ); $recordsTotal = $resTotalLength[0][0]; /* * Output */ return array( "draw" => isset ( $request['draw'] ) ? intval( $request['draw'] ) : 0, "recordsTotal" => intval( $recordsTotal ), "recordsFiltered" => intval( $recordsFiltered ), "data" => self::data_output_join( $columns, $data ) ); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Internal methods */ /** * Create a PDO binding key which can be used for escaping variables safely * when executing a query with sql_exec() * * @param array &$a Array of bindings * @param * $val Value to bind * @param int $type PDO field type * @return string Bound key to be used in the SQL where this parameter * would be used. */ static function bind ( &$a, $val, $type ) { $key = ':binding_'.count( $a ); $a[] = array( 'key' => $key, 'val' => $val, 'type' => $type ); return $key; } /** * Pull a particular property from each assoc. array in a numeric array, * returning and array of the property values from each item. * * @param array $a Array to get data from * @param string $prop Property to read * @return array Array of property values */ static function pluck ( $a, $prop ) { $out = array(); for ( $i=0, $len=count($a) ; $i<$len ; $i++ ) { $out[] = $a[$i][$prop]; } return $out; } /** * Return a string from an array or a string * * @param array|string $a Array to join * @param string $join Glue for the concatenation * @return string Joined string */ static function _flatten ( $a, $join = ' AND ' ) { if ( ! $a ) { return ''; } else if ( $a && is_array($a) ) { return implode( $join, $a ); } return $a; } } ?>