PDO错误:未选择数据库

时间:2014-11-16 01:00:11

标签: 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");

1 个答案:

答案 0 :(得分:3)

快速测试显示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的两个来源组合代码)。

建议在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语句中有明确的变量而不是绑定参数,那将是我的疏忽。您应该像在第一个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()...