我有以下数据库查询工作正常,但在之前的另一个问题中,我注意到我正在使用全局,当它没有必要时。原因是我尝试使用受保护的变量但是成为OOP的新角色,却无法使其工作。
也许有人可以告诉我应该怎么做?
<?
class DB {
public function __construct() {
global $dbh;
try {
$dbh = new PDO('mysql:host=localhost;dbname=main_db', 'my_user', 'my_pass');
$dbh ->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
public function getFAQCats2Array() {
global $dbh;
try {
$q = '
SELECT
`id` AS ci,
`name` AS n
FROM
`faqcat`;
';
$s = $dbh->query($q);
// initialise an array for the results
$A = array();
while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
$A[] = $r;
}
$s = null;
return $A;
}
catch(PDOException $e) {
echo "Something went wrong fetching the list of FAQ categories from the database.\n";
file_put_contents(
$_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
"\n\n\n\n".$e->__toString(), FILE_APPEND);
}
}
public function getFAQ($i, $f) {
global $dbh;
try {
$q = '
SELECT
'.$f.'
FROM
faq
WHERE
id = ?
';
$s = $dbh->prepare($q);
$s->execute(array($i));
//$s->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$r = $s->fetch();
return $r[$f];
}
catch(PDOException $e) {
echo "Something went wrong fetching the FAQ answer from the database.\n";
file_put_contents(
$_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
"\n\n\n\n".$e->__toString(), FILE_APPEND);
}
}
}
(类中有其他函数在$dbh
中使用相同的连接字符串,但为了简单起见我删除了它们)
答案 0 :(得分:1)
您只需点击global $dbh
!
全球通常是一个非常糟糕的主意,让你的代码更难以保持。
在这种情况下,我建议使用类属性(有点全局,但仅限于此类):
class DB
{
protected $dbh;
public function __construct()
{
$this->dbh = new PDO();
}
public function query()
{
return $this->dbh->query();
}
}
我在这里剥离并简化了很多代码,但是这应该可以让你了解类属性如何工作。您还可以在PHP.net手册上阅读很多相关内容。
答案 1 :(得分:0)
请勿使用global $dbh
。
只需向数据库类中添加一个属性,例如protected $db
,然后将您的PDO实例放在$this->db
中,因为您只能在对象内部使用$db
var。这是使用某种“数据库模型”的基本方法,您可以通过网络找到大量的教程:)
例如:
public __construct($db_type = 'mysql', $host = 'my_server', $database = 'db_name', $user = 'my_user', $pwd = 'password') {
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$dsn = $db_type.':host=' . $host . ';dbname=' . $database . '';
try {
$this->db = new PDO($dsn, $user, $pwd, $pdo_options);
} catch (Exception $e) {
'Unable to connect to database';
}
}
然后在全局范围内创建对象的实例,脚本在其中使用它:
$db_manager = new DB('mysql','localhost','my_db','root','password');
然后您的$db_manager
将能够使用DB
类的公共方法
答案 2 :(得分:0)
你去.. ..
class DB {
protected $dbh;
public function __construct() {
try {
$this->dbh = new PDO('mysql:host=localhost;dbname=main_db', 'my_user', 'my_pass');
$this->dbh ->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
public function getFAQCats2Array() {
try {
$q = '
SELECT
`id` AS ci,
`name` AS n
FROM
`faqcat`;
';
$s = $this->dbh->query($q);
// initialise an array for the results
$A = array();
while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
$A[] = $r;
}
$s = null;
return $A;
}
catch(PDOException $e) {
echo "Something went wrong fetching the list of FAQ categories from the database.\n";
file_put_contents(
$_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
"\n\n\n\n".$e->__toString(), FILE_APPEND);
}
}
}