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

问题描述 投票:0回答:1

我在根文件夹中有一个数据库配置(db.php)

MySQL与PDO_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文件中。

我的问题是,每当我需要数据库连接时,我是否需要“包含”或者是否有办法设置此连接设置全局所以我可以在项目的任何位置调用$ DBH-> prepare(SQLSTATEMENT)它将工作。

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

php mysql database pdo connection
1个回答
3
投票

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

答案很长......每次运行脚本时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();

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

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

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

例如:Inside / projectroot / lib:

/project root/礼拜/my dB.PHP

namespace MyProject;

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

/project root/礼拜/auto load.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文件夹中正确命名的任何类都会被自动包含在内任何时候你需要它,所以它将不仅仅是你的数据库的东西。

© www.soinside.com 2019 - 2024. All rights reserved.