我创建一个Mysql连接数组并将其传递给connect方法:
$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注意:未定义 offset:第16行的database.class.php中的3
致命错误:未捕获 异常'异常',消息'SQLSTATE [28000] [1045]访问 拒绝用户'apache'@'localhost'(使用密码:NO)'in database.class.php:20堆栈跟踪:#0 sandboxx.php(16): 在database.class.php中抛出的Database-> connect(Array)#1 {main} 第200行
答案 0 :(得分:-1)
连接数据库句柄时遇到问题。如果你创建你的 dsn首先,然后在处理程序中使用它。
$dsn = 'mysql:host='.$connection[0].';dbname='.$connection[1].'';
$dbh = new PDO($dsn, $connection[2], $connection[3]);
答案 1 :(得分:-2)
在数组中存储常量有什么意义?为什么不使用它们呢? 此外,你有非常奇怪的处理异常的方法。
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 - 这是一个谜。