1

そのため、PDO :: execute()の呼び出しでこの断続的なエラーが発生します。エラーは「非オブジェクトでのメンバー関数execute()の呼び出し」です。それは私のdbクラスの117行目で発生します。これが私のクラスです。ページが正常に読み込まれ、更新すると断続的にこのエラーが返されます。

class db extends PDO {
    private $error;
    private $sql;
    private $bind;
    private $errorCallbackFunction;
    private $errorMsgFormat;

    public function __construct($dsn, $user="", $passwd="") {
        $options = array(
            PDO::ATTR_PERSISTENT => false, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try {
            parent::__construct($dsn, $user, $passwd, $options);
        } catch (PDOException $e) {
            $this->error = $e->getMessage();
        }
    }

    private function cleanup($bind) {
        if(!is_array($bind)) {
            if(!empty($bind)) {
                $bind = array($bind);
            }
            else {
                $bind = array();
            }
        }
        return $bind;
    }

    public function run($sql, $bind="") {
        $this->sql = trim($sql);
        $this->bind = $this->cleanup($bind);
        $this->error = "";

        try {
            $pdostmt = $this->prepare($this->sql);
            if($pdostmt->execute($this->bind) !== false) {
                if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql)) {
                    return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
                }
                elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql)) {
                    return $pdostmt->rowCount();
                }
            }   
        } catch (PDOException $e) {
            $this->error = $e->getMessage();    
            $this->debug();
            return false;
        }
    }

    public function select($table, $where="", $bind="", $fields="*") {
        $sql = "SELECT " . $fields . " FROM " . $table;
        if(!empty($where)) {
            $sql .= " WHERE " . $where;
        }
        $sql .= ";";

        return $this->run($sql, $bind);
    }

}   

これで、PDO :: ATTR_PERSISTENTをfalseに変更するたびに問題が解消されるため、構成呼び出しがそれ自体で実行されているという問題のように見えます。

また、エラーが表示されている私のモデルもここにあります。

class QuickView extends Model {

function getProduct($sku) {
    $bind = array(
        ":sku" => "$sku"
    );
    $result = $this->Quickview->db->select('`PRODUCTS`', 'PR_SKU = :sku', $bind, 'PR_SKU, PR_URLofImage, PR_UnitPrice, PR_Description');

    return $result;
}

}

そして、これがそれが拡張するクラスです。

class Model extends DB {
    protected $_model;

    function __construct() {

        global $inflect;

        $this->db = new DB("mysql:host=localhost;dbname=dbname", "username", "password");
        $this->_limit = PAGINATE_LIMIT;
        $this->_model = get_class($this);
        $this->_table = strtolower($this->_model)."s";
    }

    function __destruct() {
    }

}
4

1 に答える 1

2

ドキュメントを確認してください:http PDO::prepare//us1.php.net/manual/en/pdo.prepare.php

常にPDOStatementオブジェクトを返すとは限りません。クエリの処理中にエラーが発生した場合、エラー処理モードに応じてfalseが返されるか、例外がスローされます。

あなたの場合、例外をスローするように設定しようとしていますが、それはドライバーオプションではありません。これは、PDO :: setAttributeで設定されます。つまり、次のようになります。

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

これを修正すると、エラーから例外が発生します。PDO::prepareそれ以外の場合は、呼び出す前に結果を確認して修正することもできますexecute

于 2013-01-22T19:56:32.680 に答える