PDO不会连接到数据库

时间:2014-11-17 16:38:20

标签: php mysql class pdo

我已经创建了一个简单的Database类来处理我的数据库连接。但它不知何故不起作用?起初它并没有使用MySQLi,所以我尝试了PDO - 它也没有工作。

但我渴望让PDO工作。我已经在StackOverflow搜索并搜索了这里,但没有运气。

这是我的班级:

class Database
{
    // Local 
    protected $_host    = "localhost";
    protected $_user    = "root";
    protected $_pass    = "root";
    protected $_database = "hs";
    protected $_connection;

    // Construct
    private function __construct()
    {
        try
        {
            $this->_connection = new PDO('mysql:host=localhost;dbname=hs', $this->_user, $this->_pass);
            $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e)
        {
            echo 'ERROR: ' . $e->getMessage();
        }
    }

    public function login($usr, $pwd)
    {
        echo "hi";
    }
}

这是执行:

if(isset($_POST['hs_login']))
{
   $db = new Database;
   $db->login($_POST['hs_username'], $_POST['hs_password']);
}

提前致谢! :)

2 个答案:

答案 0 :(得分:1)

构造函数总是公开的,所以改变就是这样:

class Database
{
    // Local 
    protected $_host    = "localhost";
    protected $_user    = "root";
    protected $_pass    = "root";
    protected $_database = "hs";
    protected $_connection;

    // Construct
    public function __construct()
    {
        try
        {
            $this->_connection = new PDO('mysql:host=localhost;dbname=hs', $this->_user, $this->_pass);
            $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e)
        {
            echo 'ERROR: ' . $e->getMessage();
        }
    }

    public function login($usr, $pwd)
    {
        echo "hi";
    }
}

此外,新数据库是一个方法调用,所以改变如下:

if(isset($_POST['hs_login']))
{
   $db = new Database;
   $db->login($_POST['hs_username'], $_POST['hs_password']);
}

答案 1 :(得分:-1)

只是想指出,在某些情况下,您可以使用私有构造函数。其中一个实际用途是使用数据库,因此它也适用于您的情况。这种设计模式称为Singleton模式,它依赖于静态方法调用。您不必实例化该类,因为实例化由类本身处理。我举了一个例子:

<?php
  class Database {
    private static $instance = null;
    private $db;
    private static $last_result;

    private function __construct() {
      try {
        $pdo_param = array(
          PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC
        );
        $this->db = new PDO("mysql:host=YOUR_HOSTNAME;dbname=YOUR_DBNAME", "YOUR_USERNAME", "YOUR_PASSWORD", $pdo_param);
      }
      catch (PDOException $e) {
        die($e->getMessage());
      }
    }

    private static function getInstance() {
      if (self::$instance == null) {
        self::$instance = new self();
      }
      return self::$instance;
    }

    public static function query($sql) {
      try {
        $instance = self::getInstance();
        $stmt = $instance->db->prepare($sql);
        $stmt->execute();
        self::$last_result = $stmt->fetchAll();
        return self::$last_result;
      }
      catch (PDOException $e) {
        die($e->getMessage());
      }
    }

    public static function prepare($sql, $params) {
      try {
        $instance = self::getInstance();
        $stmt = $instance->db->prepare($sql);
        $stmt->execute($params);
        self::$last_result = $stmt->fetchAll();
        return self::$last_result;
      }
      catch (PDOException $e) {
        die($e->getMessage());
      }
    }
  }

  $users = Database::query("SELECT * FROM users");
  $filtered_users = Database::prepare("SELECT * FROM users WHERE username = :username", array(":username" => "john_doe"));
?>
<pre><?php
  print_r($users);
  print_r($filtered_users);
?></pre>

当您想要确保在任何给定时间内只有一个类的实例时,单例设计模式非常有用。