Странная несогласованность, соединение с базой данных от require_once не работает только в одном месте

Я инкапсулировал свою логику подключения 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.

  • The connection is not being closed with $conn->close();. If it's closing without my instruction I don't know how or why.

  • Я скопировал и вставил код из connect_mysqli.php в AddItem.php и ошибка уходит.. Так что каким-то образом мой require_once должен портить мое соединение. AddItem.php и connect_mysqli.php находятся в одной папке. Вместо этого я попытался подключиться к этой строке:
    require_once('connect_mysqli.php');
    

    Я по-прежнему получаю сообщение об ошибке.

  • Извините за невероятно длинный вопрос, я хотел провести свое исследование и попробовать все, прежде чем создавать еще один вопрос по теме. На данный момент я могу скопировать код подключения к базе данных в AddItem в качестве обходного пути, но это плохая практика, и здесь явно ускользает какой-то важный принцип, который я хотел бы понять.

    Редактировать: подробнее

    Нико Хаазе задал мне вопрос, который направил меня на верный путь. Строка 1 AddItem.php - это require_once:

    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);
    

    В исходном посте я сказал: «$conn->close() нигде не прячется». Очевидно, я ошибался. Я нашел скрытое закрытие (). Когда я это комментирую, связь работает. Я случайно сделал свой код очень трудным для чтения, и я не хочу использовать соединение с базой данных, которое находится далеко в стеке. Должен ли я оставить соединение открытым, чтобы снова использовать его с AddItem.php? Какая лучшая практика в этом случае?

    Возможно, в вашем файле есть вторая строка require_once(__DIR__ . '/connect_mysqli.php')? Как видно из названия, он включается только один раз. И если такие включения происходят в разных областях, $conn может быть недоступен.

    Nico Haase 09.03.2018 16:55

    Вторая мысль: есть ли вызов $conn->close()?

    Nico Haase 09.03.2018 16:55
    Стоит ли изучать PHP в 2026-2027 годах?
    Стоит ли изучать PHP в 2026-2027 годах?
    Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
    Symfony Station Communiqué - 7 июля 2023 г
    Symfony Station Communiqué - 7 июля 2023 г
    Это коммюнике первоначально появилось на Symfony Station .
    Оживление вашего приложения Laravel: Понимание режима обслуживания
    Оживление вашего приложения Laravel: Понимание режима обслуживания
    Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
    Установка и настройка Nginx и PHP на Ubuntu-сервере
    Установка и настройка Nginx и PHP на Ubuntu-сервере
    В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
    Коллекции в Laravel более простым способом
    Коллекции в Laravel более простым способом
    Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
    Как установить PHP на Mac
    Как установить PHP на Mac
    PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
    2
    2
    38
    0

    Другие вопросы по теме