没有数据库名称的Pdo连接?

22
我正在尝试创建一个内容管理系统(CMS),我想让我的客户更轻松,所以我自己创建数据库。在尝试这样做时,遇到了一个问题。数据库没有被创建,所以我不能使用PDO连接。而且mysql已经被弃用,所以我也不能使用它。你有什么建议可以帮助我在数据库创建之前创建PDO连接吗?例如mysql_select_db()的替代方法?

为什么不在创建PDO对象之前更改连接字符串呢?如果您已经知道数据库名称,只需将其添加到字符串中即可。 - Fluffeh
1
@Fluffeh:他想从脚本动态创建数据库,该数据库尚不存在。 - Madara's Ghost
4个回答

39

你可以通过以下方式开始一个PDO连接,如果我有错请纠正我:

$db = new PDO("mysql:host=localhost", 'user', 'pass');

与普通连接不同的是,如你所见,已经去掉了dbname=[xx]这部分内容。

当你想使用UTF-8连接时,还有一个免费提示:

$db = new PDO("mysql:host=localhost;charset=utf8mb4", 'user', 'pass');

为了回应 Yehonatan 的评论,你可以通过以下方式选择数据库:

$db->exec('USE databaseName');

1
确实。我刚刚用这个脚本进行了测试 $db = new PDO('mysql:host=localhost;', 'user', 'pass'); print_r($db->query('SHOW DATABASES')->fetchAll(PDO::FETCH_ASSOC));,它有效运行 ;) - core1024
@core1024:这样链接会让你在几个月后头疼不已。 - Madara's Ghost
1
谢谢,但是之后有没有设置数据库的方法?就像“mysql_select_db”一样? - Yehonatan
4
我找到了 - $pdoConnection->exec('USE databaseName'); - Yehonatan
我在使用UTF-8时遇到了错误SQLSTATE[HY000] [2019] Unknown character set,但是将其替换为charset=UTF8后就可以正常工作了。 - Jeff Puckett
显示剩余2条评论

1

使用空字符串也可以, 例如 dbname=; 不需要添加更多的逻辑来摆脱所有的dbname部分。

$db_name = '';

$pdo = new PDO(
    sprintf('mysql:host=%s;dbname=%s;charset=%s',
        $db_host, $db_name, $db_charset),
    $db_user,
    $db_pass
);

0

我发现唯一可行的方法是在运行任何查询之前使用$pdo->query('USE databasename')来设置默认数据库。


0

只需删除dbname=部分:

try {
    $pdo = new PDO("mysql:host=localhost;", "user", "pass");
    $stmt = $pdo->query("SHOW DATABASES");
    var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
}
catch (PDOException $e) {
    echo $e->getMessage();
}

给我

array(11) {
  [0]=>
  array(1) {
    ["Database"]=>
    string(18) "information_schema"
  }
  [1]=>
  array(1) {
    ["Database"]=>
    string(5) "cdcol"
  }
  [2]=>
  array(1) {
    ["Database"]=>
    string(5) "chica"
  }
  [3]=>
  array(1) {
    ["Database"]=>
    string(9) "downloads"
  }
  [4]=>
  array(1) {
    ["Database"]=>
    string(5) "mysql"
  }
  [5]=>
  array(1) {
    ["Database"]=>
    string(18) "performance_schema"
  }
  [6]=>
  array(1) {
    ["Database"]=>
    string(10) "phpmyadmin"
  }
  [7]=>
  array(1) {
    ["Database"]=>
    string(8) "rishumon"
  }
  [8]=>
  array(1) {
    ["Database"]=>
    string(4) "test"
  }
  [9]=>
  array(1) {
    ["Database"]=>
    string(5) "users"
  }
  [10]=>
  array(1) {
    ["Database"]=>
    string(7) "webauth"
  }
}

如预期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接