View Single Post
  #1  
Old 03-24-2013, 04:18 PM
GuardiansWish GuardiansWish is offline
Member
 
Join Date: Jun 2012
Posts: 95
Gender: Female
Credits: 11,247
GuardiansWish is on a distinguished road
Default SERIOUS problems with Chibifurs

Okay for the past three months, Chibifurs has been dealing with some severe code issues. As seen here: http://www.chibifurs.com/ we are unable to get into the adopts half of the site. We have gone through the rings with our service providers who have essentially told us to come to you. I have included all screenshots and discussions we have had with them to help.

-----------------------------------

30 Dec.

Hi ----,

This is the error that comes about when an existing site (one with a valid /home/chibifur/public_html/classes/class_database.php ) points to a database that no longer exists.

Check /home/chibifur/public_html/classes/class_database.php and make sure that the database listed in there is able to be connected .

Regards,
Arun

----------------

Our response back:

http://fc03.deviantart.net/fs70/f/20...sh-d5pukij.png


Our uploaded file:

PHP Code:
<?php

class Database extends PDO{
    
/**
     * Tables' prefix
     *
     * @access private
     * @var string
     */
    
private $_prefix;

    
/**
     * Keep track of total rows from each query
     *
     * @access private
     * @var array
     */
    
private $_total_rows = array();

    
/**
     * Stores join table
     *
     * @access private
     * @var array
     */
    
private $_joins = array();

    
/**
     * If you don't know what this is, you shouldn't be here
     *
     * @param string $dbname
     * @param string $host
     * @param string $user
     * @param string $password
     * @param string $prefix    Tables' prefix
     * @access public
     */
    
public function __construct($dbname$host$user$password$prefix 'adopts_')
    {
        
parent::__construct('mysql:host=' $host ';dbname=' $dbname$user$password);
        
$this->_prefix $prefix;
    }

    
/**
     * Basic INSERT operation
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access public
     * @return object
     */
    
public function insert($tableName, array $data)
    {
        return 
$this->_query($tableName$data'insert');
    }

    
/**
     * Basic UPDATE operation
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access public
     * @return object
     */
    
public function update($tableName, array $data$clause NULL)
    {
        return 
$this->_query($tableName$data'update'$clause);
    }

    
/**
     * Basic SELECT operation
     *
     * @param string $tableName
     * @param array  $data        A key-value pair with values that correspond to the fields of the table
     * @param string $clause    Clauses for creating advance queries with JOINs, WHERE conditions, and whatnot
     * @access public
     * @return object
     */
    
public function select($tableName, array $data$clause NULL)
    {
        return 
$this->_query($tableName$data'select'$clause);
    }

    
/**
     * Basic DELETE operation
     *
     * @param string $tableName
     * @param string $clause    Clauses for creating advance queries with JOINs, WHERE conditions, and whatnot
     * @access public
     * @return object
     */
    
public function delete($tableName$clause NULL)
    {
        return 
$this->_query($tableName, array(), 'delete'$clause);
    }

    
/**
     * Adds JOIN to the next SELECT operation
     *
     * @param string $tableName
     * @param string $cond
     * @access public
     * @return object
     */
    
public function join($tableName$cond)
    {
        
$this->_joins[] = array($tableName$cond);
        return 
$this;
    }

    
/**
     * Get total rows affected by previous queries
     *
     * @param int    $index
     * @return int
     */
    
public function get_total_rows($index)
    {
        if (
$index 0)
        {
            return 
$this->_total_rows[count($this->_total_rows) + $index];
        }
        return 
$this->_total_rows[$index];
    }

    
/**
     * Handles queries
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @param string $operation Defines what kind of operation we'll carry on with the database
     * @access private
     * @return object
     */
    
private function _query($tableName, array $data$operation$clause NULL)
    {
        if ( ! 
is_string($tableName))
        {
            throw new 
Exception('Argument 1 to ' __CLASS__ '::' __METHOD__ ' must be a string');
        }

        if ( ! 
in_array($operation, array('insert''update''select''delete')))
        {
            throw new 
Exception('Unkown database operation.');
        }

        
$query call_user_func_array(array(&$this'_' $operation '_query'), array($tableName, &$data));

        if ( ! empty(
$clause))
        {
            
$query .= ' WHERE ' $clause;
        }
        
//The comments can be removed for debugging purposes.
        //echo $query;
        
$stmt $this->prepare($query);
        
$this->_bind_data($stmt$data);

        if ( ! 
$stmt->execute())
        {
            
$error $stmt->errorInfo();
            throw new 
Exception('Database error ' $error[1] . ' - ' $error[2]);
        }

        
$this->_total_rows[] = $stmt->rowCount();
        return 
$stmt;
    }

    
/**
     * Generates prepared INSERT query string
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access private
     * @return string
     */
    
private function _insert_query($tableName, &$data)
    {
        
$tableFields array_keys($data);
        return 
'INSERT INTO ' $this->_prefix $tableName '
                  (`' 
implode('`, `'$tableFields) . '`)
                  VALUES (:' 
implode(', :'$tableFields) . ')';
    }

    
/**
     * Generates prepared UPDATE query string
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access private
     * @return string
     */
    
private function _update_query($tableName, &$data)
    {
        
$setQuery = array();
        foreach (
$data as $field => &$value)
        {
            
$setQuery[] = '`' $field '` = :' $field;
        }
        return 
'UPDATE ' $this->_prefix $tableName '
                  SET ' 
implode(', '$setQuery);
    }

    
/**
     * Generates prepared SELECT query string
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with values that correspond to the fields of the table
     * @access private
     * @return string
     */
    
private function _select_query($tableName, &$data)
    {
        
$joins '';
        if ( ! empty(
$this->_joins))
        {
            foreach (
$this->_joins as $k => &$join)
            {
                
$exploded explode('='$join[1]);
                
$join_cond '`' $this->_prefix implode('`.`'explode('.'trim($exploded[0]))) . '` = `' $this->_prefix implode('`.`'explode('.'trim($exploded[1]))) . '`';   
                
$joins .= ' INNER JOIN `' $this->_prefix $join[0] . '` ON ' $join_cond;
            }
            
$this->_joins NULL;
            
$this->_joins = array();
        }
        
$fields = empty($data) ? '*' '`' implode('`, `'array_values($data)) . '`';
        return 
'SELECT ' $fields '
                  FROM `' 
$this->_prefix $tableName '`' $joins;
    }

    
/**
     * Generates prepared DELETE query string
     *
     * @param string $tableName
     * @access private
     * @return string
     */
    
private function _delete_query($tableName)
    {
        return 
'DELETE FROM `' $this->_prefix $tableName '`';
    }

    
/**
     * Binds data to the prepared statement
     *
     * @param object $stmt A PDOStatement object
     * @param array  $data A key-value pair to be bound with the statement
     * @access private
     * @return object
     */
    
private function _bind_data(&$stmt, &$data)
    {
        if ( ! empty(
$data))
        {
            foreach (
$data as $field => &$value)
            {
                
$stmt->bindParam(':' $field$value);
            }   
        }
        return 
$this;
    }
}

?>

Our base backup file (original):

PHP Code:
<?php

class Database extends PDO{
    
/**
     * Tables' prefix
     *
     * @access private
     * @var string
     */
    
private $_prefix;

    
/**
     * Keep track of total rows from each query
     *
     * @access private
     * @var array
     */
    
private $_total_rows = array();

    
/**
     * Stores join table
     *
     * @access private
     * @var array
     */
    
private $_joins = array();

    
/**
     * If you don't know what this is, you shouldn't be here
     *
     * @param string $dbname
     * @param string $host
     * @param string $user
     * @param string $password
     * @param string $prefix    Tables' prefix
     * @access public
     */
    
public function __construct($dbname$host$user$password$prefix 'adopts_')
    {
        
parent::__construct('mysql:host=' $host ';dbname=' $dbname$user$password);
        
$this->_prefix $prefix;
    }

    
/**
     * Basic INSERT operation
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access public
     * @return object
     */
    
public function insert($tableName, array $data)
    {
        return 
$this->_query($tableName$data'insert');
    }

    
/**
     * Basic UPDATE operation
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access public
     * @return object
     */
    
public function update($tableName, array $data$clause NULL)
    {
        return 
$this->_query($tableName$data'update'$clause);
    }

    
/**
     * Basic SELECT operation
     *
     * @param string $tableName
     * @param array  $data        A key-value pair with values that correspond to the fields of the table
     * @param string $clause    Clauses for creating advance queries with JOINs, WHERE conditions, and whatnot
     * @access public
     * @return object
     */
    
public function select($tableName, array $data$clause NULL)
    {
        return 
$this->_query($tableName$data'select'$clause);
    }

    
/**
     * Basic DELETE operation
     *
     * @param string $tableName
     * @param string $clause    Clauses for creating advance queries with JOINs, WHERE conditions, and whatnot
     * @access public
     * @return object
     */
    
public function delete($tableName$clause NULL)
    {
        return 
$this->_query($tableName, array(), 'delete'$clause);
    }

    
/**
     * Adds JOIN to the next SELECT operation
     *
     * @param string $tableName
     * @param string $cond
     * @access public
     * @return object
     */
    
public function join($tableName$cond)
    {
        
$this->_joins[] = array($tableName$cond);
        return 
$this;
    }

    
/**
     * Get total rows affected by previous queries
     *
     * @param int    $index
     * @return int
     */
    
public function get_total_rows($index)
    {
        if (
$index 0)
        {
            return 
$this->_total_rows[count($this->_total_rows) + $index];
        }
        return 
$this->_total_rows[$index];
    }

    
/**
     * Handles queries
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @param string $operation Defines what kind of operation we'll carry on with the database
     * @access private
     * @return object
     */
    
private function _query($tableName, array $data$operation$clause NULL)
    {
        if ( ! 
is_string($tableName))
        {
            throw new 
Exception('Argument 1 to ' __CLASS__ '::' __METHOD__ ' must be a string');
        }

        if ( ! 
in_array($operation, array('insert''update''select''delete')))
        {
            throw new 
Exception('Unkown database operation.');
        }

        
$query call_user_func_array(array(&$this'_' $operation '_query'), array($tableName, &$data));

        if ( ! empty(
$clause))
        {
            
$query .= ' WHERE ' $clause;
        }
        
//The comments can be removed for debugging purposes.
        //echo $query;
        
$stmt $this->prepare($query);
        
$this->_bind_data($stmt$data);

        if ( ! 
$stmt->execute())
        {
            
$error $stmt->errorInfo();
            throw new 
Exception('Database error ' $error[1] . ' - ' $error[2]);
        }

        
$this->_total_rows[] = $stmt->rowCount();
        return 
$stmt;
    }

    
/**
     * Generates prepared INSERT query string
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access private
     * @return string
     */
    
private function _insert_query($tableName, &$data)
    {
        
$tableFields array_keys($data);
        return 
'INSERT INTO ' $this->_prefix $tableName '
                  (`' 
implode('`, `'$tableFields) . '`)
                  VALUES (:' 
implode(', :'$tableFields) . ')';
    }

    
/**
     * Generates prepared UPDATE query string
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with keys that correspond to the fields of the table
     * @access private
     * @return string
     */
    
private function _update_query($tableName, &$data)
    {
        
$setQuery = array();
        foreach (
$data as $field => &$value)
        {
            
$setQuery[] = '`' $field '` = :' $field;
        }
        return 
'UPDATE ' $this->_prefix $tableName '
                  SET ' 
implode(', '$setQuery);
    }

    
/**
     * Generates prepared SELECT query string
     *
     * @param string $tableName
     * @param array  $data         A key-value pair with values that correspond to the fields of the table
     * @access private
     * @return string
     */
    
private function _select_query($tableName, &$data)
    {
        
$joins '';
        if ( ! empty(
$this->_joins))
        {
            foreach (
$this->_joins as $k => &$join)
            {
                
$exploded explode('='$join[1]);
                
$join_cond '`' $this->_prefix implode('`.`'explode('.'trim($exploded[0]))) . '` = `' $this->_prefix implode('`.`'explode('.'trim($exploded[1]))) . '`';   
                
$joins .= ' INNER JOIN `' $this->_prefix $join[0] . '` ON ' $join_cond;
            }
            
$this->_joins NULL;
            
$this->_joins = array();
        }
        
$fields = empty($data) ? '*' '`' implode('`, `'array_values($data)) . '`';
        return 
'SELECT ' $fields '
                  FROM `' 
$this->_prefix $tableName '`' $joins;
    }

    
/**
     * Generates prepared DELETE query string
     *
     * @param string $tableName
     * @access private
     * @return string
     */
    
private function _delete_query($tableName)
    {
        return 
'DELETE FROM `' $this->_prefix $tableName '`';
    }

    
/**
     * Binds data to the prepared statement
     *
     * @param object $stmt A PDOStatement object
     * @param array  $data A key-value pair to be bound with the statement
     * @access private
     * @return object
     */
    
private function _bind_data(&$stmt, &$data)
    {
        if ( ! empty(
$data))
        {
            foreach (
$data as $field => &$value)
            {
                
$stmt->bindParam(':' $field$value);
            }   
        }
        return 
$this;
    }
}

?>
--------------------------------------

30 Dec.

Hi,

Please be informed that the database table chibifur_adopts2.adopts_settings is missing in your database .
Please restore your complete database.

Regards,
Diwakar

--------------------------------------

It wasn't there. I re-uploaded it from one of my backups.

http://fc09.deviantart.net/fs70/f/20...sh-d5qpmur.png


---------------------------------------

Hi ,

We have checked your database but the Table 'chibifur_adopts2.adopts_settings' does not exist in it.

But /home/chibifur/public_html/classes/class_database.php script requires such a table.

Please contact your developer regarding this.


Regards,
Diwakar

---------------------------------------


We are now at the point where we may have to close down the site because of all of this and are begging for help.
Reply With Quote