2012-03-10 18 views
3

私は、オブジェクト指向プログラミングの概念を学び始め、データベースに接続し、データベース接続を閉じるためのクラスをまとめました。これまでのところ、データベースへの接続を閉じる以外はすべて正常に機能しているようです。私はそれがにmysql_closeの括弧内のconnectDB方法を置くように単純ではありません推測しているOOPデータベースの接続/切断クラス

Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource in F:\Programs\webserver\root\oop\oop.php on line 53 

:私は、データベースから切断しようとすると、私は、次のエラーメッセージが表示されます

class Database { 

    private $host, $username, $password; 
    public function __construct($ihost, $iusername, $ipassword){ 
     $this->host = $ihost; 
     $this->username = $iusername; 
     $this->password = $ipassword; 
    } 
    public function connectdb(){ 
     mysql_connect($this->host, $this->username, $this->password) 
      OR die("There was a problem connecting to the database."); 
     echo 'successfully connected to database<br />'; 
    } 
    public function select($database){ 
     mysql_select_db($database) 
      OR die("There was a problem selecting the database."); 
     echo 'successfully selected database<br />'; 
    } 
    public function disconnectdb(){ 
     mysql_close($this->connectdb()) 
      OR die("There was a problem disconnecting from the database."); 
    } 
} 

$database = new database('localhost', 'root', 'usbw'); 
$database->connectdb(); 
$database->select('msm'); 
$database->disconnectdb(); 

それを行う正しい方法を見つけることができません。

おかげ

答えて

12

あなたのクラスにconnection/link変数を追加し、デストラクタを使用します。 これにより、接続を閉じることを忘れてしまうこともなくなり、自動的に完了します。
mysql_close()に渡す必要があるのは$ this->リンクです。

class Database { 

    private $link; 
    private $host, $username, $password, $database; 

    public function __construct($host, $username, $password, $database){ 
     $this->host  = $host; 
     $this->username = $username; 
     $this->password = $password; 
     $this->database = $database; 

     $this->link = mysql_connect($this->host, $this->username, $this->password) 
      OR die("There was a problem connecting to the database."); 

     mysql_select_db($this->database, $this->link) 
      OR die("There was a problem selecting the database."); 

     return true; 
    } 

    public function query($query) { 
     $result = mysql_query($query); 
     if (!$result) die('Invalid query: ' . mysql_error()); 
     return $result; 
    } 

    public function __destruct() { 
     mysql_close($this->link) 
      OR die("There was a problem disconnecting from the database."); 
    } 

} 

使用例:

<?php 
    $db = new Database("localhost", "username", "password", "testDatabase"); 

    $result = $db->query("SELECT * FROM students"); 

    while ($row = mysql_fetch_assoc($result)) { 
     echo "First Name: " . $row['firstname'] ."<br />"; 
     echo "Last Name: " . $row['lastname'] ."<br />"; 
     echo "Address: " . $row['address'] ."<br />"; 
     echo "Age: "  . $row['age']  ."<br />"; 
     echo "<hr />"; 
    } 
?> 

編集:
だから、人々が実際にクラスを使用することができ、私は行方不明のプロパティ/メソッドを追加しました。
次のステップは、照会メソッドを拡張して、注入に対する保護とその他のヘルパー関数を含めることです。追加__construct($ホスト、$ユーザ名、$パスワード、$データベース)

  • 合併のconnectDB()

    • 不足しているプラ​​イベートプロパティを追加しましたし、(選択)__constructへ:
      私は、次の変更を加えました()は余分な2行のコードを節約します。私はタイプミスやミスを犯した場合
    • 追加クエリ($クエリ)
    • 使用例

    は、建設的なコメントを残してください、私は他人のためにそれを修正することができます。

  • 2

    あなたはconnectdb()から何かを返すていない、まだあなたはmysql_close()に、この関数の戻り値を渡しています。

    +1

    私はこのようにするつもりなら、あなたのクラス内のデータベース接続のための本当のリソースを保つかもしれません。 –

    +0

    クラス内のデータベース接続の実際のソースを保持するとはどういう意味ですか? – crm

    +0

    @crm:プライベートメンバーを追加し、そこに '$ this-> connection'のように保存します。 – hakre

    1

    mysql_closeには接続を解除するためのパラメータが必要ですが、何も提供していません。

     
    
    class Database { 
    
        private $host, $username, $password, $con; 
    
        public function __construct($ihost, $iusername, $ipassword){ 
         $this->host = $ihost; 
         $this->username = $iusername; 
         $this->password = $ipassword; 
         $this->con = false; 
        } 
    
    
        public function connect() { 
         $connect = mysql_connect($this->host, $this->username, $this->password); 
         return $connect; 
        } 
    
    
        public function connectdb(){ 
         $conn = $this->connect(); 
         if($conn) 
         { 
          $this->con = true; 
          echo "Successsfully Connected. 
    "; return true; } else { echo "Sorry Could Not Connect.
    "; return false; } } public function select($database){ if($this->con) { if(mysql_select_db($database)) { echo "Successfully Connected Database. $database.
    "; return true; } else { echo "Unknown database.
    "; } } else { echo "No active Connection.
    "; return false; } } public function disconnectdb(){ if($this->con) { if(mysql_close($this->connect())) { $this->con = false; echo "Successfully disconnected.
    "; return true; } } else { echo "Could Not disconnect.
    "; return false; } } } $database = new database('localhost', 'root', ''); $database->connectdb(); $database->select('databaseoffacebook'); $database->disconnectdb();
    2

    あなたはmysql_*機能がもっとそして1あなたの前でPHP 4で導入されたことを認識する必要があります。このAPIは非常に古く、プロセスは実際にdeprecating this extensionに始まりました。

    2012年に新しいコードをmysql_*機能で書き込むべきではありません。

    非常に良い代替案が2つあります:PDOMySQLiです。どちらもすでにオブジェクト指向のコードを念頭に置いて書かれており、prepared statementsを使用することもできます。

    あなたはこのようになりPDOで書かれたオリジナルのポストで示したことを例:

    //connect to the the database 
    $connection = new PDO('mysql:host=localhost;dbname=msm', 'username', 'password'); 
    //disconnects 
    $connection = null; 
    

    もちろんそこより複雑なユースケースですが、ポイントスタンド - 時間が進化します。

    0

    オブジェクト指向プログラミングは、PDOとmysqliでうまく動作します。それを試してみてください

    -1
    <?php 
    
    class Database{ 
    
        private $link; 
        //private $host,$username,$password,$database; 
        //private $status; 
    
        public function __construct(){ 
    
         $this->host   = 'localhost'; 
         $this->username  = 'root'; 
         $this->password  = ''; 
         $this->database  = 'workclass'; 
    
         $this->link = mysqli_connect($this->host,$this->username,$this->password); 
    
         $this->status = mysqli_select_db($this->link,$this->database); 
    
         if (!$this->status) { 
          return $this->status="Failed to Connected with Database"; 
         }else{ 
          return $this->status="Database is connected"; 
         } 
        } 
    } 
    
    $object = new Database(); 
    
    echo $object->status; 
    
    ?> 
    
    +0

    コードの束を置くだけでなく、答えを説明すると良いでしょう。 –

    +0

    私はちょうど上記の質問への私の答えを与えている( "私はオブジェクト指向プログラミングの概念を学び始め、データベースに接続し、データベースを選択し、データベース接続を閉じるためのクラスをまとめている")、私たちはこのプログラムを作り直して答えを出すために問題に直面していました。ありがとう –

    関連する問題