Mysql - PDO 错误 - 目录名称无效:1046 未选择数据库

问题描述 投票:0回答:9

我对 PDO 有意见,我绝对看不到他的来历。我不能质疑我的 MySQL 数据库。只是为了测试我使用了以下代码(之前配置连接参数非常糟糕:

$dbh= new PDO('mysql:host=serverName;dbname=Mydatabase','user','password');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

var_dump($dbh);    // gives : object(PDO)#1 (0) { }

$res=$dbh->query('SELECT * FROM table');

与 MySQL 正确建立连接,但查询后出现此错误:

致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[3D000]:目录名称无效:1046 未在 /home/outout/public_html/file.php:16 中选择数据库”堆栈跟踪:#0 /home/outout/public_html /file.php(16): PDO->query('select * from t...') #1 {main} throw in /home/outout/public_html/file.php on line 16.

代码可以在本地机器上运行,但是一旦我把它放到网上(cPanel),它就会显示这个错误。我必须在 .htaccess 中配置 PDO 吗?

我完全不明白问题出在哪里。有人会有想法吗?

php mysql pdo
9个回答
15
投票

你犯了一些错误或打字错误。确保数据库存在于您要连接到的服务器上,并像这样在DSN中正确设置

dbname=Mydatabase;

没有空格或其他符号。字符大小写也很重要。

$dbh = new PDO('mysql:host=serverName;dbname=Mydatabase;charset=utf8mb4','user','pass');

应该工作


5
投票

我遇到了同样的问题,但没有提到带有“mysql”(mysql:host)的“主机”字符串。我通过以下代码解决了这个问题。

$dsn="mysql:host=localhost;dbname=dbname";
$pdo = new PDO($dsn,"root","");

3
投票

代替:

$res=$dbh->query('SELECT * FROM table');

只是做:

  $res=$dbh->query('SELECT * FROM dbname.tablename');

你会很高兴的。


3
投票

我遇到了同样的问题。问题的解决方案删除了主机名和 dbname 变量之间的空格,如下所示: 从: $conn = new PDO("mysql:host = $servername;dbname = $dbname", $username, $password);

收件人: $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);


0
投票
$dbh= new PDO('mysql:host=serverName;dbname=Mydatabase','user','password');

这里是错误的。你不能有 host=serverName,相反你需要有类似 host=$serverName 的东西,然后是 $serverName = "servername.domanin";与 dbname=Mydatabase 相同,您需要创建这些变量 $Mydatabase="mydatabase" 它应该如下所示:

$servername = "servername";
$username = "username";
$password = "password";
$dbname = "dbname";

    try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "Connection ok!";
    } catch (PDOException $e) {
    echo "Err: " . $e->getMessage();
    }

    $conn = null;

这会起作用。 有关更多详细信息:http://www.w3schools.com/php/php_mysql_connect.asp

我有同样的错误,这是因为我没有在字符串中使用 dbname=$dbname,而是使用了 $dbname=$dbname,这只是一个拼写错误。您需要正确编写字符串!


0
投票

让我失望的是,我从 MySQL Workbench 的树中复制了数据库名称并将其粘贴到 settings.php 文件中。 原来字符串开头和结尾的撇号是假撇号!我删除了它们并放入了真正的撇号,一切都立即启动了。我花了几个小时才弄明白这一点。 希望这可以帮助别人。


0
投票

使用关键字相同的数据库名称不要更改它们

public function conect(){
        $this->conn = null;
        
        try {

       $this->conn = new PDO('mysql:host='.$this->host.';dbname='.$this->db_name, $this->username, $this->password);
     //    $this->conn = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->db_name, $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
        echo 'Connection Error: ' . $e->getMessage();
      }
        return $this->conn;

    }

-1
投票

面对同样问题的人,如果你在 dbname 之前输入端口,在 dsn 中,它会给出同样的错误

所以更换

$dsn = "mysql:host=$this->host;port:$this->port;dbname=$this->db;charset=UTF8;";

$dsn = "mysql:host=$this->host;dbname=$this->db;port:$this->port;charset=UTF8;";

注意portdbname

的顺序

-2
投票

使用

$database -> query(' SELECT * FROM "database_name"."table_name" ');

代替

$database -> query(' SELECT * FROM "table_name" ');
© www.soinside.com 2019 - 2024. All rights reserved.