2012-11-01 31 views
1

我正在重新使用我所有的mysql_ *和mysqli连接来使用PDO,但我似乎甚至无法获得正确的基础知识。我有两个文件:一个创建连接并返回它,另一个利用连接来达到我认为必要的目的。但是,由于某些原因,我无法使连接正确返回以便利用。如果我运行任何PDO功能(查询,准备等),我得到的服务器响应为500,没有错误消息。不过,我知道,如果我创建连接并在同一个函数中查询所有内容,那么所有内容都是hunky-dory。我假设这是简单的,所以也许新鲜的眼睛可以帮助我。Cross-Class PDO无法执行

db_connect.php(形成连接):

class db_connect { 

    function __construct() {}  
    function __destruct() {} 

    public function connect() { 
     require_once 'db_info.php'; 
     try{ 
      $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USER, DB_PASSWORD); 
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     } catch (PDOException $e) { 
      echo 'Connection Failed: ' . $e->getMessage(); 
     } 
     return $dbh; 
    } 

    public function close() { 
     $dbh = null; 
    } 
} 

operations.php(使用连接):

class operations { 

    private $dbh;  

    function __construct() { 
     require_once 'db_connect.php'; 
     $this->dbh = new db_connect(); 
     $this->dbh->connect(); 
    } 

    function runQuery() { 
     // causes 500 error, no logs: 
     $stmt = $dbh->query("SELECT * FROM myTable"); 
    } 
} 

我搜索周围的一些答案,但没有我找到的解决方案为我工作。预先感谢您的帮助。

+0

$ dbh-> query'是不是'$ this-> dbh-> query'?以便它引用您在操作类中创建的对象。同样在你的'db_connect'类上'close'函数不会做任何事情.. – dakdad

+0

@dakdad我试过了,还是什么都没有。我真的只是试验和错误,这一点。问题是,我没有错误。 – burmat

回答

3

您正在有效地扔掉您的PDO对象。当您拨打:

$this->dbh = new db_connect(); 
// $this->dbh is a db_connect 

$this->dbh->connect(); 
// returns a PDO, which you don't save anywhere 

再后来你尝试这样做:

$stmt = $dbh->query("SELECT * FROM myTable"); 
// $dbh doesn't even exist 
// You meant $this->dbh, but that won't work either 
// $this->dbh is a db_connect object, which does not implement the query() method 

我想你的意思做的是PDO对象保存为db_connect的一部分,然后用它来查询:

class db_connect { 

    public $connection; 

    function __construct() {}  
    function __destruct() {} 

    public function connect() { 
     require_once 'db_info.php'; 
     try { 
      $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USER, DB_PASSWORD); 
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     } catch (PDOException $e) { 
      echo 'Connection Failed: ' . $e->getMessage(); 
     } 
     $this->connection = $dbh; 
     return $dbh; 
    } 

    public function close() { 
     $this->connection = null; 
    } 
} 

class operations { 

    private $dbh;  

    function __construct() { 
     require_once 'db_connect.php'; 
     $this->dbh = new db_connect(); 
     $this->dbh->connect(); 
    } 

    function runQuery() { 
     $stmt = $this->dbh->connection->query("SELECT * FROM myTable"); 
    } 
} 

最后,如果你只是使用db_connect类来生成一个PDO连接,那么你应该把连接()到一个静态方法,只是保存PDO对象(如@dakdad提到)。在这里,我也动了你的require_once到一个更合理的位置:

---------- db_connect.php ---------- 

require_once "db_info.php"; 

class db_connect { 
    public static function connect() { 
     $dbh = null; 
     try { 
      $dbh = new PDO('pgsql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USER, DB_PASSWORD); 
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     } catch (PDOException $e) { 
      echo 'Connection Failed: ' . $e->getMessage(); 
     } 
     return $dbh; 
    } 
} 

---------- operations.php ---------- 

require_once "db_connect.php" 

class operations { 

    private $dbh;  

    function __construct() { 
     $this->dbh = db_connect::connect(); 
    } 

    function runQuery() { 
     $stmt = $this->dbh->query("SELECT * FROM words limit 2"); 
     print_r($stmt->fetchAll()) ; 
    } 
} 
+0

这会解释我的问题,但我假设'$ this-> dbh-> connection()'运行连接函数,返回连接并将其保存到$ dbh。这就是我至少为'mysql_ *'所做的。你能否编辑你的答案来展示我如何“保存”(如你所说)我的PDO连接? – burmat

+0

谢谢你扩展你的答案,但它似乎与你的代码完全一样。 – burmat

+2

修复了runQuery()中的一个错误。它应该引用'$ this-> dbh'而不是'$ dbh'。另外,你应该考虑将你的'require_once'语句移动到你的类定义之外的地方。通常放置它们的地方是靠近PHP文件的顶部。 – slashingweapon

2

operations类应存放PDO对象,而不是db_connect类。

class operations { 

    private $dbh;  

    function __construct() { 
     require_once 'db_connect.php'; 
     $db = new db_connect(); 
     $this->dbh = $db->connect(); 
    } 

    function runQuery() { 
     $stmt = $this->dbh->query("SELECT * FROM myTable"); 
    } 
} 

与@slashingweapon的答案类似,只是另一种方式。

+0

太棒了!感谢您的帮助 – burmat