【问题标题】:PDO Active Record prepared statement in separate classesPDO Active Record 在单独的类中准备好语句
【发布时间】:2013-09-17 10:33:14
【问题描述】:

我需要对几个外部 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 调用)中收到错误消息“可捕获的致命错误:类数据库的对象无法转换为字符串”

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

【问题讨论】:

  • This 应该解释如何在多个对象之间共享同一个 PDO 实例。

标签: php activerecord pdo


【解决方案1】:

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

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

【讨论】:

  • 谢谢 - 但这仍然不能解决它。将此行更改为 $this->dbo = $this->dbo->prepare($sql) 会导致调用未定义方法 database::prepare() 错误。删除 $dbo = database::getInstance();语句导致在非对象上调用成员函数 prepare()
  • 所有排序 - 再次感谢您的反馈。以下现在有效:$this->dbo->stmt = $this->dbo->prepare($sql);然后下面的工作作为一个相当复杂的执行语句: $this->results = $dbo->dbo->stmt->execute($sql);
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2011-07-13
  • 2017-09-29
相关资源
最近更新 更多