我需要连续解析几个外部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调用)中收到错误消息“可捕获的致命错误:类数据库的对象无法转换为字符串”
任何人都可以就这个直接问题提出建议,后续的重复执行是否应该以这种方式发挥作用,而且我应该更广泛地改变结构中的任何内容?
答案 0 :(得分:0)
我认为你的问题在这一行 $ dbo-> stmt = $ this-> $ dbo-> prepare($ sql); ,php想要将$ dbo翻译成字符串和用此名称调用函数。实际上你需要使用 $ this-> dbo 。
实际上你的功能不是静态的,所以我认为你不需要每次都调用getInstance,你可以使用$ this。