Я инкапсулировал свою логику подключения 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();. 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? Какая лучшая практика в этом случае?
Вторая мысль: есть ли вызов $conn->close()?






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