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;
|
|
}
|
|
}
|
|
|
|
?>
|