Rumah >php教程 >php手册 >在构造方法中使用静态属性保留的PDO资源句柄在其他方法中无法调

在构造方法中使用静态属性保留的PDO资源句柄在其他方法中无法调

WBOY
WBOYasal
2016-06-06 19:43:031038semak imbas

在构造方法中使用静态属性保存的PDO资源句柄在其他方法中无法调用??? ?php classDB{ protected$link='127.0.0.1'; protected$dbname='think'; staticpublic$DB; privatefunction__construct(){ try{ self::$DB=newPDO("mysql:host={$this-link};dbname={$t

在构造方法中使用静态属性保存的PDO资源句柄在其他方法中无法调用???
<?php<br />
<br />
class DB{<br />
    protected $link = '127.0.0.1';<br />
    protected $dbname = 'think';<br />
    static public $DB;<br />
    private function __construct(){<br />
        try{<br />
            self::$DB = new PDO("mysql:host={$this->link};dbname={$this->dbname}",'root','root');<br />
        }catch (PDOException $e){<br />
            die("连接出错:".$e->getMessage());<br />
        }<br />
<br />
        $sql = ' SELECT * FROM user WHERE id=? and username=? and email=? ';<br />
        $stmt = self::$DB->prepare($sql);<br />
        $stmt->execute([0=>'13',1=>'12',2=>'12']);<br />
        echo '<pre class="brush:php;toolbar:false">';<br />
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC));<br />
        echo $stmt->rowCount();<br />
    }<br />
    //静态方法,单例统一访问入口<br />
    static public function getInstance() {<br />
        if (is_null ( self::$DB ) || isset ( self::$DB )) {<br />
            self::$DB = new self ();<br />
        }<br />
        return self::$DB;<br />
    }<br />
    public function Test(){<br />
         $sql = ' SELECT * FROM user WHERE id=? and【本文来自鸿网互联 (http://www.68idc.cn)】 username=? and email=? ';<br />
         $stmt = self::$DB->prepare($sql);<br />
         $stmt->execute([0=>'13',1=>'12',2=>'12']);<br />
         echo '<pre class="brush:php;toolbar:false">';<br />
         print_r($stmt->fetchAll(PDO::FETCH_ASSOC));<br />
         echo $stmt->rowCount();<br />
    }<br />
}<br />
$db = DB::getInstance();<br />
$db->Test();

我把Test方法复制在构造方法没有问题,为什么在Test方法中会出现Call to undefined method DB::prepare()???
求各位大神了
------解决思路----------------------
你至少应写作
class DB{<br />
    protected $link = '127.0.0.1';<br />
    protected $dbname = 'think';<br />
    static public $DB;<br />
    static public $_DB;<br />
    private function __construct(){<br />
        try{<br />
            self::$_DB = new PDO("mysql:host={$this->link};dbname={$this->dbname}",'root','root');<br />
        }catch (PDOException $e){<br />
            die("连接出错:".$e->getMessage());<br />
        }<br />
    }<br />
    //静态方法,单例统一访问入口<br />
    static public function getInstance() {<br />
        if (is_null ( self::$DB ) <br><font color='#FF8000'>------解决思路----------------------</font><br> isset ( self::$DB )) {<br />
            self::$DB = new self ();<br />
        }<br />
        return self::$DB;<br />
    }<br />
    public function Test(){<br />
         $sql = ' SELECT * FROM user WHERE id=? and username=? and email=? ';<br />
         $stmt = self::$_DB->prepare($sql);<br />
         $stmt->execute([0=>'13',1=>'12',2=>'12']);<br />
         echo '<pre class="brush:php;toolbar:false">';<br />
         print_r($stmt->fetchAll(PDO::FETCH_ASSOC));<br />
         echo $stmt->rowCount();<br />
    }<br />
}<br />
$db = DB::getInstance();<br />
$db->Test();
PDO 本身已经封装的很好了,如确需要进一步封装以简化调用代码
那么应该从 PDO 继承一个 DB 类,如
class DB extends PDO {<br />
  private static $_Instance;<br />
  function __construct() {<br />
	$options = array(<br />
		PDO::MYSQL_ATTR_INIT_COMMAND => "set names gbk",<br />
		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,<br />
		PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,<br />
		);<br />
<br />
    parent::__construct('mysql:dbname=test', 'root', '', $options);<br />
  }<br />
  //执行各种 sql 指令,并可通过参数 $param 进行扩展<br />
  function query($sql, $param=null) {<br />
	$res = [];<br />
	try {<br />
		$rs = parent::query($sql);<br />
		do {<br />
			if($t = $rs->fetchall()) $res[] = $t;<br />
		}while($rs->nextRowset());<br />
		return $res;<br />
	} catch (PDOException $e) {<br />
		die( "Error!: " . $e->getMessage() . "\n" );<br />
		//  die();<br />
	}<br />
  }<br />
  //查询并返回单条记录<br />
  static function fetch($sql) {<br />
	if(! self::$_Instance) self::$_Instance = new self;<br />
	return self::$_Instance->query($sql)[0][0];//->fetch();<br />
  }<br />
  //查询并以数组方式返回多条记录<br />
  static function fetchall($sql) {<br />
	if(! self::$_Instance) self::$_Instance = new self;<br />
	$res = self::$_Instance->query($sql);//->fetchall();<br />
	if(count($res) == 1) return current($res);<br />
  }<br />
}<br />
这样你就有机会这样使用了
$r = DB::fetch("select * from user where name='my'");
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn