<?php
use Atto\Cache\Storage;
use Atto\Cache\Item;
/**
* Create this table in youre mysql / maria DB database
*
* CREATE TABLE `cache` (
* `id` char(40) NOT NULL,
* `item` text NOT NULL
* ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
*
*
* Implementation of a MySQL storage for the cache system.
*
* @author Andrei
*
*/
class MySQLStorage implements Storage {
/**
* MySQLi Instance
*
* @var \mysqli
*/
protected $mysqli;
/**
* Table name where all values are stored
*
* @var string
*/
protected $table;
/**
* MySQLStorage constructor
*
* @param string $host
* @param string $user
* @param string $password
* @param string $database
* @param string $table
*/
public function __construct($host, $user, $password, $database, $table) {
// Connect to the database
$this->mysqli = new mysqli($host, $user, $password, $database);
// Check for any errors
if ($this->mysqli->connect_error) {
die('Connection error (' . $this->mysqli->connect_errno . ') ' . $this->mysqli->connect_error);
}
$this->table = $table;
}
/**
* Saves a new Item with the given key
*
* @param string $key
* @param Item $item
*/
public function save($key, Item $item) {
$query = "INSERT INTO $this->table (id, item) VALUES (?, ?)";
$key = sha1($key);
$item = serialize($item);
$stmt = $this->mysqli->prepare($query);
$stmt->bind_param('ss', $key, $item);
$stmt->execute();
$stmt->close();
}
/**
* Removes the indicated Item from the storage
*
* @param string $key
*/
public function delete($key) {
$query = "DELETE FROM $this->table WHERE id = ?";
$key = sha1($key);
$stmt = $this->mysqli->prepare($query);
$stmt->bind_param('s', $key);
$stmt->execute();
$stmt->close();
}
/**
* Returns the Item associated with the given key
*
* @param string $key
*
* @return Item
*/
public function getItem($key) {
$query = "SELECT item FROM $this->table WHERE id = ?";
$key = sha1($key);
$stmt = $this->mysqli->prepare($query);
$stmt->bind_param('s', $key);
$stmt->execute();
$stmt->bind_result($item);
$stmt->fetch();
$stmt->close();
return ! isset($item) ? null : unserialize($item);
}
/**
* Close the connection to the database
*/
public function __destruct() {
// Close mysqli connection
$this->mysqli->close();
}
}
|