4

現在のプロジェクトでmysqlクエリ行の使用からPDOに転送していますが、問題があります。このタスクでは、クラスを使用することは許可されていません(私に言わせれば愚かな制限)

基本的に、メインのphpファイルが設定変数$ DBHを認識できなかったため、オブジェクト以外のエラーが発生していました。$ DBHグローバルで各関数を設定することで、この問題を解決しました。したがって、それを使用することはできますが、これは悪いコーディング慣行であると言われています。これは本当ですか?もしそうなら、どうすれば私の関数に私の構成変数を表示させることができますか?

Config.php

try 
{
    $DBH = new PDO("mysql:host=host;dbname=db", "username", "Password");
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}
catch (PDOException $e){
    echo $e->getMessage();
}

phpファイル

function concName($concID)
{   
        global $DBH; //THIS is the area that im told is bad practice - can this be eliminated?
        $stmt = $DBH->prepare("SELECT CONCAT(`Firstname`, ' ', `Surname`) AS 'Membername'     FROM `members` WHERE `MemberID`= :MemberID");
        $stmt->bindValue(":MemberID",$concID);
        $stmt->execute();

        while($row = $stmt->fetch())
        {
            return $row['Membername'];      
        }

}
4

1 に答える 1

3

$DBHパラメータとして、それを必要とする関数に渡すだけです。

function concName($concID, $DBH)
{   
        $stmt = $DBH->prepare("SELECT CONCAT(`Firstname`, ' ', `Surname`) AS 'Membername'     FROM `members` WHERE `MemberID`= :MemberID");
        $stmt->bindValue(":MemberID",$concID);
        $stmt->execute();

        while($row = $stmt->fetch())
        {
            return $row['Membername'];      
        }

}

キーワードの代わりにglobal、配列からアクセスすることもできます$GLOBALS[]。これは、関数で使用されたときに変数の原点についてより明確になります。ただし、これよりもパラメータを渡す方が望ましいです。

function concName($concID)
{   
        // Better than `global` keyword, use `$GLOBALS['DBH']` every time you access it in outside global scope
        // Still not preferred to passing a parameter though.
        $stmt = $GLOBALS['DBH']->prepare("SELECT CONCAT(`Firstname`, ' ', `Surname`) AS 'Membername'     FROM `members` WHERE `MemberID`= :MemberID");
        $stmt->bindValue(":MemberID",$concID);
        $stmt->execute();

        while($row = $stmt->fetch())
        {
            return $row['Membername'];      
        }

}

構成ファイルで複数のグローバルが定義されている場合は、それらすべてを配列にラップして、それらを必要とする関数に渡すことができます。これにより、それらを必要とするすべての関数で使用できる構成オプションのパッケージに整然とラップされます。

config.php

// Global array of config options
$config = array();

// various options
$config['option1'] = 'option 1';
$config['option2'] = 12345;

try 
{
    $config['DBH'] = new PDO("mysql:host=host;dbname=db", "username", "Password");
    $config['DBH']->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}
catch (PDOException $e){
    echo $e->getMessage();
}

$config次に、関数呼び出しに渡します

于 2012-05-01T02:35:02.410 に答える