368 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			368 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
| <?php
 | |
| /**
 | |
|  * PHP Server Monitor
 | |
|  * Monitor your servers and websites.
 | |
|  *
 | |
|  * This file is part of PHP Server Monitor.
 | |
|  * PHP Server Monitor is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * PHP Server Monitor is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with PHP Server Monitor.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  * @package     phpservermon
 | |
|  * @author      Pepijn Over <pep@neanderthal-technology.com>
 | |
|  * @copyright   Copyright (c) 2008-2014 Pepijn Over <pep@neanderthal-technology.com>
 | |
|  * @license     http://www.gnu.org/licenses/gpl.txt GNU GPL v3
 | |
|  * @version     Release: @package_version@
 | |
|  * @link        http://phpservermon.neanderthal-technology.com/
 | |
|  **/
 | |
| 
 | |
| class smDatabase {
 | |
| 
 | |
| 	protected $debug = array();
 | |
| 	protected $last_inserted_id;
 | |
| 	protected $link;
 | |
| 	protected $num_rows_found;
 | |
| 	protected $num_rows_returned;
 | |
| 
 | |
| 	function __construct() {
 | |
| 		// Initizale connection
 | |
| 		$this->link = mysql_connect(SM_DB_HOST, SM_DB_USER, SM_DB_PASS);
 | |
| 
 | |
| 		if (!mysql_select_db(SM_DB_NAME, $this->link)) {
 | |
| 			trigger_error(mysql_errno() . ": " . mysql_error());
 | |
| 		}
 | |
| 
 | |
| 		// Setting the utf collection
 | |
| 		mysql_query("SET NAMES utf8;", $this->getLink());
 | |
|   		mysql_query("SET CHARACTER SET 'utf8';", $this->getLink());
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Executes a query
 | |
| 	 *
 | |
| 	 * @param $sql string MySQL query
 | |
| 	 * @return resource mysql resource
 | |
| 	 */
 | |
| 
 | |
| 	public function executeQuery($sql) {
 | |
| 
 | |
| 		$result = mysql_query($sql, $this->getLink());
 | |
| 
 | |
| 		if (mysql_error($this->getLink())) {
 | |
| 			trigger_error(mysql_errno($this->getLink()) . ': ' . mysql_error($this->getLink()));
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		if (is_resource($result) && mysql_num_rows($result) > 0) {
 | |
| 			// Rows returned
 | |
| 			$this->num_rows_returned = mysql_num_rows($result);
 | |
| 
 | |
| 			// Rows found
 | |
| 			$result_num_rows_found = $this->fetchResults(mysql_query('SELECT FOUND_ROWS();'));
 | |
| 			$this->num_rows_found = $result_num_rows_found[0]['FOUND_ROWS()'];
 | |
| 		}
 | |
| 
 | |
| 		if (substr(strtolower(trim($sql)), 0, 6) == 'insert') {
 | |
| 			// we have an insert
 | |
| 			$this->last_inserted_id = mysql_insert_id($this->getLink());
 | |
| 			$result = $this->last_inserted_id;
 | |
| 		}
 | |
| 
 | |
| 		return $result;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Exectues query and fetches result
 | |
| 	 *
 | |
| 	 * @param $query string MySQL query
 | |
| 	 * @return $result array
 | |
| 	 */
 | |
| 	public function query($query) {
 | |
| 
 | |
| 		// Execute query and process results
 | |
| 		$result_resource = $this->executeQuery($query);
 | |
| 		$result = $this->fetchResults($result_resource);
 | |
| 
 | |
| 		return $result;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Fetch results from a query
 | |
| 	 *
 | |
| 	 * @param resource $result result from a mysql query
 | |
| 	 * @return array $array with results (multi-dimimensial) for more than one rows
 | |
| 	 */
 | |
| 
 | |
| 	public function fetchResults($result_query){
 | |
| 
 | |
| 		if (!is_resource($result_query)) {
 | |
| 			return array();
 | |
| 		}
 | |
| 
 | |
| 		$num_rows = mysql_num_rows($result_query);
 | |
| 
 | |
| 		$result = array();
 | |
| 		while($record = mysql_fetch_assoc($result_query)) {
 | |
| 			$result[] = $record;
 | |
| 		}
 | |
| 
 | |
| 		return $result;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Performs a select on the given table and returns an multi dimensional associative array with results
 | |
| 	 *
 | |
| 	 * @param string $table tablename
 | |
| 	 * @param mixed $where string or array with where data
 | |
| 	 * @param array $fields array with fields to be retrieved. if empty all fields will be retrieved
 | |
| 	 * @param string $limit limit. for example: 0,30
 | |
| 	 * @param array $orderby fields for the orderby clause
 | |
| 	 * @param string $direction ASC or DESC. Defaults to ASC
 | |
| 	 * @return array multi dimensional array with results
 | |
| 	 */
 | |
| 
 | |
| 	public function select($table, $where = null, $fields = null, $limit = '', $orderby = null, $direction = 'ASC'){
 | |
| 		// build query
 | |
| 		$query_parts = array();
 | |
| 		$query_parts[] = 'SELECT SQL_CALC_FOUND_ROWS';
 | |
| 
 | |
| 		// Fields
 | |
| 		if ($fields !== null && !empty($fields)) {
 | |
| 			$query_parts[] = "`".implode('`,`', $fields)."`";
 | |
| 		} else {
 | |
| 			$query_parts[] = ' * ';
 | |
| 		}
 | |
| 
 | |
| 		// From
 | |
| 		$query_parts[] = "FROM `{$table}`";
 | |
| 
 | |
| 		// Where clause
 | |
| 		$query_parts[] = $this->buildWhereClause($table, $where);
 | |
| 
 | |
| 		// Order by
 | |
| 		if ($orderby !== null && !empty($orderby)) {
 | |
| 			$orderby_clause = 'ORDER BY ';
 | |
| 
 | |
| 			foreach($orderby as $field) {
 | |
| 				$orderby_clause .= "`{$field}`, ";
 | |
| 			}
 | |
| 			$query_parts[] = substr($orderby_clause, 0, -2) . ' ' . $direction;
 | |
| 		}
 | |
| 
 | |
| 		// Limit
 | |
| 		if ($limit != '') {
 | |
| 			$query_parts[] = 'LIMIT ' . $limit;
 | |
| 		}
 | |
| 
 | |
| 		$query = implode(' ', $query_parts);
 | |
| 
 | |
| 		// Get results
 | |
| 		$result = $this->query($query);
 | |
| 
 | |
| 		return $result;
 | |
| 	}
 | |
| 
 | |
| 	public function selectRow($table, $where = null, $fields = null, $limit = '', $orderby = null, $direction = 'ASC') {
 | |
| 		$result = $this->select($table, $where, $fields, $limit, $orderby, $direction);
 | |
| 
 | |
| 		if ($this->getNumRowsReturned() == '1') {
 | |
| 			$result = $result[0];
 | |
| 		}
 | |
| 		return $result;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Remove a record from database
 | |
| 	 *
 | |
| 	 * @param string $table tablename
 | |
| 	 * @param mixed $where Where clause array or primary Id (string) or where clause (string)
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	public function delete($table, $where = null){
 | |
| 
 | |
| 		if ($table != '') {
 | |
| 
 | |
| 			$sql = 'DELETE FROM `'.$table.'` ' . $this->buildWhereClause($table, $where);
 | |
| 
 | |
| 			$this->query($sql);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Insert or update data to the database
 | |
| 	 *
 | |
| 	 * @param array $table table name
 | |
| 	 * @param array $data data to save or insert
 | |
| 	 * @param mixed $where either string ('user_id=2' or just '2' (works only with primary field)) or array with where clause (only when updating)
 | |
| 	 */
 | |
| 	public function save($table, $data, $where = null) {
 | |
| 
 | |
| 		if ($where === null) {
 | |
| 			// insert mode
 | |
| 			$query = "INSERT INTO ";
 | |
| 		} else {
 | |
| 			$query = "UPDATE ";
 | |
| 		}
 | |
| 
 | |
| 		$query .= "`{$table}` SET ";
 | |
| 
 | |
| 		foreach($data as $field => $value) {
 | |
| 			$value = $this->escapeValue($value);
 | |
| 			$query .= "`{$table}`.`{$field}`='{$value}', ";
 | |
| 		}
 | |
| 
 | |
| 		$query = substr($query, 0, -2) . ' ' . $this->buildWhereClause($table, $where);
 | |
| 
 | |
| 		return $this->query($query);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Build WHERE clause for query
 | |
| 	 *
 | |
| 	 * @param string $table table name
 | |
| 	 * @param mixed $where can be primary id (eg '2'), can be string (eg 'name=pepe') or can be array
 | |
| 	 * @return string sql where clause
 | |
| 	 */
 | |
| 	public function buildWhereClause($table, $where = null) {
 | |
| 
 | |
| 		$query = '';
 | |
| 
 | |
|                 if ($where !== null) {
 | |
|                         if (is_array($where)) {
 | |
|                                 $query .= " WHERE ";
 | |
| 
 | |
|                                 foreach($where as $field => $value) {
 | |
|                                 	$value = $this->escapeValue($value);
 | |
| 									$query .= "`{$table}`.`{$field}`='{$value}' AND ";
 | |
|                                 }
 | |
|                                 $query = substr($query, 0, -5);
 | |
|                         } else {
 | |
|                             if (strpos($where, '=') === false) {
 | |
|                             	// no field given, use primary field
 | |
|                                 $structure = $this->getTableStructure($table);
 | |
|                                 $where = $this->escapeValue($where);
 | |
|                                 $query .= " WHERE `{$table}`.`{$structure['primary']}`='{$where}'";
 | |
|                             } elseif (strpos(strtolower(trim($where)), 'where') === false) {
 | |
|                             	$query .= " WHERE {$where}";
 | |
|                             } else {
 | |
|                             	$query .= ' '.$where;
 | |
|                             }
 | |
|                         }
 | |
|                 }
 | |
| 		return $query;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get table structure and primary key
 | |
| 	 *
 | |
| 	 * @param string $table table name
 | |
| 	 * @return array primary key and database structure
 | |
| 	 */
 | |
| 	public function getTableStructure($table) {
 | |
| 		if ($table == '') return false;
 | |
| 
 | |
| 		$structure = $this->query("DESCRIBE `{$table}`");
 | |
| 
 | |
| 		if (empty($structure)) return false;
 | |
| 
 | |
| 		// use arrray search function to get primary key
 | |
| 		$search_needle = array(
 | |
| 		        'key' => 'Key',
 | |
| 		        'value' => 'PRI'
 | |
| 		);
 | |
| 		$primary = pep_array_search_key_value(
 | |
| 		        $structure,
 | |
| 		        array(
 | |
| 		                'key' => 'Key',
 | |
| 		                'value' => 'PRI'
 | |
| 		        )
 | |
| 		);
 | |
| 
 | |
| 		$primary_field = $structure[$primary[0]['path'][0]]['Field'];
 | |
| 		return array(
 | |
| 		        'primary' => $primary_field,
 | |
| 		        'fields' => $structure
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get information about a field from the database
 | |
| 	 *
 | |
| 	 * @param string $table
 | |
| 	 * @param string $field
 | |
| 	 * @return array mysql field information
 | |
| 	 */
 | |
| 	public function getFieldInfo($table, $field) {
 | |
| 		if ($table == '' || $field == '') return array();
 | |
| 
 | |
| 		$db_structure = $this->getTableStructure($table);
 | |
| 
 | |
| 		$field_info = pep_array_search_key_value(
 | |
| 			$db_structure,
 | |
| 			array(
 | |
| 				'key' => 'Field',
 | |
| 				'value' => $field
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		if (empty($field_info)) {
 | |
| 			return array();
 | |
| 		}
 | |
| 
 | |
| 		// return field info
 | |
| 		return $field_info[0]['result'];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Formats the value for the SQL query to secure against injections
 | |
| 	 *
 | |
| 	 * @param string $value
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function escapeValue($value) {
 | |
| 		if(get_magic_quotes_gpc()) {
 | |
| 			$value = stripslashes($value);
 | |
| 		}
 | |
| 		$value = mysql_real_escape_string($value, $this->link);
 | |
| 
 | |
| 		return $value;
 | |
| 	}
 | |
| 
 | |
|     /**
 | |
|      * Get number of rows found
 | |
|      *
 | |
|      * @return int number of rows found
 | |
|      */
 | |
|     public function getNumRowsFound() {
 | |
|             return $this->num_rows_found;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get number of rows returned
 | |
|      *
 | |
|      * @return int number of rows returned
 | |
|      */
 | |
|     public function getNumRowsReturned() {
 | |
|             return $this->num_rows_returned;
 | |
|     }
 | |
| 
 | |
| 	/**
 | |
| 	* Get the database connection identifier
 | |
| 	*
 | |
| 	* @return object db connection
 | |
| 	*/
 | |
| 	public function getLink() {
 | |
| 		return $this->link;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| ?>
 |