首先让我解释一下。 我有一些全局数据库连接,并有一些简单的函数,使用每个连接并执行查询等。
因为我想要多次使用连接,并且为了节省我每次在每个函数中定义它们,我已经在文档的顶部创建了它们作为全局变量。 但是,我只是想知道,而不是必须写
global $mysql_db1, $mysql_db2, $mysql_db3, $mysql_db4, $mysql_db5;
无论如何,如果没有我每次都要复制和粘贴它,是否会发生这种情况?
我知道它的微不足道,但我只想加快自己的发展,
答案 0 :(得分:3)
我创建了一个类ConnectionManager,它存储这些连接并使用db的任何函数使用该类的实例:)
如果您不想每次都放置参数,使用Singleton也是一个好主意。
答案 1 :(得分:1)
最好的办法是以面向对象的方式声明它们,比如Singleton的属性,然后以这种方式访问它们。如果你坚持以一种让后续开发人员伤心的方式做事,你可以使用$GLOBALS
数组。全局只是一个坏的想法,我希望这个关键字可以从语言中得到启发,坦率地说。
您可以使用的非常简单的版本:
class ConnectionHolder
{
public $mysql_db1;
private static $inst;
public static &getInstance()
{
if( !self::$inst )
self::$inst = new ConnectionHolder();
return self::$inst;
}
private function __construct()
{
$this->mysql_db1 = // ... you may want another nameing convension.
// yada yada
}
}
然后,在你的职能中:
$ch =& ConnectionHolder::getInstance()
$ch->mysql_db1;
答案 2 :(得分:0)
全球通常被视为不良做法。我不会就此向你发表看法,但请查看这篇文章:http://blog.case.edu/gps10/2006/07/22/why_global_variables_in_php_is_bad_programming_practice
您可以使用$GLOBALS
超全局访问已在全局范围(docs)中定义的任何变量。因此,在您的示例代码中,只需使用$GLOBALS['mysql_db1']
就相当于使用global $mysql_db1;
行,然后使用$mysql_db1
。
我无法强调(没有指责)这是多么糟糕的计划。在你开发的整个过程中,你可能都没事,但可怜的可怜的Johnny Nextguy,如果你包含一个同样使用全局变量的第三方脚本,可能会有神的代码拯救你......并且存在变量冲突名。现在你正准备好了!
正如所建议的那样,最好将数据库功能封装在类中。如果使用静态类,则仍然具有全局变量的所有好处,没有污染范围或覆盖的危险。
这是一个示例数据库类,以及用法:
// put this in a library file or some place that all scripts include
require_once('database_class.php');
$db = new db(array(
'host'=>'localhost'
'user'=>'db_user_name'
'password'=>'db_password',
'database_name'=>'my_database'
));
// now anywhere in code you want to use it
$array = db::getRows('SELECT id, name FROM users');
$field = db::getField('SELECT name FROM users WHERE id=10');
<?php
// database_class.php
class db {
static protected $resource_link = null;
function __construct($args=false) {
if ($args===false || !is_array($args))
return false;
if (
!isset($args['host']) ||
!isset($args['user']) ||
!isset($args['password']) ||
!isset($args['database_name'])
)
return critical_error('Missing database configuration data.');
self::$resource_link = @mysql_connect($args['host'],$args['user'],$args['password']);
if (!self::$resource_link)
return critical_error('Error connecting to database 2001. MySQL said:<br>'.mysql_error());
@mysql_select_db($args['database_name'], self::$resource_link);
return;
}
// return a single-dimmension array of fields as string
static public function getFields ($sql=false, $field=false) {
$res = null;
if ($sql!==false) {
$query_obj = mysql_query($sql, self::$resource_link);
if ($query_obj) {
$res = array();
while ($this_row = mysql_fetch_array($query_obj)) {
if ($field !== false && isset($this_row[$field]))
$res[] = $this_row[$field];
else
$res[] = $this_row[0];
}
} // end :: if query object is not null
} // end :: if $sql is not false
return $res;
}
// return a single-dimmension array of fields as string with keyfield as key
static public function getKeyFields ($sql=false, $key_field='id', $list_field='id') {
$res = null;
if ($sql!==false) {
$query_obj = mysql_query($sql, self::$resource_link);
if ($query_obj) {
while ($this_row = mysql_fetch_array($query_obj)) {
if (isset($this_row[$key_field]))
$res[$this_row[$key_field]] = $this_row[$list_field];
}
} // end :: if query object is not null
} // end :: if $sql is not false
return $res;
}
// return a single field as string from the first row of results
static public function getField ($sql=false) {
$res = null;
if ($sql!==false) {
$query_obj = mysql_query($sql, self::$resource_link);
if ($query_obj) {
$this_array = mysql_fetch_array($query_obj);
if (is_array($this_array))
return $this_array[0];
} // end :: if query object is not null
} // end :: if $sql is not false
return $res;
}
// return a single row as an array
static public function getRow ($sql=false) {
$res = null;
if ($sql!==false) {
$query_obj = mysql_query($sql, self::$resource_link);
if ($query_obj)
$res = mysql_fetch_assoc($query_obj);
} // end :: if $sql is not false
return $res;
}
// return an array of rows as arrays of strings
static public function getRows ($sql=false) {
$res = null;
if ($sql!==false) {
$query_obj = mysql_query($sql, self::$resource_link);
$res = array();
if ($query_obj) {
while ($this_row = mysql_fetch_assoc($query_obj)) {
$res[] = $this_row;
}
} // end :: if query object is not null
} // end :: if $sql is not false
return $res;
}
// return an array of rows as arrays of strings, using specified field as main array keys
static public function getKeyRows ($sql=false, $key_field='id', $include_key_in_results=true) {
$res = null;
if ($sql!==false) {
$query_obj = mysql_query($sql, self::$resource_link);
if ($query_obj) {
$res = array();
while ($this_row = mysql_fetch_assoc($query_obj)) {
if (isset($this_row[$key_field])) {
$res[$this_row[$key_field]] = $this_row;
if ($include_key_in_results == false)
unset($res[$this_row[$key_field]][$key_field]);
} // end :: if checking for key field in result array
} // end :: while looping query obj
} // end :: if query object is not null
} // end :: if $sql is not false
return $res;
}
// do an update query, return true if no error occurs
static public function update ($sql=false) {
$res = false;
if ($sql!==false) {
$query_obj = mysql_query($sql, self::$resource_link);
if ($query_obj && strlen(mysql_error()) < 1)
$res = true;
}
return $res;
}
// do an insert query, return the auto increment ID (if there is one)
static public function insert ($sql=false) {
$res = null;
if ($sql !== false) {
$query_obj = mysql_query($sql, self::$resource_link);
if ($query_obj)
$res = mysql_insert_id(self::$resource_link);
}
return $res;
}
}
?>
答案 3 :(得分:0)
直接回答你的问题:不。
对你的问题的实际答案指出全局变量不是一个好主意。请注意,我认为大多数论点都是无效的,并围绕其他人说“ewww,那太棒了!”或者“你会释放魔鬼!”。
然而,他们都围绕这一个问题跳舞:如果你的程序的两个部分试图使用相同的全局变量$foo
用于不同的目的(即,意外地他们决定使用相同的名称),那么不保证会发生错误。这就是为什么建议使用不同的存储方法,例如类,因为名为Foo
的两个类肯定会导致错误。
在您的程序环境中,可能会建议您创建一个ConnectionManager
单例,您可以通过编写类似$conn1 = ConnectionManager::getConnection('conn1');
的内容来获取数据库连接。