我正在为当前项目从使用 mysql 查询行转移到 PDO,但我有一个问题。对于此任务,我不允许使用任何类(如果您问我,这是愚蠢的限制)
基本上我收到一个非对象错误,因为我的主 php 文件$DBH看不到设置的变量。我通过为每个函数设置一个全局函数来解决这个问题$DBH;所以它可以被使用,但是我被告知这是糟糕的编码实践。是这样吗?如果是这样,我怎样才能让我的函数看到我的配置变量。
配置.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'];
}
}
除了 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'];
}
}
如果在配置文件中定义了多个全局变量,则可以将它们全部包装在一个数组中,然后将其传递给需要它们的函数。 这将将它们整齐地包装到一个配置选项包中,可供任何需要它们的函数使用。
配置.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
传递给函数调用