如何允许函数访问数据库连接而不使用GLOBAL?
config。
DEFINE ('DB_HOSTNAME', 'hostname');
DEFINE ('DB_DATABASE', 'database');
DEFINE ('DB_USERNAME', 'username');
DEFINE ('DB_PASSWORD', 'password');
$dbc = mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if(!$dbc) die("Unable to connect to MySQL: " . mysqli_error($dbc));
显然也 function something()
{
$info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}
上面的代码给了我以下错误:Mysqli_query()期望参数1为mysqli,
使用函数参数
function something ($dbc) {
// your db code here
}
函数参数将数据库句柄传递给函数,就像@KingCrunch和其他人所说的那样,或者调用返回句柄的函数:
In config.php
:
function get_dbc() {
$dbc = mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if(!$dbc) die("Unable to connect to MySQL: " . mysqli_error($dbc));
return $dbc;
}
In functions.php
:
require_once('config.php');
function something()
{
$dbc = get_dbc();
$info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}
您可能希望查看mysqli扩展和持久连接,以了解如何防止每次调用get_dbc()
时重新建立连接的详细信息。还有其他方法可以做到这一点,例如为您的数据库连接创建一个单例类。
有两种方法,一种是通过传递参数,另一种是使用函数闭包,如@Ondrej所说。但是我想知道这两个都需要你修改代码,如果是这样的话,那么我建议你使用global
关键字。
可以使用global
关键字来获取变量$dbc
的作用域
试试这个. .
function something()
{
global $dbc;
$info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}
(或)
试试这个…
function something()
{
$dbc = func_get_arg(0);
$info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}
,这样做....
$query = something($dbc);
这很简单,只需将$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 something($dbc)
或匿名函数(如果使用PHP5.3):
$fn = function() using ($dbc)