php - PDO 错误 : no database selected

标签 php mysql pdo

我正在制作注册脚本并第一次使用 PDO,但在尝试使用它时出现此错误。使用 MySQLi 时定义工作正常。

我的代码给我这个错误:

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

这是代码:(/register.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();
    }

这是连接数据库的文件:((config/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。这没有明确说明in the PDO::__construct() docs ,据我所知,但我能够在我自己的环境中测试它。

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

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

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

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 语句中有普通变量而不是绑定(bind)参数,那我就是失职了。您应该像在第一个 SELECT 语句中那样在此处使用占位符绑定(bind)值。

// 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()...

关于php - PDO 错误 : no database selected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26952636/

相关文章:

javascript - JQuery/javascript doubleclick=在 foreach() php 的每个 div 上执行一些操作

php - 逗号分隔的字符串作为 url 数组

MySQL WHERE 子句中的日期计算

php - 如何为 div id 设置条件

php - 提交表单,mysql和php

php - 如何使用 php 将用户输入的信息传递到我的数据库?

php - 使用 PHPStorm 在 PHPUnit 中不断获取 "You cannot serialize or unserialize PDO instances"

php - 为什么这个 PDO 语句会默默地失败?

php - PHP PDO 与 mysql*() 的安全优势

PHP 从购物车转移到登录用户时如何保留 session 信息?