【问题标题】:php pdo prepare in a function returnsphp pdo prepare 在函数中返回
【发布时间】:2010-09-08 19:27:03
【问题描述】:

不知何故,我的执行语句说该对象没有“执行”成员。怎么了?

class EdlSqliteDb
{
const SQLITE_DRIVER = "sqlite:";

var $dbh;
var $qIndex = Array();

//
function EdlSqliteDb($dsn) 
{
    try 
    {
        $this->dbh = new PDO(self::SQLITE_DRIVER . $dsn);
    } 
    catch (PDOException $e)
    {
        echo "Error connecting: " . $e->getMessage() . ' ' . self::SQLITE_DRIVER . $dsn;
        die();
    }

    return;
}

//
function addQ($index,$q)
{
    $this->qIndex[$index] = $q;
}

//
function PrepareQ($index)
{
    try
    {
        $stmt = $this->dbh->prepare($this->qIndex[$index]);
    }
    catch (PDOException $e)
    {
        echo "Db Prepare Error: " . $e->getMessage();
        die();
    }
    return $stmt;
}

//
function DbExecutePrepared($index, $arrParameters)
{
    $stmt = $this->PrepareQ($index);
    if ($stmt->execute($arrParameters)) 
    {
        $row = $stmt->fetch();
        return $row;
    }
    else 
    {
        print "<p>dbquery(): database table update execute error</p>\n";
        die();
    }
}

}

【问题讨论】:

    标签: php pdo prepared-statement


    【解决方案1】:

    这很可能是由于准备失败。

    取决于错误处理,PDO,而不是引发异常,may just return false

    如果数据库服务器无法成功准备语句,则 PDO::prepare() 返回 FALSE 或发出 PDOException(取决于错误处理)。

    说实话,不完全确定这种行为是在哪里定义的......

    更新: here it is。默认行为是静默失败。您需要将PDO::ATTR_ERRMODE 设置为PDO::ERRMODE_EXCEPTION,以便始终触发异常。

    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    

    【讨论】:

    • 请注意:我设置了$dbh-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 并且还遇到了PDO::prepare() 正在返回false 而没有引发异常的情况。 PHP 没有定义什么时候应该出现异常或false
    • 来自 Python,PHP 中的这种默认错误沉默令我震惊。 PHP 核心开发人员可能会考虑Zen of Python 中的“错误永远不应默默传递”。
    【解决方案2】:

    添加:

    var_dump($stmt);
    

    之后:

    $stmt = $this->PrepareQ($index);
    

    可能有问题,所以 $this-&gt;PrepareQ($index); 返回 null,或者一个没有 execute 方法的对象,var_dump 变量将有助于了解该变量是什么并调试此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多