在PHP中,我们需要在所有文件中包含还是有更好的方法?

时间:2017-02-08 19:19:03

标签: php mysql database pdo connection

我在根文件夹

中有一个数据库配置(db.php)

使用PDO_MYSQL的MySQL

$host = "";
$user = "";
$pass = "";
$dbname = "";
# connect to the database
$DBH = new PDO("mysql:host=$host;port=3306;dbname=$dbname", $user, $pass,array(PDO::ATTR_PERSISTENT => true));
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我想如果我需要数据库连接,我需要做

<?php
include '../../db.php';

在所有需要数据库连接的PHP文件中。

我的问题是我需要做什么&#34;包括&#34;每次我需要一个数据库连接或者有没有办法设置这个连接设置全局所以我可以在项目的任何地方调用$ DBH-&gt; prepare(SQLSTATEMENT)它将起作用。

或者有更好的方法来处理数据库连接设置吗?

1 个答案:

答案 0 :(得分:3)

简短回答:,您需要在每个使用它的页面中包含您的数据库文件。

答案很长......每次运行脚本时PHP都不会加载每个PHP文件,因此它必须知道变量/类的来源。但是,有两种方法可以不必每次都包含db文件。您可以选择自动添加文件,您可以从已经设置了db变量的另一个文件中包含您的文件,或者您可以以OO方式设置代码并包含自动加载文件。

自动前置

如果此服务器上的每个文件都需要访问数据库并且您可以访问php.ini文件,则可以在php.ini中设置auto-prepend-file选项。这将自动将文件包含在每个文件中,就像require加载一样。如果你走这条路线,确保你正在检查你的db文件是否已经加载:

您-DB-file.php

if (!defined('MYPROJECT_DB_FILE_LOADED')) {
    define('MYPROJECT_DB_FILE_LOADED', true);
    // load DBH and stuff here.
}

包含其他文件

另一个不需要你搞乱php.ini文件的好选择是以一种从父文件加载php文件的方式构造你的代码。一个很好的例子是WordPress如何处理加载其页面。 WordPress有一个主index.php文件,它检查URL并根据路径加载页面。此文件中包含的页面可以访问该文件中的变量。如何设置它的一个简单示例可能是这样的:

根目录中的

.htaccess(假设启用了mod_rewrite)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.* /index.php

这将通过您的 index.php 文件路由所有内容,其中包含以下内容:

// Do all of your DBH stuff
$DBH = ...

$url = trim($_SERVER['REQUEST_URI'], '/');
if ($url === 'some/path/here') {
    include 'other-file.php';
}

然后, other-file.php 可以访问DBH变量:

$DBH->do_something();

使用OO(面向对象)设计并包含自动加载

最常用的方法(以及最好的方法)是以OO方式构建代码并只包含自动加载文件。一个很好的例子是作曲家如何在项目中安装依赖项并生成一个vendor/autoload.php文件。

一种简单的方法是命名您的类,将它们全部放在一个目录中,然后创建一个自动加载文件(使用spl_autoload_register)。以下是一个快速(未经测试)的示例,说明如何实现这一目标:

Inside / projectroot / lib例如:

/projectroot/lib/MyDB.php

namespace MyProject;

if (!class_exists('\MyProject\MyDB')) {
    class MyDB {
        // Add some DB methods in here.
    }
}

/projectroot/lib/autoload.php

if (!defined('MYPROJECT_SPL_AUTOLOAD_REGISTERED')) {
    define('MYPROJECT_SPL_AUTOLOAD_REGISTERED', true);
    spl_autoload_register(function($class) {
        $class = explode($class, '\\');
        if (array_shift($class) === 'MyProject') {
            require __DIR__.'/'.join('/', $class);
        }
    });
}

然后,从您拥有的任何其他文件:

require '/projectroot/lib/autoload.php';

$db = new \MyProject\MyDB();

我意识到最后一个选项不会阻止你在每个文件中使用include,但是你总是包含相同的文件(所以你可以复制/粘贴),并且你的lib文件夹中正确命名的所有类都将在您需要的任何时候自动包含它,因此它不仅仅适用于您的数据库内容。