我正在制作注册脚本并第一次使用 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/