Я пишу функцию регистрации пользователя в PHP PDO, и я обнаружил, что мой запрос будет работать нормально, если он написан следующим образом:
<?php $dbHost="localhost"; $dbName="project"; $dbUser="admin"; $dbPassword="abcd"; $dbh=new PDO("mysql:host=$dbHost;dbName=$dbName", $dbUser, $dbPassword); $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $query=$dbh->prepare("INSERT INTO project.users (userName, userEmail) VALUES (?,?)"); .....
С другой стороны, он не будет работать, если я напишу:
... $query=$dbh->prepare("INSERT INTO users (userName, userEmail) VALUES (?,?)"); ...
В этом случае появляется следующее сообщение об ошибке:
Неустранимая ошибка: исключить исключение «PDOException» с сообщением «SQLSTATE [3D000]: недопустимое имя каталога: 1046 В C: \ wamp \ www \ Tests \ Test03 \ Index.php не выбрана база данных: 11 Трассировка стека: # 0 C: \ wamp \ www \ Tests \ Test03 \ Index.php (11): PDOStatement-> execute () # 1 {main}, брошенный в C: \ wamp \ www \ Tests \ Test03 \ Index.php в строке 11
Почему мне нужны точные project.users
? Почему этого недостаточно, чтобы ввести имя таблицы, учитывая, что имя db уже находится в объекте PDO?
Спасибо!
JDelage
ОБНОВЛЕНИЕ Пожалуйста, см. Принятый ответ ниже. Замена dbName=$dbName
с dbname=$dbName
решает эту проблему.
По-видимому, PDO не смог установить активную базу данных как «проект», и поэтому вам нужно указывать ее каждый раз.
Попробуйте изменить свою строку, чтобы выглядеть так:
$dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);
Единственное различие заключается в том, что dbname
записывается в нижнем регистре вместо вашего dbName
.
В качестве альтернативы выполните эту команду SQL после успешного установления соединения: USE project;
, например
$dbh->exec('USE project;');
Пытаться:
"mysql:dbName=$dbName;host=$dbHost" "mysql:dbName=$dbName;host=$dbHost;"
вместо:
"mysql:host=$dbHost;dbName=$dbName"
иногда порядок важен.