【问题标题】:SQLSTATE[3D000]: Invalid catalog name: 1046 No database selectedSQLSTATE [3D000]:无效的目录名称:1046 未选择数据库
【发布时间】:2015-11-19 03:27:16
【问题描述】:

我正在尝试使用 PDO 将数据插入数据库中的 3 个表之一。当我调用下面的插入函数时,得到错误:SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected.

【问题讨论】:

  • 请不要发布代码的“图像”,而是实际代码,以便我们可以准确地看到这些引号是什么。并在您处理变量时显示完整的代码。您的问题无法回答。
  • 我试过这样做,但不幸的是,当我这样做时格式被搞砸了,变得不可读。
  • 发布代码时,可以选择使用代码格式化选项对其进行格式化(如果行不显示为代码,请尝试在该行添加空格)
  • 那么,这个问题我们在哪里?我在此评论前将近 1/2 小时发布了一个答案。

标签: php mysql pdo


【解决方案1】:

这里可能会走投无路

在我看来,您没有为连接创建任何变量/数组,或者配置不正确。 (您的问题中发布的代码不足)。

来自PDO连接手册http://php.net/manual/en/pdo.connections.php

示例 #1 连接到 MySQL

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>

示例 #2 处理连接错误

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    foreach($dbh->query('SELECT * from FOO') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
?>

另外,查看代码的“图像”,在我看来,您在列周围使用了常规引号,而不是刻度。它们完全是两种不同的动物

INSERT INTO Students ('RIN', 'First Name', 'Last Name' ...

单词之间有空格,是的;必须使用刻度。

因此,您需要修改代码以读取为

INSERT INTO Students (`RIN`, `First Name`, `Last Name` ...

并将引号更改为上述所有其他列名称的刻度。我不打算在这里输入所有内容。

您还需要检查 DSN 中是否存在异常错误。使用你现在拥有的还不够。

示例#1 创建一个 PDO 实例并设置错误模式

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

?>
  • 确保您选择(并创建)了正确的数据库/表,并且您确实创建了所有这些列并使用了正确的类型和长度。

如果您收到 MySQL 可能会抱怨的错误(例如撇号),那么您将需要转义您的数据;无论如何你都应该做的事情。

请参阅以下内容,并使用准备好的语句:

【讨论】:

    【解决方案2】:

    在您的代码中,我没有看到您选择数据库的位置或时间。请参阅this 了解更多信息。

    但要明确的是,这就是我所指的

    $conn = new mysqli($servername, $username, $password, $dbname);
    

    如您所见,最后一个变量是 dbname。

    【讨论】:

    • 好的。谢谢!我解决了这个问题,但现在我明白了:Warning: PDO::__construct() expects parameter 4 to be array, string given in /Applications/XAMPP/xamppfiles/htdocs/websys/lab9/insert.php on line 7Fatal error: Call to a member function setAttribute() on a non-object in /Applications/XAMPP/xamppfiles/htdocs/websys/lab9/insert.php on line 8 sn-p 从第 5 行开始。
    • 您确实看到提问者正在使用 PDO。 不是吗? 那你为什么建议使用mysqli
    • 答案不支持您发布的代码,也不能与 PDO 一起使用(这是混合 MySQL API。您向我们展示了 PDO 代码作为图像,但此答案显示为使用 mysqli_。让我头疼这里严重震动。@David.Sparky
    • @davejal 很难说戴夫。我不是在质疑“你”,而是在质疑 OP 本人。据我所知,这个问题从未被编辑过。没有显示它的修订版。我会留下它,因为它从技术上表明找到了解决方案。也许他选择了错误的答案来接受。哦,好吧,你能做什么;-)
    • @Fred-ii- 好的,谢谢,只是出于道德要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多