4

我正在为当前项目从使用 mysql 查询行转移到 PDO,但我遇到了一个问题。对于这项任务,我不允许使用任何课程(如果你问我,这是愚蠢的限制)

基本上我得到了一个非对象错误,因为我的主 php 文件看不到设置变量 $DBH。我通过使用 $DBH 全局设置每个函数来解决这个问题;所以可以使用它,但是我被告知这是不好的编码习惯。是这样吗?如果是这样,我怎样才能让我的函数看到我的配置变量。

配置文件

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'];      
        }

}

如果您在配置文件中定义了多个全局变量,则可以将它们全部包装在一个数组中,然后将其传递给需要它们的函数。这将它们整齐地包装成一个配置选项包,可供任何需要它们的功能使用。

配置文件

// 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 回答