JDelage
JDelage

Reputation: 13692

Write PHP PDO queries as `dbName`.`tableName` as opposed to `tableName` - why?

I'm writing a user registration function in PHP PDO, and I have found that my query will only run fine if it is written like this:

<?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 (?,?)");
.....

On the other hand, it will not run if I write:

...
$query=$dbh->prepare("INSERT INTO users (userName, userEmail) VALUES (?,?)");
...

In that case, I get the following error message:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in C:\wamp\www\Tests\Test03\Index.php:11 Stack trace: #0 C:\wamp\www\Tests\Test03\Index.php(11): PDOStatement->execute() #1 {main} thrown in C:\wamp\www\Tests\Test03\Index.php on line 11

Why is it that I need to precise project.users? Why isn't it enough to enter the table name, given that the db name itself is already in the PDO object?

Thank you!

JDelage

UPDATE Please see accepted answer below. Replacing dbName=$dbName with dbname=$dbName solves this problem.

Upvotes: 5

Views: 10746

Answers (2)

Sylwek691
Sylwek691

Reputation: 1

Try:

"mysql:dbName=$dbName;host=$dbHost"
"mysql:dbName=$dbName;host=$dbHost;"

instead of:

"mysql:host=$dbHost;dbName=$dbName"

sometimes the order is important.

Upvotes: 0

LazyOne
LazyOne

Reputation: 165501

Apparently PDO was unable to set active database to be "project" and therefore you need to specify it every time.

Try to modify your line to look like this:

$dbh=new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword);

The only difference is that dbname is spelled all lower-case instead of yours dbName.

Alternatively, execute this SQL command after successfully establishing a connection: USE project;, e.g.

$dbh->exec('USE project;');

Upvotes: 12

Related Questions