Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Results 1 to 1 of 1

Thread: MySQL Classes

  1. #1
    New Coder
    Join Date
    Aug 2010
    Posts
    45
    Thanks
    0
    Thanked 14 Times in 14 Posts

    Cool MySQL Classes

    Note: I plan to write a MySQLi version soon, and then for other database extensions.

    PHP Code:
      /*
       * Copyright  Michael Rushton 2010
       * http://squiloople.com/
       * Feel free to use and redistribute this code. But please keep this copyright notice.
       */

      
    final class MySQLConnection {

        private static 
    $instance;
        private 
    $connection;

        private function 
    __construct($connect) {

          if (!
    $this->connection mysql_connect($connect[0], $connect[1], $connect[2])) {
            throw new 
    Exception('Unable to connect to the server.');
          }

          if (isset(
    $connect[3])) {
            
    $this->SetDatabase($connect[3]);
          }

        }

        public static function 
    SetConnection() {

          if (!isset(
    self::$instance)) {
            
    self::$instance = new self(func_get_args());
          }

          return 
    self::$instance;

        }

        public function 
    GetConnection() {
          return 
    $this->connection;
        }

        public function 
    SetDatabase($database) {

          if (!
    mysql_select_db($database$this->connection)) {
            throw new 
    Exception('Unable to select the database.');
          }

          return 
    $this;

        }

        public function 
    PrepareInsertStatement() {
          return new 
    InsertStatement($this->connection);
        }

        public function 
    PrepareDeleteStatement() {
          return new 
    DeleteStatement($this->connection);
        }

        public function 
    PrepareUpdateStatement() {
          return new 
    UpdateStatement($this->connection);
        }

        public function 
    PrepareSelectStatement() {
          return new 
    SelectStatement($this->connection);
        }

        public function 
    Query($query) {
          return new 
    MySQLResult($query$this->connection);
        }

        public function 
    Disconnect() {

          if (!
    mysql_close($this->connection)) {
            throw new 
    Exception('Unable to close the connection.');
          }

          
    self::$instance null;

        }

      }

      abstract class 
    MySQLStatement {

        protected 
    $connection;

        protected 
    $table     '';
        protected 
    $field     '';
        protected 
    $value     '';
        protected 
    $duplicate '';
        protected 
    $where     '';
        protected 
    $group     '';
        protected 
    $having    '';
        protected 
    $order     '';
        protected 
    $limit     '';

        final public function 
    __construct($connection null) {

          if (
    is_null($connection)) {
            
    $connection MySQLConnection::SetConnection()->GetConnection();
          }

          
    $this->connection $connection;

        }

        final public function 
    SetTable($table) {

          
    $this->table $table;

          return 
    $this;

        }

        final public function 
    AddTable() {

          
    $update func_get_args();

          if (
    is_array($table $update[0])) {
            
    $table $table[$alias key($table)] . ' AS ' $alias;
          }

          else {
            
    $alias $table;
          }

          for (
    $i 1$n count($update); $i $n; ++$i) {

            
    $update[$i][0] = $alias '.' $update[$i][0];

            if (!isset(
    $update[$i][2])) {
              
    $update[$i][2] = '?';
            }

          }

          
    $this->table .= !isset($this->table[0]) ? $table ', ' $table;

          unset(
    $update[0]);

          foreach (
    $update as $value) {
            
    $this->AddValue($value[0], $value[1], $value[2]);
          }

          return 
    $this;

        }

        final public function 
    AddField() {

          
    $select func_get_args();

          if (!isset(
    $select[1])) {
            
    $select[1] = '*';
          }

          if (
    is_array($table $select[0])) {
            
    $table $table[$alias key($table)] . ' AS ' $alias;
          }

          else {
            
    $alias $table;
          }

          for (
    $i 1$n count($select); $i $n; ++$i) {

            if (!
    is_array($select[$i])) {
              
    $select[$i] = array('?' => $select[$i]);
            }

            
    $select[$i] = str_replace('?'$alias '.' $select[$i][$function key($select[$i])], $function);

          }

          
    $this->table .= !isset($this->table[0]) ? ' FROM ' $table ', ' $table;

          unset(
    $select[0]);

          
    $this->field .= !isset($this->field[0]) ? implode(', '$select) : ', ' implode(', '$select);

          return 
    $this;

        }

        final public function 
    AddValue($field$value$function '?') {

          if (
    $function) {
            
    $value $this->EscapeData((array) $value$function);
          }

          
    $value $field ' = ' $value;

          
    $this->value .= !isset($this->value[0]) ? ' SET ' $value ', ' $value;

          return 
    $this;

        }

        final public function 
    AddDuplicate($field$value$function '?') {

          if (
    $function) {
            
    $value $this->EscapeData((array) $value$function);
          }

          
    $duplicate $field ' = ' $value;

          
    $this->duplicate .= !isset($this->duplicate[0]) ? ' ON DUPLICATE KEY UPDATE ' $duplicate ', ' $duplicate;

          return 
    $this;

        }

        final public function 
    AddWhere() {

          
    $operator = (func_get_arg(func_num_args() - 1) === true) ? ' OR ' ' AND ';

          if (
    count($condition func_get_args()) > 1) {
            
    $condition[0] = $this->EscapeData(array_slice($condition1), $condition[0]);
          }

          
    $where '(' $condition[0] . ')';

          
    $this->where .= !isset($this->where[0]) ? ' WHERE ' $where $operator $where;

          return 
    $this;

        }

        final public function 
    AddGroup() {

          
    $group implode(', 'func_get_args());

          
    $this->group .= !isset($this->group[0]) ? ' GROUP BY ' $group ', ' $group;

          return 
    $this;

        }

        final public function 
    AddHaving() {

          
    $operator = (func_get_arg(func_num_args() - 1) === true) ? ' OR ' ' AND ';

          if (
    count($condition func_get_args()) > 1) {
            
    $condition[0] = $this->EscapeData(array_slice($condition1), $condition[0]);
          }

          
    $having '(' $condition[0] . ')';

          
    $this->having .= !isset($this->having[0]) ? ' HAVING ' $having $operator $having;

          return 
    $this;

        }

        final public function 
    AddOrder() {

          
    $order implode(', 'func_get_args());

          
    $this->order .= !isset($this->order[0]) ? ' ORDER BY ' $order ', ' $order;

          return 
    $this;

        }

        final public function 
    SetLimit($limit$offset 0) {

          
    $this->limit ' LIMIT ' $offset ', ' $limit;

          return 
    $this;

        }

        final private function 
    EscapeData($value$expression '?') {

          
    $token strtok($expression'?');

          
    $expression '';

          foreach (
    $value as $key => $escape) {

            if (!
    $escape addcslashes(mysql_real_escape_string($escape$this->connection), '%_')) {
              throw new 
    Exception('Unable to escape the data.');
            }

            
    $expression .= $token .= "'" $escape "'";

            if (isset(
    $value[$key 1])) {
              
    $token strtok('?');
            }

          }

          
    $token strtok('');

          return 
    $expression .= $token;

        }

        final public function 
    Query() {
          return new 
    MySQLResult($this$this->connection);
        }

        abstract public function 
    __toString();

      }

      final class 
    InsertStatement extends MySQLStatement {

        public function 
    __toString() {
          return 
    'INSERT INTO ' $this->table $this->value $this->duplicate;
        }

      }

      final class 
    DeleteStatement extends MySQLStatement {

        public function 
    __toString() {
          return 
    'DELETE FROM ' $this->table $this->where $this->order $this->limit;
        }

      }

      final class 
    UpdateStatement extends MySQLStatement {

        public function 
    __toString() {
          return 
    'UPDATE ' $this->table $this->value $this->where $this->order $this->limit;
        }

      }

      final class 
    SelectStatement extends MySQLStatement {

        public function 
    __toString() {
          return 
    'SELECT ' $this->field $this->table $this->where $this->group $this->having $this->order $this->limit;
        }

      }

      final class 
    MySQLResult {

        private 
    $connection;
        private 
    $result;

        public function 
    __construct($query$connection null) {

          if (
    is_null($connection)) {
            
    $connection MySQLConnection::SetConnection()->GetConnection();
          }

          if (!
    $this->result mysql_query($query$this->connection $connection)) {
            throw new 
    Exception('Unable to perform the query.');
          }

        }

        public function 
    GetCount() {

          if (!
    is_resource($this->result)) {
            throw new 
    Exception('Query result is not a resource.');
          }

          return 
    mysql_num_rows($this->result);

        }

        public function 
    GetID() {

          if (
    is_resource($this->result)) {
            throw new 
    Exception('Query result is a resource.');
          }

          return 
    mysql_insert_id($this->connection);

        }

        public function 
    GetAffected() {

          if (
    is_resource($this->result)) {
            throw new 
    Exception('Query result is a resource.');
          }

          return 
    mysql_affected_rows($this->connection);

        }

        public function 
    GetOne($type MYSQL_ASSOC) {

          if (!
    is_resource($this->result)) {
            throw new 
    Exception('Query result is not a resource.');
          }

          return 
    mysql_fetch_array($this->result$type);

        }

        public function 
    GetAll($type MYSQL_ASSOC) {

          if (!
    is_resource($this->result)) {
            throw new 
    Exception('Query result is not a resource.');
          }

          while (
    $result mysql_fetch_array($this->result$type)) {

            if (!
    is_null($result)) {
              
    $rows[] = $result;
            }

          }

          return 
    $rows;

        }

        public function 
    GetRow($row$type MYSQL_ASSOC) {

          if (
    $row || ($row 1) > $this->GetCount()) {
            throw new 
    Exception('Invalid row number.');
          }

          
    mysql_data_seek($this->result$row);

          return 
    $this->GetOne($type);

        }

      } 
    Usage example:

    PHP Code:
      try {

        
    $connection MySQLConnection::SetConnection('hostname''username''password''database');

        try {

          
    $result $connection->PrepareSelectStatement()
            ->
    AddField(array('data' => 'users'), 'id', array('? AS name' => 'username'))
            ->
    AddWhere('username != ? AND password != MD5(?)''A''B')
            ->
    SetLimit(10)
            ->
    Query();

          
    // Queries: SELECT data.id, data.username AS name FROM users AS data WHERE (username != 'O\'Connor' AND password != MD5('swordfish')) LIMIT 0, 10

          
    try {

            
    $rows $result->GetAll();

            
    /*
             * Returns: Array (
             *            [0] => Array (
             *                     [id]   => 1
             *                     [name] => Michael
             *                   )
             *            [1] => Array (
             *                     [id]   => 2
             *                     [name] => Andrew
             *                   )
             *          )
             */

            
    foreach ($rows as $user) {
              echo 
    $user['id'] . ": " $user['name'] . "<br />";
            }

            
    /*
             * Echos:
             *
             *   1: Michael
             *   2: Andrew
             *
             */

          
    }

          catch (
    Exception $fetch) {
            echo 
    $fetch->getMessage();
          }

        }

        catch (
    Exception $query) {
          echo 
    $query->getMessage();
        }

      }

      catch (
    Exception $database) {
        echo 
    $database->getMessage();
      } 
    Last edited by MRushton; 09-16-2010 at 09:28 PM.


 

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •