我有以下代码
//dsn.php
//Object Oriented way
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "database";
//check connection
$conn = new mysqli($servername, $username, $password, $dbname);
if($conn->connect_error) {
die("could not connect:".$conn->connect_error);
}
//index.php
include 'dsn.php';
function a() {
$sql = "sql command";
$result = $conn->query($sql);
//working
$conn->close();
}
function b() {
$sql = "sql command";
$result = $conn->query($sql);
//not working
$conn->close();
}
这将显示警告并注明:
警告:mysqli :: query():无法获取mysqli
注意:尝试获取非对象的属性
警告:mysqli :: close():无法获取mysqli
然而这个有效:
include 'dsn.php';
function a() {
$sql = "sql command";
$result = $conn->query($sql);
//working
$conn->close();
}
function b() {
include $dsn.php
$sql = "sql command";
$result = $conn->query($sql);
//working
$conn->close();
}
如何仅为DSN使用一个包含文件并在其他功能上重复使用?
修改 抱歉,我忘记提及
function a($conn) {}
function b($conn) {}
我传递了变量$ conn,但它仍然显示我上面提到的警告和通知
答案 0 :(得分:1)
当您包含文件时,您可以想象在后台只是将该代码复制粘贴到当前文档中。
您的代码有2个问题......
$conn
变量不在函数scope
或a
内的b
中。你提供的第二段代码是有效的,因为它在$conn
内部创建了一个新变量b()
,但这并不理想,因为它会在每次执行该函数时创建一个新的数据库连接
这样的事情可能适合您的需求:
include 'dsn.php';
function a($conn) {
$sql = "sql command";
$result = $conn->query($sql);
return $result;
}
function b($conn) {
$sql = "sql command";
$result = $conn->query($sql);
return $result;
}
$aResult = a($conn);
$bResult = b($conn);
$conn->close();
请注意,我们仅包含' dsn.php'一次,然后将现有连接传递给需要它的函数。