我有一个帮助文件,其中包含很多函数,但没有“main”函数。每个辅助函数都需要数据库连接。为了提高代码的可维护性,我想把保存数据库连接的变量放在全局状态(在任何函数之外),这样每个函数都可以看到它,并且可以在它们的mysql调用中使用它。这就是我的意思:
$path = $_SERVER['DOCUMENT_ROOT'];
$connection = $path . '/scripts/connection.php';
include ($connection); // this initializes the variable '$link'
function getLocation ($id) {
$sql = "SELECT name FROM Locations WHERE id=$id";
$result = mysqli_query($link, $sql);
if (!$result) { return -1; }
$row = mysqli_fetch_array($result);
mysqli_close($link);
return $row['name'];
}
function getGroupID($group_id) {
$sql = "SELECT id FROM Groups WHERE group='$group_id'";
$result = mysqli_query($link, $sql);
if (!$result) { return -1; }
$row = mysqli_fetch_array($result);
mysqli_close($link);
return $row['id'];
}
// and many other similar functions
我宁愿不把这三个全局行放在每个函数中,因为那时我不得不一遍又一遍地重复代码,但是这个方法没有全局范围。我可能会考虑将$link
变量作为参数传递,但这需要重构很多函数调用。我知道有些人对这样的全局变量不屑一顾,但在这种情况下,这是我最简单的解决方案。
顺便说一句,如果我用这个替换三个全局线:
include '../scripts/connection.php'
我的代码工作正常,但后来我失去了一些相对引用的灵活性。我不明白为什么我在这里发布的代码操作方式不同。
有没有办法可以全局声明这个$connection
变量?
谢谢。
答案 0 :(得分:1)
在您的功能中,使用:
global $connection
这会将变量从全局范围拉入到您的函数中。
或者,您可以查看一个ORM - 我个人最喜欢的是IDIORM,但是Doctrine和Propel也很好。
答案 1 :(得分:0)
把:
global $link;
在每个功能的开头。
另一种方法是定义一个打开连接并返回链接的函数或类。连接可以是函数中的静态变量;如果它已经设置,它不会重新打开连接:
function get_db_conn () {
static $link;
if ($link) {
return $link;
}
$link = mysqli_connect(...);
return $link;
}
然后您的所有其他功能都可以从以下开始:
$link = get_db_conn();