Skip to content

Instantly share code, notes, and snippets.

@ceceprawiro
Last active August 29, 2015 14:06
Show Gist options
  • Save ceceprawiro/4f8072ffa3ee412f2f13 to your computer and use it in GitHub Desktop.
Save ceceprawiro/4f8072ffa3ee412f2f13 to your computer and use it in GitHub Desktop.
A very simple example how to use mysqli
<?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