0

我需要对几个外部 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 类还包括 buildQuery 函数,它返回 $sql 字符串 - 测试正常

=======

控制器 :

$dbo = database::getInstance();

$movements = new trainmovts();

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

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

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

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

4

1 回答 1

0

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

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

于 2013-09-17T11:52:37.407 回答