<?php
function flc_array_walk_and( &$value, $key ){
	$value = "$key = '" . esc_sql( $value ) . "' ";
}
function flc_array_walk_like( &$value, $key ){
	$value = "$key LIKE '%" . esc_sql( $value ) . "%' ";
}
class FLCDb{
	private $wpdb;

	public function __construct( ){
		global $wpdb;
		$this->wpdb = $wpdb;
	}
	public function insert(
		$table_name,
		$data = array() 
	){
		if( count( $data ) ){
			$this->wpdb->insert( $table_name, $data );
			return $this->wpdb->insert_id;
		} else {
			return FALSE;
		}
	}
	public function update( 
		$table_name,
		$data = array(),
		$update = array() 
	){
		$this->wpdb->show_errors();
		if( count( $data ) && count($update) ){	
			array_walk( $data, 'flc_array_walk_and' );
			array_walk( $update, 'flc_array_walk_and' );		
			$query = "UPDATE $table_name SET " . 
				implode( ", ", array_values( $data ) ) .
				" WHERE ". implode( " AND ", array_values( $update ) );
			return $this->wpdb->query( $query );
		} else {
			return FALSE;
		}
	}
	public function delete(
		$table_name,
		$data = array() 
	){
		$this->wpdb->show_errors();
		$sql_delete = " DELETE FROM $table_name";
		if( count( $data ) ){
			array_walk( $data, 'flc_array_walk_and' );
			$sql_delete .= " WHERE " . implode( " AND ", array_values( $data ) );
		}
		return $this->wpdb->query($sql_delete);
	}
	public function get_all( $table ){
		$this->wpdb->show_errors();
		$sql = "SELECT * FROM $table";
		return $this->wpdb->get_results($sql, ARRAY_A);
	}
	public function get(
		$table_name,
		$data = array(),
		$limit = 10,
		$page = 1,
		$orderby = "id",
		$order = "DESC",
		$values = array(),
		$extra = "" 
	){
		$temp = array();
		$this->wpdb->show_errors();
		$values = count( $values ) ? implode( ", ", array_values( $values ) ) : "*";
		$query = "SELECT $values FROM $table_name";
		if( count( $data ) ){
			array_walk( $data, 'flc_array_walk_and' );
			$query .= " WHERE " . implode( " AND ", array_values( $data ) );
		}
		$page = ( $page - 1 ) * $limit;
		$query .= strlen( $extra ) ? " $extra" : "";
		$query .= " ORDER BY $table_name.$orderby $order";
		$query .= ($limit > 0 ) ? " LIMIT $page, $limit" : "";
		return $this->wpdb->get_results( $query, ARRAY_A);
	}
	public function raw( $query ){
		return $this->wpdb->get_results( $query, ARRAY_A);
	}
	public function search(
		$table_name,
		$data = array(),
		$limit = 10,
		$page = 1,
		$orderby = "id",
		$order = "DESC",
		$values = array()
	){
		$values = count( $values ) ? implode( ", ", array_values( $values ) ) : "*";
		$query = "SELECT $values FROM $table_name";
		if( count( $data ) ){
			array_walk( $data, 'flc_array_walk_like' );
			$query .= " WHERE " . implode( " AND ", array_values( $data ) );
		}
		$page = ( $page - 1 ) * $limit;
		$query .= " ORDER BY $orderby $order";
		$query .= " LIMIT $page, $limit";

		$result = mysql_query( $query, $this->db );

		while( $row = mysql_fetch_array( $result ) ){
			$temp[] = $row;
		}
		return $temp;
	}
}
