【问题标题】:Undefined offset on array but the offset exists数组上未定义的偏移量,但偏移量存在
【发布时间】:2013-05-11 22:02:02
【问题描述】:

我创建了一个 Mysql 连接数组并将其传递给连接方法:

 $database->connect(array(ROOT_DB_HOST, 
        ROOT_DB_NAME, ROOT_DB_USERNAME, ROOT_DB_PASSWORD));

当我 print_r() 连接方法中的数组时,我得到了我所期望的:

Array
(
    [0] => localhost
    [1] => dbname
    [2] => dbuser
    [3] => dbpass
)

但是,在 connect 方法中,我将数组值传递给 DSN 字符串,我收到了 0、1、2、3 上的未定义偏移量。这是 DSN 字符串:

$this->dbh = new PDO('mysql:host='. $connection[0] .';dbname=' . $connection[1],     $connection[2], $connection[3]);

所以我将值作为数组传递并将它们插入 PDO 构造函数并接收错误,我不知道发生了什么,有什么想法吗?

方法:

public function connect($connection) {
    try {
        $this->dbh = new PDO('mysql:host='. $connection[0] .';dbname=' .  $connection[1], $connection[2], $connection[3]);
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION);
        $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    } catch(PDOException $e) {
        throw new Exception($e->getMessage());
    }
}

错误:

注意:未定义的偏移量:第 16 行的 database.class.php 中的 0 注意: 未定义的偏移量:第 16 行的 database.class.php 中的 1 注意: 未定义的偏移量:第 16 行的 database.class.php 中的 2 注意:未定义 偏移量:第 16 行 database.class.php 中的 3

致命错误:未捕获 带有消息“SQLSTATE [28000] [1045] 访问的异常“异常” 拒绝用户'apache'@'localhost'(使用密码:NO)' database.class.php:20 堆栈跟踪:#0 sandboxx.php(16): Database->connect(Array) #1 {main} 在 database.class.php 中抛出 第 200 行

【问题讨论】:

  • 发布您收到的确切错误消息。
  • 能否把“connect()”方法的代码也发一下?
  • 当您使用 var_dump 数组和 var_dump $connection 时会得到什么?
  • 读取异常消息堆栈跟踪。就是说连接数据库不成功。因此返回的结果集是空的。因此错误。我的 2cc。
  • 发布构建数组的实际代码并调用connect(),如果您在顶部拥有的不是确切的实际代码...

标签: php arrays pdo offset


【解决方案1】:

您在连接数据库句柄时遇到问题。如果您先创建
dsn,然后在处理程序中使用它。

$dsn = 'mysql:host='.$connection[0].';dbname='.$connection[1].'';
$dbh = new PDO($dsn, $connection[2], $connection[3]);

【讨论】:

    【解决方案2】:

    在数组中存储 constants 有什么意义?为什么不使用它们呢?
    此外,您处理异常的方式也很奇怪。

    public function connect($connection) {
        $opt = array(
            PDO::ATTR_ERRMODE          =>  PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES => false,
        );
        $dsn = 'mysql:host='. ROOT_DB_HOST .';dbname='.ROOT_DB_NAME; 
        $this->dbh = new PDO($dsn, ROOT_DB_USERNAME, ROOT_DB_PASSWORD, $opt);
    }
    

    我个人不明白为什么 PDO 的配置如此不一致,使用了三种不同的设置 - DSN、参数和选项。
    为什么你不能只给 PDO 提供一系列设置 - 这是一个谜。

    【讨论】:

    • 我将它们放在序列化数组中并取消序列化它们,因为应用程序必须读取/写入多个远程数据库,而我只是发现代码很容易以这种方式处理。至于我对异常的处理,我总是乐于学习新的做事方式,所以你能澄清一下你的意思吗?
    • 我的意思是throw new Exception($e->getMessage()); 没有意义。
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2013-01-25
    • 2011-07-22
    相关资源
    最近更新 更多