【问题标题】:Mysql - PDO Error - Invalid catalog name: 1046 No database selectedMysql - PDO 错误 - 目录名称无效:1046 未选择数据库
【发布时间】:2015-04-29 13:27:46
【问题描述】:

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

try {
    $dbh= new PDO('mysql:host=serverName;dbname=Mydatabase','user','password');
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (Exception $e) {
    die('Erreur : ' . $e->getMessage());
}

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} 在第 16 行的 /home/outout/public_html/file.php 中抛出。

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

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

【问题讨论】:

  • 错误很明显:No database selected!!所以验证你的数据库的名称。
  • 我验证了我的数据库的名称,我发现它是正确的,谢谢
  • 不知道您的 CPanel 主机上的 MySQL 主机和数据库名称是什么以及它们是否与您的 DSN 中的参数匹配(PDO 构造函数的第一个参数),这是不可能回答的。
  • @user3714770 也尝试验证您的主机,我认为对于共享主机,通常是localhost
  • @akmozo 非常感谢它与 localhost 一起使用 :) 但 localhost 它不适用于本地机器!

标签: php mysql pdo cpanel


【解决方案1】:

使用关键字相同的 dbname 不要更改它们

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;

    }

【讨论】:

    【解决方案2】:

    让我大吃一惊的是,我从 MySQL 工作台的树中复制了数据库名称,并将其粘贴到了 settings.php 文件中。 原来,字符串开头和结尾的撇号是假撇号!我删除了它们并加上了真正的撇号,一切都立即启动了。我花了几个小时才弄清楚这一点。 希望这对其他人有帮助。

    【讨论】:

      【解决方案3】:

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

      class Database{
          protected static $pdo;
          public function __construct(){}
      
          public function connect(){
              $dsn="mysql:host=localhost;dbname=dbname";
              try{
              self::$pdo = new PDO($dsn,"root","");
              self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
              echo 'Connected';
              return self::$pdo;
              }catch(PDOException $ex){
                  echo $ex->getMessage();
              }
              return false;
          }
          public function getConnection(){
              return self::$pdo;
          }
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          代替:

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

          只是做:

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

          你会很高兴的。

          【讨论】:

            【解决方案6】:

            使用

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

            而不是

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

            【讨论】:

              【解决方案7】:

              帮助Mysql解析句柄。

              代替:

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

              试试:

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

              【讨论】:

                【解决方案8】:
                $dbh= new PDO('mysql:host=serverName;dbname=Mydatabase','user','password');
                

                这里是错误的。你不能有 host=serverName,相反你需要有类似 host=$serverName,然后 $serverName = "servername.dominin";与 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,只是一个错字。您需要正确编写字符串!

                【讨论】:

                • 我赌 5 美元他只是在使用占位符而不是给我们实际的名字
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-12-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-04-14
                相关资源
                最近更新 更多