Проблемы с подключением к БД

268
04 ноября 2017, 13:06

Салют! Не могу понять что происходит не так с подключением к базе данных. Подключаюсь под админом.

Код подключения:

$host = 'localhost';
$db = 'forum';
$user = 'root';
$pass = '';
$charset = 'utf8';
$dsn = "mysql:host = $host; dbname = $db; charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES =>false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);
$stmt = $pdo->query('SELECT * FROM catalogs;');
while ($row = $stmt->fetch()){
echo $row['name'] . "\n";
}

После запуска, получаю ошибку:

Fatal error: Uncaught PDOException: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected in E:\nginx\html\code\bd\connect-db.php:35 Stack trace: #0 E:\nginx\html\code\bd\connect-db.php(35): PDO->query('SELECT * FROM c...') #1 {main} thrown in E:\nginx\html\code\bd\connect-db.php on line 35

Answer 1

В вашем коде SQL запрос можно как с запятой, так и без.

В строке dsn пробелы можно использовать! Только кроме секции dbname, тут нельзя пробел ни перед знаком равно, ни после. Вот так работает: "mysql: host = $host; dbname=$db; charset = $charset". Не знаю почему, могу лишь предположить, что данная строка распарсивается регуляркой или explode() и где-то косяк. Поэтому следует быть более осторожным, чтобы запариться на такой мелочи - не делайте лишние пробелы, мы не в Ворде редактируем текст.

Данный код работает, проверил на своем компе:

$host = 'localhost';
$db = 'forum';
$user = 'root';
$pass = '';
$charset = 'utf8';
$dsn = "mysql: host = $host; dbname=$db; charset = $charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);
$stmt = $pdo->query('SELECT * FROM catalogs LIMIT 20;');
while ($row = $stmt->fetch()) {
    echo $row['name'] . "<br>";
}
Answer 2

http://php.net/manual/ru/ref.pdo-mysql.connection.php

посмотрите примеры подключения Уберите лишние пробелы и, возможно, поставьте пробел после "mysql:"

READ ALSO
Что происходит, когда в БД накапливается более 100+млн записей?

Что происходит, когда в БД накапливается более 100+млн записей?

Всем приветСтало интересно, а что происходит, когда в БД (MySQL) накапливается более 100+млн записей? Они как-либо архивируются/как происходит...

229
Как можно хранить/описывать объекты

Как можно хранить/описывать объекты

Стоит задача написать некую среду для моделированияВ ней пользователю предложены какие-то готовые модельки и алгоритмы

267
Помогите придумать парсер [дубликат]

Помогите придумать парсер [дубликат]

На данный вопрос уже ответили:

294