2016-07-26 157 views
1

我在许多PHP文件中使用相同的代码块,有时在相同的PHP文件中(例如,当存在if/else。我知道有更好的方法,但我不太确定如何做到这一点。我想替换的东西这么大的块,但不知道什么适合。require可能?减少PHP中的重复代码

$hostname = 'localhost'; 
$database = 'dev_testing'; 
$username = 'root'; 
$password = 'XXXXXX'; 
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+12

只能连接到DB ** ONCE **。多连接没有意义,除非你需要使用不同的凭证访问数据库。因此你把它放到一个函数或单独的文件中,并且在脚本的开始处包含/需要一次。人们盲目地唾弃全局变量,但共享数据库句柄是全球范例的理想用例。 –

回答

5

答案通过@ maalls和@TahaPaksu都很好,但@ marcB的评论甚至更好:通常你只想在每个脚本执行时连接到数据库一次。我不想在dependency injection的方向上踢你,但作为一个中间解决方案,我想建议这个类,它看起来大致像一个单例,但实际上是Memoization模式实现(另请参见PHP Design Patterns其他模式示例)。

无论如何:代码:

class Database() { 

    static private $connection = null; 

    public static function getConnection() { 
    if (static::$connection === null) { 
     $hostname = 'localhost'; 
     $database = 'dev_testing'; 
     $username = 'root'; 
     $password = 'XXXXXX'; 
     $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
     $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     static::$connection = $dbh; 
    } 

    return static::$connection; 
    } 
} 

在你的脚本,你可以把它用

$dbh = Database::getConnection(); 

您可以拨打该行经常你喜欢,但它只能连接到数据库第一次需要该脚本。随后的调用将只返回相同的连接。这将为您的数据库节省相当多的开销。

+0

是的单身人士更好。 –

+1

你忘了让函数getConnection也是静态的 – DarkBee

+0

那么我的解决方案只连接数据库一次。 – maalls

3

创建一个单独的文件(例如“connection.php”),把代码它以及您需要的任何地方,在您的代码开始时包括以下内容:

require_once('connection.php'); 
+1

这可能会破坏现有代码而无需进行其他修改。 'require_once'被执行一次。如果您只是将问题中的代码片段放在一个文件中,并将其包含在某处带有'require_once'的地方,它将在调用范围中设置一个变量'$ dbh'。如果你'require_once'在下一个地方,代码将不会被执行,并且你将不会得到一个新的变量。 'require'可能是OP的直接替换,但'require_once'很可能会破坏事物,特别是如果OP在函数或类中使用它们的代码。 – GolezTrol

+0

我明确表示要把require_once放在代码的开始处...... – maalls

+0

OP说他在多个文件中有这样的代码,有时在同一个文件中有多次。如果代码需要每次执行(可能是这样,那么为什么它会在那里),那么只需将require_once放在顶部就行不通了。这只会在所有东西都是单一的全球范围内起作用,但我真诚希望这不是您的PHP脚本级别。 – GolezTrol

3

,你可以使用全局函数,你在你的PHP文件的顶部包括:

require_once("db.php"); 

文件db.php

function db_connect(){ 
    $hostname = 'localhost'; 
    $database = 'dev_testing'; 
    $username = 'root'; 
    $password = 'XXXXXX'; 
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

,并在你的文件:

$dbh = db_connect(); 
... 
// don't forget to close db before you open a new connection! 
$dbh = null; 
+0

对于这个工作,功能应该返回$ dbh – maalls

+0

是的,我忘了。对不起;) –