Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO配置文件include-global_Php_Pdo - Fatal编程技术网

PHP PDO配置文件include-global

PHP PDO配置文件include-global,php,pdo,Php,Pdo,我正在从使用mysql查询行转移到当前项目的PDO,我遇到了一个问题。 对于这个任务,我不允许使用任何类(愚蠢的限制,如果你问我) 基本上,我得到了一个非对象错误,因为我的主php文件无法看到设置变量$DBH。 我通过将每个函数设置为$DBH global解决了这个问题;所以它可以被使用,但是我被告知这是一种糟糕的编码实践。是这样吗?如果是这样的话,我怎样才能让我的函数看到我的配置变量呢 Config.php try { $DBH = new PDO("mysql:host=host;

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

基本上,我得到了一个非对象错误,因为我的主php文件无法看到设置变量$DBH。 我通过将每个函数设置为$DBH global解决了这个问题;所以它可以被使用,但是我被告知这是一种糟糕的编码实践。是这样吗?如果是这样的话,我怎样才能让我的函数看到我的配置变量呢

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

}

只需将
$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'];      
        }

}
您也可以从
$GLOBALS[]
数组访问它,而不是使用
global
关键字,该数组在函数中使用时更明确地说明变量的来源。不过,传递参数仍然比传递参数更可取

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
然后将
$config
传递给函数调用

当我尝试将其作为参数传递时,实际上会遇到相同的错误,知道为什么吗?第二个选择是可行的,但是我很明显想让传球发挥作用properly@DarkAvernus作为参数传递时是否删除了
global$DBH
?是的,我删除了global$DBH,并将函数修改为函数concName($concID,$DBH)。我还更改了调用concName($results->getMemberID(),$DBH)以反映新的变量您不是碰巧在另一个不知道
$DBH
的函数中调用`
concName()
,是吗?很好。。。我想知道为什么这个解决方案行不通。考虑到这一点,globals是执行此任务的更好方法还是将变量也传递给top函数
// 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();
}