2016-05-27 19 views
0

私は独自のデータベースクラスを作成しようとしています。私はすべての資格情報を宣言していますが、エラーによって、指定されたデータベースがないことがわかります。PDO:データベース資格情報

Fatal error: Uncaught PDOException: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected in /var/www/html/jwagter/work/database/Database.php:69 Stack trace: #0 /var/www/html/jwagter/work/database/Database.php(69): PDOStatement->execute() #1 /var/www/html/jwagter/work/database/tutorial.php(22): Database->execute() #2 {main} thrown in /var/www/html/jwagter/work/database/Database.php on line 69

のindex.php:

<?php 
ini_set('display_errors', 1); 
error_reporting(E_ALL); 

define("DB_HOST", "localhost"); 
define("DB_USER", "root"); 
define("DB_PASS", "secret"); 
define("DB_NAME", "test"); 

require 'Database.php'; 


$database = new Database(); 

$database->query('INSERT INTO mytable (FName, LName, Age, Gender) VALUES (:fname, :lname, :age, :gender)'); 

$database->bind(':fname', 'Joris'); 
$database->bind(':lname', 'Wagter'); 
$database->bind(':age', '27'); 
$database->bind(':gender', 'male'); 

$database->execute(); 

echo $database->lastInsertId(); 

database.phpで

<?php 
class Database 
{ 

private $host = DB_HOST; 
private $user = DB_USER; 
private $pass = DB_PASS; 
private $dbname = DB_NAME; 

private $dbh; 
private $error; 

private $stmt; 

public function __construct() 
{ 

    echo "in class Database"; 

    $dsn = 'mysql:host' . $this->host . ';dbname=' . $this->dbname; 

    $options = array(
     PDO::ATTR_PERSISTENT => true, 
     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
    ); 

    try { 
     $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
    } catch (PDOExeption $e) { 
     $this->error = $e->getMessage(); 
    } 

} 

public function query($query) 
{ 

    $this->stmt = $this->dbh->prepare($query); 

} 

public function bind($param, $value, $type = null) 
{ 

    if (is_null($type)) { 

     switch (true) { 
     case is_int($value): 
      $type = PDO::PARAM_INT; 
      break; 
     case is_bool($value): 
      $type = PDO::PARAM_BOOL; 
      break; 
     case is_null($value): 
      $type = PDO::PARAM_NULL; 
      break; 
     default: 
      $type = PDO::PARAM_STR; 
     } 

    } 

    $this->stmt->bindValue($param, $value, $type); 

} 

public function execute() 
{ 
    return $this->stmt->execute(); 
} 

public function resultset() 
{ 
    $this->execute(); 
    return $this->stmt->fetchAll(PDO::FETCH_ASSOC); 
} 

public function single() 
{ 
    $this->execute(); 
    return $this->stmt->fetch(PDO::FETCH_ASSOC); 
} 

public function rowCount() 
{ 
    return $this->stmt->rowCount(); 
} 

public function lastInsertId() 
{ 
    return $this->dbh->lastInsertId(); 
} 


public function beginTransaction() 
{ 
    return $this->dbh->beginTransaction(); 
} 

public function endTransaction() 
{ 
    return $this->dbh->commit(); 
} 

public function cancelTransaction() 
{ 
    return $this->dbh->rollBack(); 
} 
+1

DSN文字列に少なくとも1つの誤字があります。あなたのデータベースクラス(多くの一般的な間違いに苦しんでいる)[https://phpdelusions.net/pdo/common_mistakes] –

+0

ありがとう、私はあなたが私に送ったリンクを調べます –

答えて

0

データベースが選択されていないため、とデータベースがDSN文字列で指定されているため、エラーが存在する必要があります。あなたはこれを持っています:

$dsn = 'mysql:host' . $this->host . ';dbname=' . $this->dbname; 

診断のために印刷してください。これは次のようになります:

今やタイプミスです。

+0

ああ、私は忘れて=どのように愚かな。それを印刷していただきありがとうございます。 –

0

Idは考慮にあなたの常識に与えられたコメント内のリンクを取る、

あなたが試すことができますクエリーにデータベース名を入れて物事を動かす。

$database->query('INSERT INTO test.mytable (FName, LName, Age, Gender) 
VALUES (:fname, :lname, :age, :gender)'); 

または、クエリを実行する前にUSEデータベースを使用してください。

$database->query("USE DATABASE test"); 
$database->execute(); 

Idは、上記のリンクで強調表示されている理由でデータベースラッパーを書き留めません。 PDOはかなり良いです。