2012-03-01 2 views
2

Все отлично работало в моем маленьком проекте, пока я не решил немного почистить и переместил php-файлы, связанные с базой данных, в их собственную папку. Тогда все пошло странно.Require_once, похоже, не влияет на все функции?

Я пытаюсь использовать две функции здесь:

function getEntries() { 
    require_once("mysqliVariables.php"); 
    $mysqli = new mysqli($dbHost, $dbUname, $dbPwd, $dbName);   
    $sql = "statement..."; 
    $result = $mysqli->query($sql) or die($mysqli->error); 

    echo $dbHost; // prints host 
    return $result; 
} 

function getBiggestMonth() { 
    require_once("mysqliVariables.php"); 
    $mysqli = new mysqli($dbHost, $dbUname, $dbPwd, $dbName);   
    echo $dbHost; // prints nothing! why?  

    $sql = "statement..."; 
    $result = $mysqli->query($sql) or die($mysqli->error); // this line does not run, of course. 

    return $result; 
} 

Я использую другую функцию в другом файле (и папки) для вызова этих функций, которая начинается так:

function listTasks() {  
    require_once("db/mysqliFunctions.php"); 

    // Get entries using mysqli. 
    $tasks = getEntries(); 

    echo "<pre>"; 
    var_dump($tasks); 
    echo "</pre>"; // program works fine this far. 

    $bm = getBiggestMonth(); // program breaks somehow during this function call. 

Мои переменные в PHP-файл, как так:

<?php 
$dbHost = "host"; 
$dbUname = "username"; 
$dbPwd = "password"; 
$dbName = "databasename"; 

>

Если я переключу порядок вызова funtion, то getBiggestMonth() работает нормально, а другой - нет. Кроме того, все это отлично работало, когда все файлы находились в одной папке (функции были тогда статическими функциями внутри класса, но это не должно быть проблемой, та же проблема сохраняется здесь), поэтому я не понимаю как возможная переменная область может быть различной здесь, и require_once должен позаботиться о других вещах. Помогите?

ответ

1

Это потому, что вы используете require_once. Он будет включать конфигурацию только один раз. Вы можете изменить его, чтобы использовать require, чтобы он работал так, как вы ожидаете.

require_once() заявление идентично требовать(), за исключением PHP будет проверить, если файл уже был включен, и если да, то не включают (требуется) снова.

Вы используете require_once, чтобы вытащить файл в область функции getEntries(). PHP хранит записи файлов, которые были require d, поэтому, когда вы звоните require_once в getBiggestMonth(), он знает, что он уже включен в getEntries(). Поскольку он уже включен, он не требует повторного ввода файла, поэтому вы не получаете переменные в своей области getBiggestMonth().

require_once не имеет ничего общего с переменными, он просто контролирует файлы, которые были включены в текущий процесс PHP.

+0

Но поскольку это уже было необходимо, не нужно будет требовать его снова? Я не совсем понимаю, как $ dbHost не встречается в getBiggestMonth(), так как если переменные еще не существуют, они потребуются, и если они есть, они ничего не делают. Так оно всегда должно эхо? – hannu40k

+0

Я попытался объяснить это дальше в моем обновленном ответе выше. – Treffynnon

+0

Aha! Теперь я понимаю. Это было более понятно, чем то, как они помещали его в php.net/manual. И действительно, сейчас это работает, спасибо! – hannu40k

1

Оператор echo после возврата в getEntries() обычно работает, поскольку функция завершается после возврата.