奇怪的不一致,require_once的数据库连接只在一个地方不起作用

时间:2018-03-09 15:39:25

标签: php mysql mysqli

我已将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");

同样,这在项目中的每个其他位置都没有问题。这是我到目前为止所尝试的内容:

  • 我检查了我的SQL语法。我回应了我正在尝试的SQL查询并在命令行上测试它,查询工作正常。
  • 再次仔细检查我的SQL。我将工作数据库调用中的代码复制到AddItem.php。它产生相同的错误。我测试了此代码所在的原始页面,它在该位置正常工作。
  • 我检查过以确保require_once正常工作。为了确保我的相对路径正常工作,我在我预期的cwd中:

    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_onceAddItem.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()吗?在这种情况下,最佳做法是什么?

    0 个答案:

    没有答案