我第一次制作注册脚本并使用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");
答案 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()...