我正在使用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'];
}
}
答案 0 :(得分: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
传递给函数调用