another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Почему не передается переменная?

Есть 2 файла. db.php и globals.php. Один содержит в себе глобальные функции, второй параметры и экземпляр класса mysqli. Подключение к базе записывается в переменную $sql. Когда пытаюсь использовать методы mysqli(к примеру, $sql->query) оказывается, что переменная не определена. Хотя в самом начале файла с функциями файл с параметрами базы подключен(include).
Что Я делаю не так?
Код db.php:
<?php

/*
 * Constant
 */
define(DB_HOST, "127.0.0.1");
define(DB_USER, "u000_default");
define(DB_PASS, "pass");
define(DB_NAME, "u000_site_db");

$sql = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($sql->connect_errno) {
    echo "Не удалось подключиться к MySQL: (" . $sql->connect_errno . ") " . $sql->connect_error;
}

Код globals.php:
<?php
include 'db.php';

function tryQuery() {
    var_dump($sql); #Получается NULL.
    $result = $sql->query("SELECT * FROM users");
    var_dump($result); #Получается NULL.
    
    return $result;
}
  • Вопрос задан
  • 2745 просмотров
Решения вопроса 1
@kfuntov
После обновления вопроса (добавления globals.php) стало всё ясно.

Есть такая штука, как область видимости, она нужна, чтобы случайно не перетереть что-то.
Переменные внутри функции должны быть:
* Переданы в неё, в качестве аргументов
* Определнены в ней
* Объявлены, как global
Побробнее об области видимости тут www.php.net/manual/ru/language.variables.scope.php
Только не надо писать слово global, пожалуйста!!!! (Это очень плохая практика)
Лучше всего модифицировать функцию tryQuery , добавив ей $sql в качестве аргумента
function tryQuery($sql) {
    var_dump($sql); #Получается NULL.
    $result = $sql->query("SELECT * FROM users");
    var_dump($result); #Получается NULL.
    
    return $result;
}


А при вызове её - передавать в неё $sql .

Старый ответ:
Лучше ещё хотя бы начало globals и то, как ты это запускаешь.
(Пока всё выглядит нормально)
Возможно db.php не инклюдится (относительный адрес, например). Попробуй в db.php добавить
echo "HERE I AM!";
И посмотреть, будет ли надпись. Если её нет, проблема с инклюдом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
webdisigner
@webdisigner
Почему не передается переменная?
Патамушта Патамушта
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы