我正在使用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';
答案 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);
}
}