class st4t

{

private $prepared = false ;

private $con ;

private $statement ;

private $query ;

private $bind ;

private $params ;

# Takes a mysqli object, an SQL-Query and an (optional) string specifying the types of data to be send (see mysqli_stmt::bind_param)

function __construct ( & $con , $query , $bind = NULL )

{

$this -> query = $query ;

$this -> bind = $bind ;

$this -> con = & $con ;

}

# Prepares and executes query with the values supplied to the function (read out by func_get_args() to allow for dynamic number of arguments)

public function execute ( )

{

# Prepare Statement if needed

if ( ! $this -> prepared )

{

if ( ! ( $this -> statement = $this -> con -> prepare ( $this -> query ) ) )

{

throw new Exception ( 'Failed to prepare query: ' . $this -> con -> error ) ;

}

# Bind values if needed

if ( isset ( $this -> bind ) )

{

# create $temp_binds array to pass to bind_param later on

$temp_binds = array ( ) ;

$temp_binds [ 0 ] = $this -> bind ;

# Assign the parameters by reference to the $this->params array, so we can change them easily later on.

for ( $i = 0 ; $i < strlen ( $this -> bind ) ; $i ++ )

{

$temp_binds [ ] =& $this -> params [ $i ] ;

}

# Allow variable amounts of parameters

call_user_func_array ( array ( $this -> statement , 'bind_param' ) , $temp_binds ) ;

}

$this -> prepared = true ;

}

# Set values

if ( isset ( $this -> bind ) )

{

# Check if the correct amount of arguments are supplied to the function

if ( strlen ( $this -> bind ) == func_num_args ( ) )

{

# Assign the arguments to the $this->params array so they get sent later

foreach ( func_get_args ( ) as $key => $param )

{

$this -> params [ $key ] = $param ;

}

}

else

{

throw new Exception ( 'Failed to bind as number of params is not enough.' ) ;

}

}

# Actually execute the function and fetch/return results or true if nothing is to be fetched

if ( ! $this -> statement -> execute ( ) )

{

throw new Exception ( 'Failed to execute query: ' . $this -> statement -> error ) ;

}

else

{

$result = array ( ) ;

$variables = array ( ) ;

$data = array ( ) ;

# Fetch metadata to format our output properly

$this -> statement -> store_result ( ) ;

$meta = $this -> statement -> result_metadata ( ) ;

# Do we have returned data?

if ( $meta )

{

# Bind result to $variables so we can read it out step by step

while ( $field = $meta -> fetch_field ( ) )

{

$variables [ ] = & $data [ $field -> name ] ;

}

call_user_func_array ( array ( $this -> statement , 'bind_result' ) , $variables ) ;

$i = 0 ;

# Fetch statements and construct a new associative array for each in the form of [column-name=>column-value]

while ( $this -> statement -> fetch ( ) )

{

$result [ $i ] = array ( ) ;

foreach ( $data as $k => $v )

{

$result [ $i ] [ $k ] = $v ;

}

$i ++;

}

# Return array of all entries

return $result ;

}

else

{

return true ;

}

}

}