Last active
August 29, 2015 14:06
-
-
Save ceceprawiro/4f8072ffa3ee412f2f13 to your computer and use it in GitHub Desktop.
A very simple example how to use mysqli
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 | |
/** | |
* Class Database using mysqli | |
* | |
* @link https://gist.github.com/ceceprawiro/4f8072ffa3ee412f2f13 | |
* @author Cecep Prawiro | |
*/ | |
class Database | |
{ | |
private $db; | |
public $result; | |
/** | |
* Connect to MySQL server and change database. | |
* | |
* @param String $db_hostname | |
* @param String $db_username | |
* @param String $db_password | |
* @param String $db_database | |
* | |
* @return void | |
*/ | |
public function __construct($db_hostname, $db_username, $db_password, $db_database) | |
{ | |
/* Trying to connect to database */ | |
$this->db = @new mysqli($db_hostname, $db_username, $db_password, $db_database); | |
if ($this->db->connect_errno) trigger_error('Database Error ('.$this->db->connect_errno.'): ' . $this->db->connect_error, E_USER_ERROR); | |
/* Trying to use database */ | |
if ($this->db->select_db($db_database) === false) trigger_error('Database Error ('.$this->db->errno.'): ' . $this->db->error, E_USER_ERROR); | |
} | |
/** | |
* Performs a query on the database. | |
* | |
* @param String $sql The query string. | |
* Example: | |
* SELECT * FROM posts WHERE id = '%i' | |
* SELECT * FROM posts WHERE title LIKE '%%s%' | |
* Note: | |
* i = integer | |
* d = double | |
* s = string | |
* b = blob | |
* @param Array $args Variables for the parameter markers in the SQL statement. | |
* @return stdObject Object. | |
*/ | |
public function query($sql, $parameters = []) | |
{ | |
if (! is_array($parameters)) $parameters = [$parameters]; | |
$stmt = $this->prepare($sql, $parameters); | |
$stmt->execute(); | |
$stmt->store_result(); | |
$this->result = (object) [ | |
'affected_rows' => $stmt->affected_rows, | |
'insert_id' => $stmt->insert_id, | |
'num_rows' => $stmt->num_rows, | |
'field_count' => $stmt->field_count, | |
'errno' => $stmt->errno, | |
'error' => $stmt->error, | |
'records' => $stmt->num_rows > 0 ? $this->fetch($stmt) : null, | |
]; | |
$stmt->close(); | |
return $this->result; | |
} | |
/** | |
* Prepare statement and bind parameters. | |
* | |
* @param string $sql The query string. | |
* @param array $parameters Variables to passed to mysqli_prepare. | |
* @return mysqli_stmt Object. | |
*/ | |
private function prepare($sql, $parameters) | |
{ | |
// Example query: | |
// "SELECT * FROM table WHERE id = %i" | |
$map = array( | |
'%i' => 'i', //integer | |
'%d' => 'd', //float | |
'%s' => 's', //string | |
); | |
$pattern = '/(' . implode('|', array_keys($map)) . ')/'; | |
if (preg_match_all($pattern, $sql, $matches)) { | |
$types = implode('', $matches[0]); | |
$types = strtr($types, $map); | |
/* Prepare statement */ | |
$sql = preg_replace($pattern, '?', $sql); | |
$stmt = $this->db->prepare($sql); | |
if ($stmt === false) trigger_error('SQL Error ('.$this->db->errno.'): ' . $this->db->error, E_USER_ERROR); | |
/* | |
mysqli_stmt_bind_param() requires parameters to be passed by | |
reference, whereas in PHP 5.3+ call_user_func_array() can accept as | |
a parameter a list of variables that can represent references or | |
values. | |
Also see fetch() method. | |
*/ | |
array_unshift($parameters, $types); | |
foreach ($parameters as $key => $value) { | |
$parameters[$key] = &$parameters[$key]; | |
} | |
call_user_func_array([$stmt, 'bind_param'], $parameters); | |
} else { | |
/* Prepare statement */ | |
$stmt = $this->db->prepare($sql); | |
} | |
return $stmt; | |
} | |
/** | |
* Gets a result set from a prepared statement. | |
* | |
* @param mysqli_stmt Object $stmt The mysqli statement object. | |
* @return array. | |
*/ | |
private function fetch($stmt) | |
{ | |
$meta = $stmt->result_metadata(); | |
while ($field = $meta->fetch_field()) { | |
$params[] = &$row[$field->name]; | |
} | |
call_user_func_array([$stmt, 'bind_result'], $params); | |
$result = null; | |
while ($stmt->fetch()) { | |
foreach($row as $key => $val) { | |
$field[$key] = $val; | |
} | |
$result[] = $field; | |
} | |
return $result; | |
} | |
} | |
/* | |
Let's create an example! | |
Here we want to extends the Database Class. | |
DROP TABLE IF EXISTS user; | |
CREATE TABLE IF NOT EXISTS user ( | |
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, | |
username VARCHAR(100) NOT NULL DEFAULT '', | |
password VARCHAR(65) NOT NULL DEFAULT '', | |
PRIMARY KEY (id), | |
UNIQUE (username) | |
); | |
INSERT INTO user (username, password) VALUES | |
('Dian', SHA2('dian', 0)), | |
('Sastro', SHA2('sastro', 0)), | |
('Wardoyo', SHA2('wardoyo', 0)); | |
*/ | |
define('DB_HOSTNAME', 'localhost'); | |
define('DB_USERNAME', 'root'); | |
define('DB_PASSWORD', 'root'); | |
define('DB_DATABASE', 'test'); | |
class UsersModel extends Database | |
{ | |
/** | |
* The constructor. | |
*/ | |
public function __construct() | |
{ | |
parent::__construct(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); | |
} | |
public function get_all() | |
{ | |
return $this->query('SELECT * FROM user'); | |
} | |
public function get_by_id($id) | |
{ | |
return $this->query('SELECT * FROM user WHERE id = %i', [$id]); | |
} | |
public function get_by_username($username) | |
{ | |
// Be careful when using % with LIKE. | |
return $this->query("SELECT * FROM user WHERE username LIKE %%s%", [$username]); | |
} | |
public function insert($values) | |
{ | |
return $this->query('INSERT INTO user (username, password) VALUES (%s, %s)', $values); | |
} | |
public function update($id, $values) | |
{ | |
array_unshift($values, $id); | |
return $this->query('UPDATE user SET username = %s, password = %s WHERE id = %i', $values); | |
} | |
public function delete($id) | |
{ | |
return $this->query('DELETE FROM user WHERE id = %i', [$id]); | |
} | |
} | |
$users = new UsersModel(); | |
$result = $users->insert(['Raisa', hash('sha256', 'raisa')]); | |
$result = $users->insert(['Andriana', hash('sha256', 'andriana')]); | |
$result = $users->get_all(); | |
foreach ($result->records as $user) | |
printf('id = %1$d, username = %2$s, password = %3$s<br/>', $user['id'], $user['username'], $user['password']); | |
// Duplicate entry 'Raisa' | |
$result = $users->insert(['Raisa', hash('sha256', 'raisa')]); | |
echo '<pre>'; print_r($result); echo '</pre>'; | |
// Get all records after duplicate entry | |
$result = $users->get_all(); | |
foreach ($result->records as $user) | |
printf('id = %1$d, username = %2$s, password = %3$s<br/>', $user['id'], $user['username'], $user['password']); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment