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');
Как устроена база данных:
Я могу нормально использовать mysqli connect на других моих поддоменах/главном сайте, но я просто не могу заставить PDO работать.
Я пробовал это, что я видел вокруг:
$stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1');
Но он восстанавливает синтаксис ошибка.
У кого-нибудь есть идеи, что может быть причиной этого?
Все это работает на моем локальном сервере, при загрузке ничего не изменилось, кроме линии подключения.
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...
, и он игнорируется (потому что он отсутствует хост= также), и по умолчанию это локальный хост.
На странице руководства 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()
или вас может раскрыть ваши учетные данные для входа.