PHP PDO: Не удается подключиться, неверное имя каталога


Я пытаюсь настроить новый сайт на своем хостинге (маршрут хостинга, если это имеет значение), но я продолжаю получать эту ошибку при попытке использовать PDO (первый сайт PDO, который я пытаюсь):

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in /home/kennyi81/public_html/gamersite/login.php:36 Stack trace: #0 /home/kennyi81/public_html/gamersite/login.php(36): PDOStatement->execute() #1 {main} thrown in /home/kennyi81/public_html/gamersite/login.php on line 36

Когда я использую эти настройки:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

....

$stmt = $dbh->prepare('SELECT * FROM USERS WHERE ID = :id LIMIT 1');

Как устроена база данных:

enter image description here

Я могу нормально использовать mysqli connect на других моих поддоменах/главном сайте, но я просто не могу заставить PDO работать.

Я пробовал это, что я видел вокруг:

 $stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1');

Но он восстанавливает синтаксис ошибка.

У кого-нибудь есть идеи, что может быть причиной этого?


Все это работает на моем локальном сервере, при загрузке ничего не изменилось, кроме линии подключения.

Author: Tristan Cunningham, 2013-08-29

2 answers

Вместо:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");

Попробуйте:

$dbh = new PDO("mysql:host=91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");

(добавить хост=)

И, скорее всего, он работает на вашем локальном сервере, потому что у вас есть mysql:localhost... или mysql:127.0.0.1..., и он игнорируется (потому что он отсутствует хост= также), и по умолчанию это локальный хост.

 11
Author: Michał Prajsnar, 2013-08-28 22:16:30

На странице руководства PDO вы можете видеть, что вам нужно заключить соединение в блок try/catch. Таким образом, если что-то пойдет не так с подключением, оно сообщит вам. Что-то вроде этого:

try {
    $dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";

    // Then actually do something about the error
    logError($e->getMessage(), __FILE__, __LINE__);
    emailErrorToAdmin($e->getMessage(), __FILE__, __LINE__);
    // etc.
    die(); // Comment this out if you want the script to continue execution
}

Причина, по которой вы получаете эту ошибку, заключается в том, что с вашим подключением произошла ошибка, но поскольку вы не приказываете своему сценарию остановиться, это не так. Посмотрите на полученное сообщение об ошибке, и то, как его исправить, должно быть очевидно. Похоже, что ответ Майкла Прайснара правильно в том, что вы не устанавливаете "хост".

Редактировать:

Как оказалось, PDO не жалуется, если вы оставляете свой host или dbname в части DSN подключения PDO (по крайней мере, в Unix). Я протестировал его и оставил его пустым, по умолчанию он будет "локальным хостом", и поэтому я смог подключиться совершенно нормально, оставив это полностью для подключений к локальному хосту, что объяснило бы, почему он работал на вашем локальном сервере, но не на вашем рабочем сервере. На самом деле, вполне возможно подключиться, не поставляя абсолютно ничего в DSN, кроме ядра базы данных, например:

$dbh = new PDO("mysql:", "kennyi81_gamer", "***************");

Единственная проблема заключается в том, что он не будет использовать базу данных, поэтому, чтобы ИСПОЛЬЗОВАТЬ базу данных, просто сделайте:

if ($dbh->query("USE kennyi81_gamersite") === false)) {
     // Handle the error
}

Однако с учетом сказанного, У меня есть сомнения , что вы действительно пытались подключиться с помощью блока try/catch (как вы упомянули в своих комментариях), если вы каким-то образом не предоставили действительные учетные данные базы данных. Единственный способ, которым это делалось таким образом, не приводил ни к каким своего рода ошибка, если вы действительно правильно подключились и выбрали базу данных kennyi81_gamersite. Если бы это было не так, вы бы увидели такое сообщение:

Не удается подключиться к базе данных. "mysql" сказал: SQLSTATE[28000] [1045] Доступ запрещен для пользователя 'kennyi81_gamer_ @'localhost' (используя пароль: ДА)

Таким образом, всегда заключайте ваше соединение в блок try/catch, если вы хотите найти ошибки во время подключения. Просто убедитесь, что вы не бросаете повторно (и не ловите) PDOException getMessage() или вас может раскрыть ваши учетные данные для входа.

 1
Author: Mike, 2013-08-29 02:40:20