Я пытаюсь создать новый сайт на моем хостинге (хост-маршрут, если это имеет значение), но я продолжаю получать эту ошибку, когда я пытаюсь использовать PDO (первый сайт PDO im пытается):
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 fine на других моих доменах / главном сайте, но я просто не могу заставить PDO работать.
Я пробовал это, что я видел вокруг:
$stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1');
но он перенастраивает синтаксическую ошибку.
Кто-нибудь может понять, что может быть причиной этого?
Все это работает на моем локальном сервере, ничего не изменилось при загрузке, кроме линии соединения.
Вместо:
$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...
там, и он игнорируется (потому что ему не хватает host = aswell), и по умолчанию это localhost.
На странице руководства 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). Я протестировал его и оставил его пустым, по умолчанию он будет «localhost», и поэтому я смог полностью установить его полностью для локальных соединений, что объясняет, почему оно работает на вашем локальном сервере, но не на вашем рабочем сервере. Фактически, вполне возможно подключить абсолютно ничего не поставлять в DSN, за исключением механизма базы данных:
$dbh = new PDO("mysql:", "kennyi81_gamer", "***************");
Единственная проблема заключается в том, что он не будет использовать базу данных, поэтому для использования базы данных просто выполните:
if ($dbh->query("USE kennyi81_gamersite") === false)) { // Handle the error }
Однако, с учетом сказанного, у меня есть сомнения, что вы действительно пытались подключиться, используя блок try/catch
(как вы упомянули в своих комментариях), если вы каким-то образом не предоставили действительные учетные данные базы данных. Единственный способ сделать это таким образом не kennyi81_gamersite
какой-либо ошибки, если вы действительно правильно подключили и выбрали базу данных kennyi81_gamersite
. Если нет, вы бы увидели такое сообщение:
Невозможно подключиться к базе данных. «mysql» сказал: SQLSTATE [28000] [1045] Доступ запрещен для пользователя «kennyi81_gamer» @ «localhost» (с использованием пароля: ДА)
Таким образом, всегда связывайте ваше соединение в блок try/catch
если вы хотите найти ошибки во время соединения. Просто убедитесь, что вы не перебросили (и не поймали) getMessage()
либо вы можете выставить свои учетные данные.