Ответ 1
Вместо include "db_config.php";
вы использовали include_once "db_config.php";
.
Как я понимаю из вашего кода, каждый раз, когда вы включаете db_config.php
, вы создадите объект базы данных $DBH
.
Поскольку вы указали его как include_once
, он будет запускать только db_config.php один раз, а в классе журнала, когда вы попытаетесь его включить, он не будет запущен - поскольку он уже включен в метод добавления.
Чтобы улучшить это, вы должны создать класс, который только управляет (или инкапсулирует) объект PDO. Вы можете просто создать класс Singleton, который возвращает объект PDO, включить класс один раз вверху и извлечь объект, где бы вы ни находились в коде.
Пример:
DBAccess.php
class DBAccess extends Singleton{
// there is a getInstance() method in the Singleton abstract class
private $dbh;
// The PDO object is created only once when the first getInstance() is called in Singleton.
function __construct(){
try
{
$this->dbh = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch (PDOException $e)
{
echo $e->getMessage();
}
}
/**
* Get the PDO object
* @return object
*/
public static function getDBH(){
return self::getInstance()->dbh;
}
}
Класс журнала:
class Log
{
public static function Add($action)
{
try
{
$DBH = DBAccess::getDBH();
$ip = $_SERVER['REMOTE_ADDR'];
$time = date('Y-m-d');
$values = array($ip, $action, $time);
$STH = $DBH->prepare("INSERT INTO log (ip, action, time)
VALUES (?, ?, ?)");
$STH->execute($values);
}
catch (PDOException $e)
{
echo $e->getMessage();
}
}
}
Использование:
include_once ( 'db_config.php'); include_once ( 'mLog.php');
public static function Add($catName, $catDescr = '', $catImgURL = '', $catSubLevel = 0, $catSubID = 0)
{
try
{
$DBH = DBAccess::getDBH();
$values = array($catName, $catDescr, $catImgURL, $catSubLevel, $catSubID);
$STH = $DBH->prepare("INSERT INTO cat (catName, catDescr, catImg, catSubLevel, catSubID)
VALUES (?, ?, ?, ?, ?)");
$STH->execute($values);
$DBH = null;
Log::Add("Added category 111" . $catName);
return true;
}
catch (PDOException $e)
{
echo $e->getMessage();
}
}