PHP函数访问数据库连接

PHP函数访问数据库连接,php,scope,Php,Scope,如何允许函数在不使用全局变量的情况下访问数据库连接 config.php 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

如何允许函数在不使用全局变量的情况下访问数据库连接

config.php

 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));
functions.php

 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
}

有两种方法,一种是通过传递参数,另一种是使用@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);

还有更多的方法。您可以使用经典的程序样式:

function something($dbc)
或匿名函数(如果使用PHP5.3):


如@KingCrunch和其他人所说,将数据库句柄传递给您的函数,或者调用返回句柄的函数:

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;
}
require_once('config.php');

function something()
{
    $dbc = get_dbc();
    $info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}
functions.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;
}
require_once('config.php');

function something()
{
    $dbc = get_dbc();
    $info = mysqli_query($dbc, "SELECT info FROM text") or die("Error: ".mysqli_error($dbc));
}

您可能希望查看有关如何防止每次调用
get\u 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);
}

注意:始终为数据库访问建立新连接不是一个好做法。因此,始终建立一次连接,并在任何地方使用它。(但如果您的要求不同,需要多个连接,则可以建立多个连接)

他不想使用全局连接。这给了我一个错误:缺少某个()的参数1)mysqli_query()期望参数1为mysqli,null。当然,您必须以连接处理程序作为参数调用函数!让你的调试艺术得到培养,不要把这样的错误放在堆栈上。当你把数据库改成mysql、oracle或其他数据库时,你会被连接处理程序绊倒。你应该用PDO来代替。我只是展示了可能性。在这种情况下,匿名函数是可能的-他可以使用
using