【问题标题】:PDO Invalid Data Source NamePDO 无效的数据源名称
【发布时间】:2018-01-21 18:12:29
【问题描述】:

我在尝试连接 config.php 中的数组时收到“无效的数据源名称”。如果我对其进行硬编码,它工作正常我在这里做错了什么?

谢谢

config.php

<?php

return [
    'database' => [
        'host' => 'mysql:host=127.0.0.1',
        'database' => 'pdo_database',
        'username' => 'root',
        'password' => '',
        'options' => [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]
    ]
];

连接.php

<?php

$config = require('config.php');
$database = $config['database'];

class Connection {
    public function make() {
        try {
            return new PDO(
                $database['host'].';dbname='.$database['database'],
                $database['username'],
                $database['password'],
                $database['options']
            );
        } catch(PDOException $e) {
            die($e->getMessage());
        }
    }
}

【问题讨论】:

  • $database 不在范围内,您需要将其传递给make 方法
  • 好的,干杯。我是 PHP 新手,作用域与带作用域的 JS 有很大不同吗?不能访问类外的变量?
  • 是的,没错。 PHP 没有任何变量范围继承——变量需要明确地传递给函数/方法。另一种方法是在函数内使用 global 关键字从全局范围导入变量,但这是您希望尽可能避免的事情。
  • PHP 中有两个作用域:全局作用域(在任何函数之外使用的变量)和局部作用域(每个函数内部的不同作用域)。它们不相交。阅读有关variable scopes 的更多信息。为了您的头脑清醒,请远离global$GLOBALS;你不会后悔的。

标签: php pdo


【解决方案1】:

问题在于make() 方法不能简单地访问全局变量。如果将$database 配置传递给make() 方法...

public function make($database) {

这会传递为这组参数创建数据库连接所需的配置。

根据您使用此类的方式,您可以将其更改为静态方法

public static function make($database) {

然后像这样使用它......

$connection = Connection::make($database);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多