I'm currently attempting to create my own custom database class that will allow me to do basic things such as insert, update, and select from my database. I have the code working for my insert function but it's inserting twice and I'm not sure why. It's been a while since I've messed with the singleton pattern and am having quite a few issues today. Any help would be great. Thanks
The issue method in question here is the insert()
method. It uses the db()
method to get it's instance of the database connection.
Database.php
class Database {
// Class Properties
private static $_instance;
public $pdo;
/**
* Returns a database connection
* @return resource Database Connection
*/
private static function db() {
// Return Database Connection
return Database::getInstance()->getConnection();
}
private function getConnectionProperties($property) {
return $GLOBALS['config']['database'][$property];
}
/**
* Singleton for database connection
* @return class Returns one instance of the Database class
*/
public static function getInstance() {
if(!self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* Connects to database
* @return mysql PDO connection to mysql databse
*/
public function getConnection() {
try {
//Attempt to connect
$this->pdo = new PDO('mysql:host=' . $this->getConnectionProperties('host') . ';dbname=' . $this->getConnectionProperties('database') , $this->getConnectionProperties('username'), $this->getConnectionProperties('password'));
//Return connection
return $this->pdo;
} catch (PDOException $e) {
throw new PDOException($e);
}
}
public static function insert($table, $params) {
// Define initial query
$query = "INSERT INTO `{$table}` (";
// Format rows to insert
foreach(array_keys($params) as $field) {
$fields .= $field . ",";
$bindParams .= ":" . $field . ",";
}
// Add rows and bind params to query
$query .= rtrim($fields, ',') . ") VALUES(" . rtrim($bindParams, ',') . ")";
// Prepare Query
$preparedQuery = self::db()->prepare($query);
foreach($params as $key => $value) {
$queryParams[':' . $key] = $value;
}
//Execute Query
if($preparedQuery->execute($queryParams)) {
}
}
}
Calling Database::Insert
Database::insert("test_table", [
'username' => "Joe_Scotto",
'name' => "Joe"
]);
This code does work, the only issue is that it runs twice. I think this has something to do with the class getting instantiated twice but am not sure.