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

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

WBOY
풀어 주다: 2016-06-06 19:43:03
원래의
1031명이 탐색했습니다.

在构造方法中使用静态属性保存的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'");
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿