我有下面的代码
//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,但它仍然显示前面提到的警告和注意事项。
发布于 2017-02-20 10:32:40
当您包含一个文件时,您可以想象,在后台,它只是将代码复制粘贴到当前文档中。
你的代码有两个问题..。
$conn变量不在函数a或b中的scope中。您给出的第二段代码之所以有效,是因为它在b()中创建了一个新变量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”一次,然后将现有的连接传递到需要它的函数。
发布于 2017-02-20 10:33:30
这很简单。在页面加载时,包含连接文件,使$conn成为其余代码可用的连接对象。$conn由functiona()使用,然后在函数的末尾关闭。$conn->close();破坏数据库连接对象意味着,$conn不再是对象,因此不应将其视为对象。但是Function b()将其作为数据库连接对象处理,并导致错误。
但是,如果您再次包含连接文件,在函数b()中,则$conn作为本地对象可用于该函数。并发挥其应有的作用。
在处理DB之前,不要关闭任何函数上的$conn()。
function a() {
incDbConnectionFile();
$sql = "sql command";
$result = $conn->query($sql);
//working
$conn->close();
}
function b() {
incDbConnectionFile();
$sql = "sql command";
$result = $conn->query($sql);
//working
$conn->close();
}
function incDbConnectionFile() {
include 'dsn.php';
}https://stackoverflow.com/questions/42342036
复制相似问题