【问题标题】:require file inside required file not working所需文件中的要求文件不起作用
【发布时间】:2013-11-29 16:32:19
【问题描述】:

我在 3 个 PHP 文件中有一些 require“链”。 index.php 需要 db_get.php,即需要 db_cred.php。它们都在同一个目录中。 这些是代码:

index.php

<?php
require 'db_get.php';
$db = getDatabase();
var_dump($db);
?>

db_get.php

<?php
require 'db_cred.php';

function getDatabase()
{
    $host = 'localhost';
    $database = $db_name;
    $username = $db_user;
    $password = $db_pass;

    $connectionString = 'mysql:host=' . $host . '; dbname=' . $database . '';
    $attributes = array(
        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 
        \PDO::ATTR_PERSISTENT => false, 
        \PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8mb4'
    );
    return new \PDO( $connectionString, $username, $password, $attributes);
}
?>

db_cred.php(此文件由另一个 PHP 文件自动生成)

<?php $db_name="testdb"; $db_user="qNOSdZ"; $db_pass="cAHk8A"; ?>

我从 index.php 得到的错误:

Notice: Undefined variable: db_name in C:\xampp\htdocs\sipil\me\db\db_get.php on line 7
Notice: Undefined variable: db_user in C:\xampp\htdocs\sipil\me\db\db_get.php on line 8
Notice: Undefined variable: db_pass in C:\xampp\htdocs\sipil\me\db\db_get.php on line 9

为什么会出现这些错误?所有这些文件都在同一个目录中.. 我可能很笨,这个问题困扰了我一段时间,请帮助。

【问题讨论】:

  • $db_name/db_user/db_pass1 在您的 getDatabase() 函数中未定义 - 它们根本没有定义,或者您忘记了 global。如果您要在 getDatabase 函数中使用 require(db_creds.php),那么一切正常。
  • 但它已经在db_cred.php中定义了。问题是,为什么db_get.php不能得到这些变量?
  • 您的问题是variable scope - http://php.net/manual/en/language.variables.scope.php。在函数外部定义的变量不能在函数内部访问,除非您将它们添加为函数参数,或者将它们定义为函数内部的全局变量,或者按照 Mark B 的建议将您的 require 'db_cred.php'; 移动到函数内部。
  • 你需要了解 PHP 变量作用域。
  • 也许global $db_name, $db_user, $db_pass 会解决它?

标签: php file require


【解决方案1】:
function getDatabase()
{

    global $db_name;
    global $db_user;
    global $db_pass;

    $host = 'localhost';
    $database = $db_name;
    $username = $db_user;
    $password = $db_pass;

    $connectionString = 'mysql:host=' . $host . '; dbname=' . $database . '';
    $attributes = array(
        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 
        \PDO::ATTR_PERSISTENT => false, 
        \PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8mb4'
    );
    return new \PDO( $connectionString, $username, $password, $attributes);
}

【讨论】:

    【解决方案2】:

    如上面cmets所说,解决办法应该是:

    <?php
    require 'db_cred.php';
    
    function getDatabase()
    {
        global $db_name, $db_user, $db_pass;
        $host = 'localhost';
        $database = $db_name;
        $username = $db_user;
        $password = $db_pass;
    
        $connectionString = 'mysql:host=' . $host . '; dbname=' . $database . '';
        $attributes = array(
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 
            \PDO::ATTR_PERSISTENT => false, 
            \PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8mb4'
        );
        return new \PDO( $connectionString, $username, $password, $attributes);
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 2018-04-05
      • 2011-02-11
      • 2021-03-23
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多