2

私が少しクリーンアップしてデータベース関連のphpファイルを独自のフォルダーに移動することを決定するまで、私の小さなプロジェクトではすべてが正常に機能していました。その後、物事は奇妙になりました。

ここで2つの関数を使用しようとしています。

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

?>

関数の呼び出し順序を切り替えると、getBiggestMonth()は正常に実行され、もう1つは実行されません。また、すべてのファイルが同じフォルダーにある場合、これすべて正常に機能しました(関数はクラス内の静的関数でしたが、それは問題ではないはずです。同じ問題がここでも発生します)。そのため、どのように可能かわかりません。変数スコープはここでは異なる可能性があり、require_onceは他のことを処理する必要があります。ヘルプ?

4

2 に答える 2

1

これは、を使用しているためですrequire_once。構成は1回だけ含まれます。require期待どおりに機能するように、使用するように変更できます。

require_once()ステートメントはrequire()と同じですが、PHPがファイルがすでにインクルードされているかどうかをチェックし、インクルードされている場合は再度インクルード(必須)しないことを除きます。

require_once関数のスコープにファイルをプルするために使用していgetEntries()ます。requirePHPは、 dされたファイルの記録を保持するため、次に呼び出すとrequire_once、 PHPgetBiggestMonth()はすでにに含まれていることがわかりgetEntries()ます。すでに含まれているため、ファイルを再度入力する必要がないため、getBiggestMonth()スコープに変数を取得できません。

require_once変数とは何の関係もありません。現在のPHPプロセスに含まれているファイルを監視するだけです。

于 2012-03-01T21:11:25.960 に答える
1

getEntries()での戻り後のエコーステートメントは、関数が戻り後に終了するため、明らかに機能しません。

于 2012-03-01T21:15:09.780 に答える