* @copyright 2009 Yubico * @license http://opensource.org/licenses/bsd-license.php New BSD License * @link http://www.yubico.com/ * @link http://code.google.com/p/yubikey-timedelta-server-php/ */ class Db { /** * Constructor * * @param string $host Database host * @param string $user Database user * @param string $pwd Database password * @param string $name Database table name * @return void * */ public function __construct($host, $user, $pwd, $db_name) { $this->host=$host; $this->user=$user; $this->pwd=$pwd; $this->db_name=$db_name; } /** * function to convert Db timestamps to unixtime(s) * * @param string $updated Database timestamp * @return int Timestamp in unixtime format * */ public function timestampToTime($updated) { $stamp=strptime($updated, '%F %H:%M:%S'); return mktime($stamp[tm_hour], $stamp[tm_min], $stamp[tm_sec], $stamp[tm_mon]+1, $stamp[tm_mday], $stamp[tm_year]); } /** * function to compute delta (s) between 2 Db timestamps * * @param string $first Database timestamp 1 * @param string $second Database timestamp 2 * @return int Deltatime (s) * */ public function timestampDeltaTime($first, $second) { return Db::timestampToTime($second) - Db::timestampToTime($first); } /** * function to disconnect from database * * @return boolean True on success, otherwise false. * */ public function disconnect() { if ($this->db_conn!=NULL) { mysql_close($this->db_conn); $this->db_conn=NULL; } } /** * function to check if database is connected * * @return boolean True if connected, otherwise false. * */ public function isConnected() { if ($this->db_conn!=NULL) return True; else return False; } /** * function to connect to database defined in config.php * * @return boolean True on success, otherwise false. * */ public function connect(){ if (! $this->db_conn = mysql_connect($this->host, $this->user, $this->pwd)) { error_log('Could not connect: ' . mysql_error()); return false; } if (! mysql_select_db($this->db_name)) { error_log('Could not select database ' . $this->db_name); $this->disconnect(); return false; } return true; } public function truncateTable($name) { mysql_query("TRUNCATE TABLE " . $name); } /** * function to update row in database * * @param string $table Database table to update row in * @param int $id Id on row to update * @param array $values Array with key=>values to update * @return boolean True on success, otherwise false. * */ public function update($table, $id, $values) { foreach ($values as $key=>$value){ if ($value != null) $query = $query . " " . $key . "='" . $value . "',"; } if (! $query) { log("no values to set in query. Not updating DB"); return true; } $query = rtrim($query, ",") . " WHERE id = " . $id; // Insert UPDATE statement at beginning $query = "UPDATE " . $table . " SET " . $query; if (! mysql_query($query)){ error_log('Query failed: ' . mysql_error()); error_log('Query was: ' . $query); return false; } return true; } /** * function to update row in database * * @param string $table Database table to update row in * @param int $id Id on row to update * @param array $values Array with key=>values to update * @param string $condition conditional statement * @return boolean True on success, otherwise false. * */ public function conditional_update($table, $id, $values, $condition) { foreach ($values as $key=>$value){ if ($value != null) $query = $query . " " . $key . "='" . $value . "',"; } if (! $query) { log("no values to set in query. Not updating DB"); return true; } $query = rtrim($query, ",") . " WHERE id = " . $id . " and " . $condition; // Insert UPDATE statement at beginning $query = "UPDATE " . $table . " SET " . $query; if (! mysql_query($query)){ error_log('Query failed: ' . mysql_error()); error_log('Query was: ' . $query); return false; } return true; } /** * function to insert new row in database * * @param string $table Database table to update row in * @param array $values Array with key=>values to update * @return boolean True on success, otherwise false. * */ public function save($table, $values) { $query= 'INSERT INTO ' . $table . " ("; foreach ($values as $key=>$value){ if ($value != null) $query = $query . $key . ","; } $query = rtrim($query, ",") . ') VALUES ('; foreach ($values as $key=>$value){ if ($value != null) $query = $query . "'" . $value . "',"; } $query = rtrim($query, ","); $query = $query . ")"; if (! mysql_query($query)){ error_log('Query failed: ' . mysql_error()); error_log('Query was: ' . $query); return false; } return true; } /** * helper function to collect last row[s] in database * * @param string $table Database table to update row in * @param int $nr Number of rows to collect. NULL=>inifinity. DEFAULT=1. * @return mixed Array with values from Db row or 2d-array with multiple rows or false on failure. * */ public function last($table, $nr=1) { return Db::findBy($table, null, null, $nr, 1); } /** * main function used to get rows from Db table. * * @param string $table Database table to update row in * @param string $key Column to select rows by * @param string $value Value to select rows by * @param int $nr Number of rows to collect. NULL=>inifinity. Default=NULL. * @param int $rev rev=1 indicates order should be reversed. Default=NULL. * @return mixed Array with values from Db row or 2d-array with multiple rows * */ public function findBy($table, $key, $value, $nr=null, $rev=null) { $query="SELECT * FROM " . $table; if ($key!=null) $query.= " WHERE " . $key . " = '" . $value . "'"; if ($rev==1) $query.= " ORDER BY id DESC"; if ($nr!=null) $query.= " LIMIT " . $nr; $result = mysql_query($query); if (! $result) { error_log('Query failed: ' . mysql_error()); error_log('Query was: ' . $query); return false; } if ($nr==1) { $row = mysql_fetch_array($result, MYSQL_ASSOC); return $row; } else { $collection=array(); while($row = mysql_fetch_array($result, MYSQL_ASSOC)){ $collection[]=$row; } return $collection; } } /** * main function used to get rows by multiple key=>value pairs from Db table. * * @param string $table Database table to update row in * @param array $where Array with column=>values to select rows by * @param int $nr Number of rows to collect. NULL=>inifinity. Default=NULL. * @param int $rev rev=1 indicates order should be reversed. Default=NULL. * @param string distinct Select rows with distinct columns, Default=NULL * @return mixed Array with values from Db row or 2d-array with multiple rows * */ public function findByMultiple($table, $where, $nr=null, $rev=null, $distinct=null) { $query="SELECT"; if ($distinct!=null) { $query.= " DISTINCT " . $distinct; } else { $query.= " *"; } $query.= " FROM " . $table; if ($where!=null){ $query.= " WHERE"; foreach ($where as $key=>$value) { $query.= " ". $key . " = '" . $value . "' and"; } $query=rtrim($query, "and"); $query=rtrim($query); } if ($rev==1) $query.= " ORDER BY id DESC"; if ($nr!=null) $query.= " LIMIT " . $nr; $result = mysql_query($query); if (! $result) { error_log('Query failed: ' . mysql_error()); error_log('Query was: ' . $query); return false; } if ($nr==1) { $row = mysql_fetch_array($result, MYSQL_ASSOC); return $row; } else { $collection=array(); while($row = mysql_fetch_array($result, MYSQL_ASSOC)){ $collection[]=$row; } return $collection; } } /** * main function used to delete rows by multiple key=>value pairs from Db table. * * @param string $table Database table to delete row in * @param array $where Array with column=>values to select rows by * @param int $nr Number of rows to collect. NULL=>inifinity. Default=NULL. * @param int $rev rev=1 indicates order should be reversed. Default=NULL. * @param string distinct Select rows with distinct columns, Default=NULL * @return mixed Array with values from Db row or 2d-array with multiple rows * */ public function deleteByMultiple($table, $where, $nr=null, $rev=null) { $query="DELETE"; $query.= " FROM " . $table; if ($where!=null){ $query.= " WHERE"; foreach ($where as $key=>$value) { $query.= " ". $key . " = '" . $value . "' and"; } $query=rtrim($query, "and"); $query=rtrim($query); } if ($rev==1) $query.= " ORDER BY id DESC"; if ($nr!=null) $query.= " LIMIT " . $nr; $result = mysql_query($query); if (! $result) { error_log('Query failed: ' . mysql_error()); error_log('Query was: ' . $query); return false; } return $result; } public function customQuery($query) { return mysql_query($query); } /** * helper function used to get rows from Db table in reversed order. * defaults to obtaining 1 row. * * @param string $table Database table to update row in * @param string $key Column to select rows by * @param string $value Value to select rows by * @param int $nr Number of rows to collect. NULL=>inifinity. Default=1. * @return mixed Array with values from Db row or 2d-array with multiple rows or false on failure. * */ public function lastBy($table, $key, $value, $nr=1) { return Db::findBy($table, $key, $value, $nr, 1); } /** * helper function used to get rows from Db table in standard order. * defaults to obtaining 1 row. * * @param string $table Database table to update row in * @param string $key Column to select rows by * @param string $value Value to select rows by * @param int $nr Number of rows to collect. NULL=>inifinity. Default=1. * @return mixed Array with values from Db row or 2d-array with multiple rows or false on failure. * */ public function firstBy($table, $key, $value, $nr=1) { return Db::findBy($table, $key, $value, $nr); } } ?>