Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
13 changed files
with
1,686 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,312 @@ | ||
<?php | ||
/** | ||
* DB - A simple database class | ||
* | ||
* @author Author: Vivek Wicky Aswal. (https://twitter.com/#!/VivekWickyAswal) | ||
* @git https://github.com/wickyaswal/PHP-MySQL-PDO-Database-Class | ||
* @version 0.2ab | ||
* | ||
*/ | ||
require("Log.class.php"); | ||
class DB | ||
{ | ||
# @object, The PDO object | ||
private $pdo; | ||
|
||
# @object, PDO statement object | ||
private $sQuery; | ||
|
||
# @array, The database settings | ||
private $settings; | ||
|
||
# @bool , Connected to the database | ||
private $bConnected = false; | ||
|
||
# @object, Object for logging exceptions | ||
private $log; | ||
|
||
# @array, The parameters of the SQL query | ||
private $parameters; | ||
|
||
/** | ||
* Default Constructor | ||
* | ||
* 1. Instantiate Log class. | ||
* 2. Connect to database. | ||
* 3. Creates the parameter array. | ||
*/ | ||
public function __construct() | ||
{ | ||
$this->log = new Log(); | ||
$this->Connect(); | ||
$this->parameters = array(); | ||
} | ||
|
||
/** | ||
* This method makes connection to the database. | ||
* | ||
* 1. Reads the database settings from a ini file. | ||
* 2. Puts the ini content into the settings array. | ||
* 3. Tries to connect to the database. | ||
* 4. If connection failed, exception is displayed and a log file gets created. | ||
*/ | ||
private function Connect() | ||
{ | ||
$this->settings = parse_ini_file("settings.ini.php"); | ||
$dsn = 'mysql:dbname=' . $this->settings["dbname"] . ';host=' . $this->settings["host"] . ''; | ||
try { | ||
# Read settings from INI file, set UTF8 | ||
$this->pdo = new PDO($dsn, $this->settings["user"], $this->settings["password"], array( | ||
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" | ||
)); | ||
|
||
# We can now log any exceptions on Fatal error. | ||
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | ||
|
||
# Disable emulation of prepared statements, use REAL prepared statements instead. | ||
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); | ||
|
||
# Connection succeeded, set the boolean to true. | ||
$this->bConnected = true; | ||
} | ||
catch (PDOException $e) { | ||
# Write into log | ||
echo $this->ExceptionLog($e->getMessage()); | ||
die(); | ||
} | ||
} | ||
/* | ||
* You can use this little method if you want to close the PDO connection | ||
* | ||
*/ | ||
public function CloseConnection() | ||
{ | ||
# Set the PDO object to null to close the connection | ||
# http://www.php.net/manual/en/pdo.connections.php | ||
$this->pdo = null; | ||
} | ||
|
||
/** | ||
* Every method which needs to execute a SQL query uses this method. | ||
* | ||
* 1. If not connected, connect to the database. | ||
* 2. Prepare Query. | ||
* 3. Parameterize Query. | ||
* 4. Execute Query. | ||
* 5. On exception : Write Exception into the log + SQL query. | ||
* 6. Reset the Parameters. | ||
*/ | ||
private function Init($query, $parameters = "") | ||
{ | ||
# Connect to database | ||
if (!$this->bConnected) { | ||
$this->Connect(); | ||
} | ||
try { | ||
# Prepare query | ||
$this->sQuery = $this->pdo->prepare($query); | ||
|
||
# Add parameters to the parameter array | ||
$this->bindMore($parameters); | ||
|
||
# Bind parameters | ||
if (!empty($this->parameters)) { | ||
foreach ($this->parameters as $param => $value) { | ||
if(is_int($value[1])) { | ||
$type = PDO::PARAM_INT; | ||
} else if(is_bool($value[1])) { | ||
$type = PDO::PARAM_BOOL; | ||
} else if(is_null($value[1])) { | ||
$type = PDO::PARAM_NULL; | ||
} else { | ||
$type = PDO::PARAM_STR; | ||
} | ||
// Add type when binding the values to the column | ||
$this->sQuery->bindValue($value[0], $value[1], $type); | ||
} | ||
} | ||
|
||
# Execute SQL | ||
$this->sQuery->execute(); | ||
} | ||
catch (PDOException $e) { | ||
# Write into log and display Exception | ||
echo $this->ExceptionLog($e->getMessage(), $query); | ||
die(); | ||
} | ||
|
||
# Reset the parameters | ||
$this->parameters = array(); | ||
} | ||
|
||
/** | ||
* @void | ||
* | ||
* Add the parameter to the parameter array | ||
* @param string $para | ||
* @param string $value | ||
*/ | ||
public function bind($para, $value) | ||
{ | ||
$this->parameters[sizeof($this->parameters)] = [":" . $para , $value]; | ||
} | ||
/** | ||
* @void | ||
* | ||
* Add more parameters to the parameter array | ||
* @param array $parray | ||
*/ | ||
public function bindMore($parray) | ||
{ | ||
if (empty($this->parameters) && is_array($parray)) { | ||
$columns = array_keys($parray); | ||
foreach ($columns as $i => &$column) { | ||
$this->bind($column, $parray[$column]); | ||
} | ||
} | ||
} | ||
/** | ||
* If the SQL query contains a SELECT or SHOW statement it returns an array containing all of the result set row | ||
* If the SQL statement is a DELETE, INSERT, or UPDATE statement it returns the number of affected rows | ||
* | ||
* @param string $query | ||
* @param array $params | ||
* @param int $fetchmode | ||
* @return mixed | ||
*/ | ||
public function query($query, $params = null, $fetch = true, $fetchmode = PDO::FETCH_ASSOC) | ||
{ | ||
$query = trim(str_replace("\r", " ", $query)); | ||
|
||
$this->Init($query, $params); | ||
|
||
$rawStatement = explode(" ", preg_replace("/\s+|\t+|\n+/", " ", $query)); | ||
|
||
# Which SQL statement is used | ||
$statement = strtolower($rawStatement[0]); | ||
|
||
if ($statement === 'select' || $statement === 'show') { | ||
if ($fetch == true) { | ||
return $this->sQuery->fetchAll($fetchmode); | ||
}else { | ||
return $this->sQuery->fetch($fetchmode); | ||
} | ||
|
||
} elseif ($statement === 'insert' || $statement === 'update' || $statement === 'delete') { | ||
// return $this->sQuery->rowCount(); | ||
return true; | ||
} else { | ||
return NULL; | ||
} | ||
} | ||
|
||
/** | ||
* Returns the last inserted id. | ||
* @return string | ||
*/ | ||
public function lastInsertId() | ||
{ | ||
return $this->pdo->lastInsertId(); | ||
} | ||
|
||
/** | ||
* Starts the transaction | ||
* @return boolean, true on success or false on failure | ||
*/ | ||
public function beginTransaction() | ||
{ | ||
return $this->pdo->beginTransaction(); | ||
} | ||
|
||
/** | ||
* Execute Transaction | ||
* @return boolean, true on success or false on failure | ||
*/ | ||
public function executeTransaction() | ||
{ | ||
return $this->pdo->commit(); | ||
} | ||
|
||
/** | ||
* Rollback of Transaction | ||
* @return boolean, true on success or false on failure | ||
*/ | ||
public function rollBack() | ||
{ | ||
return $this->pdo->rollBack(); | ||
} | ||
|
||
/** | ||
* Returns an array which represents a column from the result set | ||
* | ||
* @param string $query | ||
* @param array $params | ||
* @return array | ||
*/ | ||
public function column($query, $params = null) | ||
{ | ||
$this->Init($query, $params); | ||
$Columns = $this->sQuery->fetchAll(PDO::FETCH_NUM); | ||
|
||
$column = null; | ||
|
||
foreach ($Columns as $cells) { | ||
$column[] = $cells[0]; | ||
} | ||
|
||
return $column; | ||
|
||
} | ||
/** | ||
* Returns an array which represents a row from the result set | ||
* | ||
* @param string $query | ||
* @param array $params | ||
* @param int $fetchmode | ||
* @return array | ||
*/ | ||
public function row($query, $params = null, $fetchmode = PDO::FETCH_ASSOC) | ||
{ | ||
$this->Init($query, $params); | ||
$result = $this->sQuery->fetch($fetchmode); | ||
$this->sQuery->closeCursor(); // Frees up the connection to the server so that other SQL statements may be issued, | ||
return $result; | ||
} | ||
/** | ||
* Returns the value of one single field/column | ||
* | ||
* @param string $query | ||
* @param array $params | ||
* @return string | ||
*/ | ||
public function single($query, $params = null) | ||
{ | ||
$this->Init($query, $params); | ||
$result = $this->sQuery->fetchColumn(); | ||
$this->sQuery->closeCursor(); // Frees up the connection to the server so that other SQL statements may be issued | ||
return $result; | ||
} | ||
/** | ||
* Writes the log and returns the exception | ||
* | ||
* @param string $message | ||
* @param string $sql | ||
* @return string | ||
*/ | ||
private function ExceptionLog($message, $sql = "") | ||
{ | ||
$exception = 'Unhandled Exception. <br />'; | ||
$exception .= $message; | ||
$exception .= "<br /> You can find the error back in the log."; | ||
|
||
if (!empty($sql)) { | ||
# Add the Raw SQL to the Log | ||
$message .= "\r\nRaw SQL : " . $sql; | ||
} | ||
# Write into log | ||
$this->log->write($message); | ||
|
||
return $exception; | ||
} | ||
} | ||
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
<?php | ||
/* * | ||
* Log A logger class which creates logs when an exception is thrown. | ||
* @author Author: Vivek Wicky Aswal. (https://twitter.com/#!/VivekWickyAswal) | ||
* @git https://github.com/wickyaswal/PHP-MySQL-PDO-Database-Class | ||
* @version 0.1a | ||
*/ | ||
class Log { | ||
|
||
# @string, Log directory name | ||
private $path = '/logs/'; | ||
|
||
# @void, Default Constructor, Sets the timezone and path of the log files. | ||
public function __construct() { | ||
date_default_timezone_set('Europe/Amsterdam'); | ||
$this->path = dirname(__FILE__) . $this->path; | ||
} | ||
|
||
/** | ||
* @void | ||
* Creates the log | ||
* | ||
* @param string $message the message which is written into the log. | ||
* @description: | ||
* 1. Checks if directory exists, if not, create one and call this method again. | ||
* 2. Checks if log already exists. | ||
* 3. If not, new log gets created. Log is written into the logs folder. | ||
* 4. Logname is current date(Year - Month - Day). | ||
* 5. If log exists, edit method called. | ||
* 6. Edit method modifies the current log. | ||
*/ | ||
public function write($message) { | ||
$date = new DateTime(); | ||
$log = $this->path . $date->format('Y-m-d').".txt"; | ||
|
||
if(is_dir($this->path)) { | ||
if(!file_exists($log)) { | ||
$fh = fopen($log, 'a+') or die("Fatal Error !"); | ||
$logcontent = "Time : " . $date->format('H:i:s')."\r\n" . $message ."\r\n"; | ||
fwrite($fh, $logcontent); | ||
fclose($fh); | ||
} | ||
else { | ||
$this->edit($log,$date, $message); | ||
} | ||
} | ||
else { | ||
if(mkdir($this->path,0777) === true) | ||
{ | ||
$this->write($message); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* @void | ||
* Gets called if log exists. | ||
* Modifies current log and adds the message to the log. | ||
* | ||
* @param string $log | ||
* @param DateTimeObject $date | ||
* @param string $message | ||
*/ | ||
private function edit($log,$date,$message) { | ||
$logcontent = "Time : " . $date->format('H:i:s')."\r\n" . $message ."\r\n\r\n"; | ||
$logcontent = $logcontent . file_get_contents($log); | ||
file_put_contents($log, $logcontent); | ||
} | ||
} | ||
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
Time : 11:58:45 | ||
SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'aircraft_id' at row 1 | ||
Raw SQL : INSERT INTO schedules (aircraft_id, engineer_id, task) VALUES (:aircraft_id, :engineer_id, :task) | ||
|
||
Time : 07:40:33 | ||
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'type' in 'field list' | ||
Raw SQL : INSERT INTO aircraft (company, number, type, age, year, running_hours) VALUES (:company, :number, :type, :age, :year, :running_hours) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
;<?php return; ?> | ||
[SQL] | ||
host = 127.0.0.1 | ||
user = root | ||
password = psalm294u | ||
dbname = abc_air |
Oops, something went wrong.