PDO Active Record在单独的类中编写了声明

时间:2013-09-17 10:33:14

标签: php activerecord pdo

我需要连续解析几个外部stomp数据流,将相关字段插入到MySql数据库中,以及从数据库中定期查询。所有这些都在受保护的环境中 - 即我不处理Web表单或用户输入

因为我正在对来自不同表的+查询实现一系列插入,所以我决定建立一个PDO活动记录模型 - 遵循Nicholas Huot和许多SO贡献者的建议。

我有一个简单的重复插入工作正常,但经过几天的悲伤无法获得准备插入飞行。我想使用准备好的插入物,因为它们会有很多(即性能)。

代码的相关位是:

====== 数据库类:

private function __construct()
    {
        try {
            // Some extra bad whitespace removed around =
            $this->dbo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPSW, $options);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }
    }

    public static function getInstance()
    {
        if(!self::$instance)
        {
            self::$instance = new self();
        }
        return self::$instance;
    }

public function prepQuery($sql)   // prepared statements

{
    try {
        $dbo = database::getInstance();
        $stmt = new PDOStatement();
        $dbo->stmt = $this->$dbo->prepare($sql);
        var_dump($dbo);
    }
    catch (PDOException $e) {
        echo "PDO prepare failed : ".$e->getMessage();
    }
}


public function execQuery($sql)     // nb uses PDO execute
{
    try {
        $this->results = $this->dbo->execute($sql);
    }
    catch (PDOException $e) {
        echo "PDO prepared Execute failed : \n";
        var_dump(PDOException);
    }
}

====== 表类:

function storeprep() // prepares write to db.    NB prep returns PDOstatement
{
    $dbo = database::getInstance();
    $sql = $this->buildQuery('storeprep');
    $dbo->prepQuery($sql);
    return $sql;

}

function storexecute($paramstring) // finalises write to db :
{
    echo "\nExecuting with string : " . $paramstring . "\n";
    $dbo = database::getInstance();   // Second getInstance needed ?
    $dbo->execQuery(array($paramstring));
}

// table class还包括buildQuery函数,它返回$ sql字符串 - 测试好了

=======

控制器:

$dbo = database::getInstance();

$movements = new trainmovts();

$stmt = $movements->storeprep();    // set up prepared query

在这些初始步骤之后,Controller运行一个连续循环,选择存储到参数数组$ exec中所需的字段,然后调用$ movements-> storexecute($ exec);

我当前的问题是我在数据库预处理函数(由表storeprep fn调用)中收到错误消息“可捕获的致命错误:类数据库的对象无法转换为字符串”

任何人都可以就这个直接问题提出建议,后续的重复执行是否应该以这种方式发挥作用,而且我应该更广泛地改变结构中的任何内容?

1 个答案:

答案 0 :(得分:0)

我认为你的问题在这一行 $ dbo-> stmt = $ this-> $ dbo-> prepare($ sql); ,php想要将$ dbo翻译成字符串和用此名称调用函数。实际上你需要使用 $ this-> dbo

实际上你的功能不是静态的,所以我认为你不需要每次都调用getInstance,你可以使用$ this。