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