建立数据库连接PDO时出错

时间:2014-01-18 17:06:52

标签: php mysql database pdo

我正在使用PDO连接到MySQL

include_once('connection_insert.php');
global $host, $dbname, $user, $pass;
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$DBH->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); ///*** for error handling

function insert_terms(){
  global $DBH;
  $STH = $DBH->prepare("INSERT IGNORE INTO table
  (name,state) 
  value (?,?)");
  return $STH;
  $DBH = Null;// Closing Connection
}

但我面临错误:

  

建立数据库连接时出错

我的问题是,这是使用global $DBH;并关闭连接$DBH = Null;// Closing Connection

的正确方法吗

修改

connection_insert.php

$host = 'localhost';
$user = 'username';
$pass = 'password';
$dbname = 'db';

1 个答案:

答案 0 :(得分:2)

不,使用global变量是不好的做法(不要看Wordpress&和其他人使用全局变量)。结构(体系结构)应用程序越复杂 - 使用全局变量的后果就越可怕。你可以找到很多信息,为什么它们是邪恶的。相反它你可以使用模式Registry(例如)来访问应用程序中的“全局”变量。简而言之,有很多选择。

Сoncerning您的代码。连接($host$dbname$user$pass)的参数是否已定义?

另请参阅Global or Singleton for database connection?php.net

修改 示例:

的index.php

require_once 'Database.php';

$DB = new Dababase();
$DB->prepare("INSERT IGNORE INTO table (name,state) value (:name,:state)");
$database->bind(':name', 'NAME');
$database->bind(':state', 'STATE');
$DB->execute();

的config.php

define("DB_HOST", "localhost");
define("DB_USER", "username");
define("DB_PASS", "password");
define("DB_NAME", "database");

database.php中

require_once 'config.php'; 

class Database{
  private $host      = DB_HOST;
  private $user      = DB_USER;
  private $pass      = DB_PASS;
  private $dbname    = DB_NAME;

  private $dbh;
  private $error;
  private $stmt;

public function __construct(){
    // Set DSN
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
    // Set options
    $options = array(
        PDO::ATTR_PERSISTENT    => true,
        PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
    );
    // Create a new PDO instanace
    try{
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
    }
    // Catch any errors
    catch(PDOException $e){
        $this->error = $e->getMessage();
    }
  } 

  public function prepare($query){
    $this->stmt = $this->dbh->prepare($query);
  }  

  public function query($query){
     return $this->dbh->query($query);   
  }

  public function bind($param, $value, $type = null){
    if (is_null($type)) {
     switch (true) {
        case is_int($value):
            $type = PDO::PARAM_INT;
            break;
        case is_bool($value):
            $type = PDO::PARAM_BOOL;
            break;
        case is_null($value):
            $type = PDO::PARAM_NULL;
            break;
        default:
            $type = PDO::PARAM_STR;
      }
   }
   $this->stmt->bindValue($param, $value, $type);
   } 

   public function execute(){
     return $this->stmt->execute();
   } 

   public function execute(){
     return $this->stmt->execute();
   } 

   public function fetchRows(){
     $this->execute();
     return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
   }

  public function fetchRow(){
    $this->execute();
    return $this->stmt->fetch(PDO::FETCH_ASSOC);
  }

 }