我已将MySQLi连接逻辑封装在名为connect_mysqli.php
的脚本中。这在我的项目中工作得很好(其他9个页面没有问题),但是有一页正在返回此错误:
Warning: mysqli::query(): Couldn't fetch mysqli in C:\xampp\htdocs\projectName\php_calls\AddItem.php on line 193
以下是AddItem.php
中无法使用的代码:
$sql = <<<HEREDOC
UPDATE listing_data
SET ebay_id = '$responseObj->ItemID'
WHERE listing_id = '$database_listing_id'
HEREDOC;
require_once(__DIR__ . '/connect_mysqli.php'); //this creates $conn
$conn->query($sql); //this is line 193
这是来自connect_mysqli.php
的代码:
<?php
$servername = "localhost";
$username = "root";
$password = "root";
$db = "db";
// Create connection
$conn = new mysqli($servername, $username, $password, $db);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$conn->set_charset("utf8");
同样,这在项目中的每个其他位置都没有问题。这是我到目前为止所尝试的内容:
AddItem.php
。它产生相同的错误。我测试了此代码所在的原始页面,它在该位置正常工作。
echo require_once(__DIR__ . '/connect_mysqli.php');
它产生了:
C:\xampp\htdocs\projectName\php_calls/connect_mysqli.php
这是预期的。我打开了Windows Power Shell并运行:
cat C:\xampp\htdocs\projectName\php_calls/connect_mysqli.php
这会显示connect_mysqli.php
内的代码!我开始猜测我的require_once存在缺陷。
var_dump(get_defined_vars());
只有一个$conn
。
$conn->close();
关闭连接。如果它在没有我指示的情况下关闭,我不知道如何或为什么。
connect_mysqli.php
复制并粘贴到AddItem.php
,错误就消失了。所以我的{{ 1}}必须弄乱我的联系。 require_once
和AddItem.php
位于同一文件夹中。我尝试使用此行连接:
connect_mysqli.php
我仍然收到错误。
对于这个令人难以置信的冗长问题感到抱歉,在创建关于该主题的另一个问题之前,我想做我的研究并尝试一切。现在我可以将数据库连接代码复制到require_once('connect_mysqli.php');
作为一种解决方法,但这是不好的做法,显然有一些重要的原则让我逃避,我想了解。
修改:更多信息
Nico Haase提出了让我走上正轨的问题。 AddItem
的第1行是require_once:
AddItem.php
和require_once(__DIR__ . '\return_item_php_obj_by_id.php');
内部我们有罪魁祸首:
return_item_php_obj_by_id.php
在原帖中,我说“任何地方都没有隐藏require_once(__DIR__ . '/connect_mysqli.php');
//edited out irrelevant code
mysqli_close($conn);
”。显然我错了。我找到了隐藏的close()。当我评论这个时,连接工作。现在我不小心让我的代码很难读,我不想使用远在堆栈上的数据库连接。我应该打开连接,以便我可以再次使用$conn->close()
吗?在这种情况下,最佳做法是什么?