我正在尝试将PHP应用程序从MySQL迁移到SQLite,以及过去常用的一些东西,现在就停止工作了。我通过自定义数据库包装类使用PDO(该类是单例,似乎合乎逻辑地这样做)。
问题: 当尝试在预准备语句上执行查询时,它会抛出“致命错误:在非对象上调用成员函数execute()......”。
相关代码(在经过几个小时的var_dumps和try-catch之后缩小到这个范围):
连接字符串:
$this->connection = new PDO("sqlite:"._ROOT."/Storage/_sqlite/satori.sdb");
显然,这里的$ connection变量是类中的私有变量。
此处发生错误(在应该执行数据库插入的函数内):
try{
$statement = self::getInstance()->connection->prepare($sql);
}catch (PDOException $e){
print $e->getMessage;
}
try{
var_dump($statement);
$statement->execute($input);
}catch (Exception $e){
print $e->getMessage();
}
更确切地说,当我尝试使用$ statement-> execute($ input)时会发生这种情况。
任何帮助表示赞赏。感谢。
答案 0 :(得分:10)
您可能在准备语句时遇到mySQL错误,但您没有将PDO配置为throw an exception in case of an error。
<?php
$dbh = new PDO( /* your connection string */ );
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// . . .
?>
答案 1 :(得分:2)
尝试在第一个try块之外声明$ statement变量。 e.g。
$statement = null;
try{
$statement = self::getInstance()->connection->prepare($sql);
}catch (PDOException $e){
print $e->getMessage;
}
try{
var_dump($statement);
$statement->execute($input);
}catch (Exception $e){
print $e->getMessage();
}