让其他函数访问数据库连接函数中的$conn变量
所以在这里,我绝对不顾一切地想要做点什么。我知道我要做的不是面向对象,也不是100%的最佳实践。这不是一个实时的网站,我只是学习一些基本的PHP概念在XAMPP。
我想做的是是使$conn变量在我的数据库连接函数访问到需要它的所有其他函数。我想传递它作为一个参数,,但如何做到这一点?我不喜欢使用PHP的"global"或$GLOBALS。我现在的工作方法是使用程序方法使用mysqli。
例如:
function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}
function someFunction () {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
我一直没有找到我问题的答案……我最近熟悉的大多数解决方案都是基于面向对象的,或者使用了一些有问题的方法。
<>------------------------------------------------------------------------------------------------------------------------------------
解决方案A -我宁愿避免将连接放在包装器中并使用全局变量:
global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
解决方案B -我还没有准备好面向对象,但我知道这是有效的。关键是我想学一些不一样的东西:
class Database
{
private static $conn;
public static function getObject()
{
if (!self::$conn)
self::$conn = new mysqli("localhost", "root", "", "database");
return self::$conn;
}
}
function someFunction () {
$result = mysqli_query (Database::$conn, "SELECT * FROM examples)
}
解决方案C -根本不使用函数…只是让它打开,我觉得从长远来看不是很实用:
$conn = mysqli_connect ("localhost", "root", "", "database");
$result = mysqli_query ($conn, "SELECT * FROM examples)
<>------------------------------------------------------------------------------------------------------------------------------------
我正在努力实现的解决方案:
function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
return $conn;
}
function someFunction () {
$conn = db ();
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
或类似的东西,我只是传递连接作为一个参数或其他东西(目前是伪代码)
function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}
function someFunction ($conn) {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
<>------------------------------------------------------------------------------------------------------------------------------------
那么我如何实现像最后两个,但实际上是有效的。这个概念可行吗?
你想要的解决方案:这应该可以工作,你只需要建立一个连接。
function db () {
static $conn;
if ($conn===NULL){
$conn = mysqli_connect ("localhost", "root", "", "database");
}
return $conn;
}
function someFunction () {
$conn = db();
$result = mysqli_query ($conn, "SELECT * FROM examples);
}
如果您使用function someFunction($conn)
,这会使您的代码更加混乱,因为您实际上无法从任何地方通用访问$conn
。
你应该用方案B。这样,您就可以简单地访问它Database::$conn
,这将在整个脚本中保持一致。您可以应该有一个initialize
函数(您可以使用不同的名称,如果您想),将初始化Database::$conn
,然后您可以使用它来初始化Database
类上的其他东西,如果需要的话。
解决方案A很糟糕。我做了很长一段时间(global
化的东西),这是一个可怕的想法。我不该那么做的。但我做到了。我学会了。它只会让代码变得越来越潦草。
解决方案B: Database::$conn
应该是public
,如果你想能够从任何地方通过Database::$conn
访问它。如果它是私有的,那么您总是需要调用Database::getObject();
方案C:你说得对。那太不切实际了。
解B重写:
class Database
{
/** TRUE if static variables have been initialized. FALSE otherwise
*/
private static $init = FALSE;
/** The mysqli connection object
*/
public static $conn;
/** initializes the static class variables. Only runs initialization once.
* does not return anything.
*/
public static function initialize()
{
if (self::$init===TRUE)return;
self::$init = TRUE;
self::$conn = new mysqli("localhost", "root", "", "database");
}
}
然后……在Database::initialize()
被使用之前至少调用一次。
<?php
Database::initialize();
$result = mysqli_query (Database::$conn, "SELECT * FROM examples);
?>
编辑
- 您还可以在该PHP文件中,在类声明之后立即调用
Database::initialize()
。然后处理初始化。 我现在更喜欢像
Database::getDb()
这样的东西,而不是直接访问$conn
属性。然后可以从getDb()
函数调用initialize
。基本上类似于期望的解决方案,但在一个类中。这个类真的不是必需的,但如果你像我一样喜欢类,它会很好。本节中的所有答案都是多余的,因为它们只是通过在数据库对象周围创建包装器来增加开销。为了分离关注点(可维护性),为数据库连接使用单独的PHP文件,并使用require_once。
内部Database_Connect.php//
$db = mysqi_connect(localhost, database, password);
现在在mysqli_函数中使用$GLOBALS['db']。
或者,将脚本/对象初始化为
$dbConn = $GLOBALS['db'];
并在mysqli_函数中使用$dbConn。
简单的答案只是传递你的$conn
变量到另一个调用函数(而不是建立新的连接)
yourpage.php
$conn = new mysqli($servername, $username, $password, $dbname);
someFunction ($conn)//you can add other parameters if you like
function someFunction ($conn) {
$result = mysqli_query ($conn, "SELECT * FROM examples);
}
注意:总是为数据库访问建立新连接不是一个好做法。所以,每次都要建立联系,并在任何地方使用它。(但如果你的需求不同,需要多个连接,那么你可以创建多个连接)
向函数传递一个参数并返回连接
function db($conn){
$conn = mysqli_connect ("localhost", "root", "", "database");
return $conn;
}
如果您有多个php文件需要db访问,那么您可以使用连接代码
创建一个文件connection.php<?php
$conn = mysqli_connect ("localhost", "root", "", "database");
?>
include_once 'connection.php';
。