PDO 错误:未选择数据库


PDO error: no database selected

我正在制作寄存器脚本并首次使用 PDO,但在尝试使用它时出现此错误。当使用MySQLi时,定义工作正常。

我的代码给了我这个错误:

Array ( [0] => SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected )

这是代码:(/注册.php)

    try{
        $input_password_hash = password_hash($input_password, PASSWORD_DEFAULT);
        $stmt = $PDO_new->prepare("SELECT user_name FROM users WHERE user_name = :username");
        $stmt->bindParam(":username",$input_username);
        $stmt->execute();
        echo "code after exec";
        //checks if user already exist in database.
        if($stmt->rowCount()>0){
            $error[] = "Username already exist";
            echo "user is there";
        }
        else{
            echo "user not there";
            $insert = "INSERT INTO users(user_name, user_password_hash, user_email) VALUES($input_username,$input_password_hash, $input_email)";
        }

    } catch(PDOException $e){
        $error[] = $e->getMessage();
    }

这是用于连接到数据库的文件:((配置/db_connect.php)

<?php
require_once($_SERVER['DOCUMENT_ROOT']."/config/db.php");
$PDO_new = new PDO("mysql:host=" . DB_HOST . ";DBName=" . DB_NAME, DB_USER, DB_PASS);
$PDO_new->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

这是我定义数据库信息的文件:(/config/db.php)

define("DB_HOST", "localhost");
define("DB_NAME", "username_databasename");
define("DB_USER", "username_admin");
define("DB_PASS", "password");

快速测试显示,PDO连接在解析属性的方式上区分大小写。 当您应该使用小写dbname时,您可以使用DBName。 据我所知,这在PDO::__construct()文档中没有明确说明,但我能够在自己的环境中进行测试。

$PDO_new = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
//--------------------------------------------^^^^^^^^^^

目前还不清楚为什么你也通过MySQLi建立连接,因为MySQLi和PDO是可比较但不兼容的API。您通常需要其中一个,而不是两个(除非您组合来自使用相反 API 的两个源的代码)。

建议在设置ERRMODE_EXCEPTION new PDO()之前将包装在try/catch中以捕获连接错误。

try {
  $PDO_new = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
} catch (PDOException $e) {
  // handle a connection error error
}

最后,如果我没有指出您在 INSERT 语句中有纯变量而不是绑定参数,那将是我的失职。您应该在此处使用占位符绑定值,就像您在第一个 SELECT 语句中所做的那样。

// Use placeholders please!
$insert = "INSERT INTO users(user_name, user_password_hash, user_email) VALUES(:input_username,:input_password_hash, :input_email)";
// prepare() then execute()...