Created
December 26, 2013 15:41
-
-
Save johnmorris/8135167 to your computer and use it in GitHub Desktop.
A simple database class using mysqli prepared statements in PHP.
This file contains hidden or 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
<?php | |
if ( !class_exists( 'DB' ) ) { | |
class DB { | |
public function __construct($user, $password, $database, $host = 'localhost') { | |
$this->user = $user; | |
$this->password = $password; | |
$this->database = $database; | |
$this->host = $host; | |
} | |
protected function connect() { | |
return new mysqli($this->host, $this->user, $this->password, $this->database); | |
} | |
public function query($query) { | |
$db = $this->connect(); | |
$result = $db->query($query); | |
while ( $row = $result->fetch_object() ) { | |
$results[] = $row; | |
} | |
return $results; | |
} | |
public function insert($table, $data, $format) { | |
// Check for $table or $data not set | |
if ( empty( $table ) || empty( $data ) ) { | |
return false; | |
} | |
// Connect to the database | |
$db = $this->connect(); | |
// Cast $data and $format to arrays | |
$data = (array) $data; | |
$format = (array) $format; | |
// Build format string | |
$format = implode('', $format); | |
$format = str_replace('%', '', $format); | |
list( $fields, $placeholders, $values ) = $this->prep_query($data); | |
// Prepend $format onto $values | |
array_unshift($values, $format); | |
// Prepary our query for binding | |
$stmt = $db->prepare("INSERT INTO {$table} ({$fields}) VALUES ({$placeholders})"); | |
// Dynamically bind values | |
call_user_func_array( array( $stmt, 'bind_param'), $this->ref_values($values)); | |
// Execute the query | |
$stmt->execute(); | |
// Check for successful insertion | |
if ( $stmt->affected_rows ) { | |
return true; | |
} | |
return false; | |
} | |
public function update($table, $data, $format, $where, $where_format) { | |
// Check for $table or $data not set | |
if ( empty( $table ) || empty( $data ) ) { | |
return false; | |
} | |
// Connect to the database | |
$db = $this->connect(); | |
// Cast $data and $format to arrays | |
$data = (array) $data; | |
$format = (array) $format; | |
// Build format array | |
$format = implode('', $format); | |
$format = str_replace('%', '', $format); | |
$where_format = implode('', $where_format); | |
$where_format = str_replace('%', '', $where_format); | |
$format .= $where_format; | |
list( $fields, $placeholders, $values ) = $this->prep_query($data, 'update'); | |
//Format where clause | |
$where_clause = ''; | |
$where_values = ''; | |
$count = 0; | |
foreach ( $where as $field => $value ) { | |
if ( $count > 0 ) { | |
$where_clause .= ' AND '; | |
} | |
$where_clause .= $field . '=?'; | |
$where_values[] = $value; | |
$count++; | |
} | |
// Prepend $format onto $values | |
array_unshift($values, $format); | |
$values = array_merge($values, $where_values); | |
// Prepary our query for binding | |
$stmt = $db->prepare("UPDATE {$table} SET {$placeholders} WHERE {$where_clause}"); | |
// Dynamically bind values | |
call_user_func_array( array( $stmt, 'bind_param'), $this->ref_values($values)); | |
// Execute the query | |
$stmt->execute(); | |
// Check for successful insertion | |
if ( $stmt->affected_rows ) { | |
return true; | |
} | |
return false; | |
} | |
public function select($query, $data, $format) { | |
// Connect to the database | |
$db = $this->connect(); | |
//Prepare our query for binding | |
$stmt = $db->prepare($query); | |
//Normalize format | |
$format = implode('', $format); | |
$format = str_replace('%', '', $format); | |
// Prepend $format onto $values | |
array_unshift($data, $format); | |
//Dynamically bind values | |
call_user_func_array( array( $stmt, 'bind_param'), $this->ref_values($data)); | |
//Execute the query | |
$stmt->execute(); | |
//Fetch results | |
$result = $stmt->get_result(); | |
//Create results object | |
while ($row = $result->fetch_object()) { | |
$results[] = $row; | |
} | |
return $results; | |
} | |
public function delete($table, $id) { | |
// Connect to the database | |
$db = $this->connect(); | |
// Prepary our query for binding | |
$stmt = $db->prepare("DELETE FROM {$table} WHERE ID = ?"); | |
// Dynamically bind values | |
$stmt->bind_param('d', $id); | |
// Execute the query | |
$stmt->execute(); | |
// Check for successful insertion | |
if ( $stmt->affected_rows ) { | |
return true; | |
} | |
} | |
private function prep_query($data, $type='insert') { | |
// Instantiate $fields and $placeholders for looping | |
$fields = ''; | |
$placeholders = ''; | |
$values = array(); | |
// Loop through $data and build $fields, $placeholders, and $values | |
foreach ( $data as $field => $value ) { | |
$fields .= "{$field},"; | |
$values[] = $value; | |
if ( $type == 'update') { | |
$placeholders .= $field . '=?,'; | |
} else { | |
$placeholders .= '?,'; | |
} | |
} | |
// Normalize $fields and $placeholders for inserting | |
$fields = substr($fields, 0, -1); | |
$placeholders = substr($placeholders, 0, -1); | |
return array( $fields, $placeholders, $values ); | |
} | |
private function ref_values($array) { | |
$refs = array(); | |
foreach ($array as $key => $value) { | |
$refs[$key] = &$array[$key]; | |
} | |
return $refs; | |
} | |
} | |
} | |
$db = new DB('root', '', 'test'); | |
print_r($db->select('SELECT * FROM objects WHERE ID = ?', array(10), array('%d'))); |
Can you add an example of update and insert statement?
pls, i need the update example. the where and where_format, should be id=?, ['%d'] respectively?
I had to add
// Cast $format to arrays
$format = (array) $format;
right before the
//Normalize format
to the select() function as well. That was necessary because I want to pass $format as string.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Can anyone please tell me why return false is given at the end of both insert and update function?