2013-05-11 3 views
-1

создать массив Mysql соединение и передать его подключения метод как таковой:Undefined смещение на массив, но смещение существует

$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()); 
    } 
} 

Ошибка:

Notice: Undefined offset: 0 in database.class.php on line 16 Notice: Undefined offset: 1 in database.class.php on line 16 Notice: Undefined offset: 2 in database.class.php on line 16 Notice: Undefined offset: 3 in database.class.php on line 16

Fatal error: Uncaught exception 'Exception' with message 'SQLSTATE[28000] [1045] Access denied for user 'apache'@'localhost' (using password: NO)' in database.class.php:20 Stack trace: #0 sandboxx.php(16): Database->connect(Array) #1 {main} thrown in database.class.php on line 200

+0

Опубликовать ** точный ** сообщение об ошибке, которое вы получили. – Jocelyn

+1

Можете ли вы также написать код метода «connect()»? – Niko

+0

Что вы получаете, когда используете массив var_dump и var_dump $ connection? –

ответ

-1

У вас есть проблема конкатенации парашюта базы данных. Если вы создали свой
dsn, сначала вы используете его в обработчике.

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

Какой смысл в хранении константы в массиве? Почему бы не использовать их уже?
Кроме того, у вас довольно странный способ обработки исключений.

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 с массивом настроек - это тайна.

+0

Я помещал их в сериализованный массив и несериализовал их, потому что приложение должно читать/записывать в несколько удаленных баз данных, и я просто нахожу код простым в обращении. Что касается моей обработки исключений, я всегда открыт для изучения новых способов ведения дел, чтобы вы могли уточнить, что вы имеете в виду? – Naterade

+1

Я имею в виду 'throw new Exception ($ e-> getMessage());' не имеет смысла. –

Смежные вопросы