0

単一のデータベースに接続する簡単なスクリプトを作成しようとしています。クラスファイルを多数の Web サイトに配置し、そのサイトをデータベースに「登録」できるようにしたいと考えています。

クラスをインスタンス化するたびに SQL クエリを実行する必要がないようにするために、PHP 定数を使用してドメインを「登録」したいと考えました。

私のメソッドでは、定数を定義してチェックしました-動作しますが、コンストラクターで定数をチェックすると、定数が定義されなくなりました。

これが私のクラスファイルです。定数に関して私が理解していないものだと確信しています。

 <?php

/** 
 * @author bailz777
 * 
 * 
 */
class db_interface {

    public $ServerName = 'localhost:3306'; //hostname:port
    public $UserName = '******'; //mysql user
    public $Password = '******'; //mysql password
    public $DataBase = '******'; //database name
    public $Domain = 'test.com'; //Full domain name (no host)
    public $con = '';

    function __construct() {

        //on construction, we must ensure that the domain is registered in our system
        //first check if it was defined locally to avoid extra DataBase Work
        var_dump(defined('DOMAIN_REGISTERED'));
        if(!defined('DOMAIN_REGISTERED')) {
            $this->db_connect();
            $result = $this->validate_domain();
            if($result) {
                echo "<p>Domain Validated!!</p>";
            }
            $this->db_disconnect();     
        }
        else {
            echo "<p>Domain Validated!!</p>";
        }
    }

    /**
     * 
     */
    function __destruct() {

    }

    /**
     * 
     * @param unknown_type $domain
     * @return boolean
     */
    private function validate_domain() {
        $constants = get_defined_constants();
//      return $this->con;
//      print_r($constants);
var_dump(defined('DOMAIN_REGISTERED'));
        if(defined('DOMAIN_REGISTERED')) {//Check DOMAIN_REGISTERED to avoid unnecessary db work
            return TRUE;
        }
        elseif (!defined('DOMAIN_REGISTERED')) {//Check the domain is in the db
            echo '<p>Domain was not locally registered, checking DataBase</p>';
            $query = "SELECT `name` FROM `$this->DataBase`.`registered_domains` WHERE `name` = '$this->Domain'";
            $result = mysql_query($query,$this->con);
            //var_dump($result);
            if(!$result) {
                die('No result found : ' . mysql_error());
            }
            elseif (mysql_num_rows($result)==0) { //if no rows returned, then domain is not in DataBase 
                $domain_exists = FALSE;
            }
            elseif (mysql_num_rows($result)>0) { //if rows returned, then domain is in DataBase
                $domain_exists = TRUE;
                //If a domain does not exist, a mysql will be passed, use @ to suppress the error
                //The domain will be written to the db and on the next run of this function, the 
                //constant will be defined
            }
            if($domain_exists) {//If it exists Then assign CONSTANT DOMAIN_REGISTERED to TRUE
                echo '<p>Domain Found in DataBase</p>';
                echo '<p>Registering domain locally</p>';
                define("DOMAIN_REGISTERED", TRUE);
                if(DOMAIN_REGISTERED) {
                    echo '<p>Successfully registered domain locally</p>';
                }
                //var_dump(defined('DOMAIN_REGISTERED'));
                //echo DOMAIN_REGISTERED;
                return TRUE;
            }
            elseif(!$domain_exists) {//If it does not exist then add it to the registered_domains table, and assign CONSTANT __DOMAIN_TRUE__ to TRUE
                echo '<p>Domain not found in DataBase</p>';
                echo '<p>Now Registering Domain</p>';
                $query = "INSERT INTO `$this->DataBase`.`registered_domains` (`name`) VALUES ('$this->Domain')";
                $result = mysql_query($query);
                if(!$result) {
                    die('Domain not added : ' . mysql_error());
                }
                else{
                    define("DOMAIN_REGISTERED", TRUE);
                    return TRUE;
                }
            }
        }       
    }

    //Connect to mysql and define the active database
    private function db_connect() {
        $this->con = $con = mysql_connect($this->ServerName,$this->UserName,$this->Password);
        if (!$con) {
            die('Could not connect: ' . mysql_error());
        }
        else {
            echo 'Successfully connected to MySQL<br />';
            //define active database
            $this->db = mysql_select_db($this->DataBase);
            if(!$this->db) {
                die('Could not connect to Database : ' . mysql_error());
            }
            else {
                echo 'Successfully connected to DataBase<br />';
            }
        }
    }

    //disconnect from mysql
    private function db_disconnect() {
        $close =  mysql_close($this->con);
        if($close) {
            echo 'Successfully disconnected from MySQL<br />';
        }
    }

    public function add_record($fname,$lname,$email) {
        $ip = $_SERVER['REMOTE_ADDR'];
        $authorized_date = time();

    }
}

?>
4

5 に答える 5

1

静的クラス変数を使用してその値を保持してみてください。1つは、定数値をクラスに制限することです。これは、アプリケーション全体に値を公開するよりも優れた方法です。もう1つは、定数の目的は定数が変更されないことであり、それをフラグとして使用しようとしているように見えます。

于 2012-09-22T13:21:45.560 に答える
1

コンストラクターは、オブジェクトを作成した直後に呼び出される最初の関数です。

クラス内の他の関数で定数を定義すると、コンストラクターで定義されることは期待できません。理由は次のとおりです。

  • オブジェクトを作成するとき - コンストラクターが呼び出されます
    • コンストラクター内で、定数が定義されているかどうかを確認しています。もちろんそうではありません。どこで定義したのでしょうか?
  • クラス内でいくつかの関数を呼び出して、定数を定義しています
  • 次にオブジェクトが作成されたとき (ページの更新など) - 定数は定義されていません

それは完全に正常な動作です。

于 2012-09-22T13:27:22.377 に答える
1

意図したとおりに定数を使用していない可能性があると思います。まず、コードの実行中に定数値を変更することはできません (したがって、定数)。

これらを使用して、コード全体で使用できるハードコードされた値 (本当に単純な値のみ) を割り当てます。重要なのは、それらが決して変わらないことを最終的に知ることができるということです.

これに加えて、変数名を参照するだけなので、定数自体の実際の値を必ずしも知る必要はなく、コードを壊すことなくいつでもこれらの値を変更できます。

次の例を検討してください。

<?php

class pizza
{
  const SIZE_SMALL  = 1;
  const SIZE_MEDIUM = 2;
  const SIZE_LARGE  = 3;

  public function getCookingTime($size)
  {
    if ($size == self::SIZE_SMALL) {
      $time = 10;
    } else if ($size == self::SIZE_MEDIUM || $size == self::SIZE_LARGE) {
      $time = 15;
    }
    return $size;
  }
}

$pizza = new pizza();
$time  = $pizza->getCookingTime(3);

// or more usefull:

$time = $pizza->getCookingTime(pizza::SIZE_SMALL);

?>
于 2012-09-22T13:33:09.060 に答える
0

define('DOMAIN_REGISTERED', '...');コード内で呼び出す場所が見つかりませんでした。
とにかく、monitorjblが述べたように、staticDB接続に予約語を使用することを検討してください。そうすれば、接続の再定義、ドメインの再登録などを回避できます。

于 2012-09-22T13:23:53.173 に答える
-1

オブジェクト指向プログラミングをマスターしたいのは良いことです。(多くの)利点の1つは、再利用可能でテスト可能なコードを作成できることです。

データベースに接続し、多くのサイトで再利用できるクラスを構築する場合、避けたいことの1つは依存関係です。定数または別のクラスへの依存により、コードの再利用がより困難になります。または、コードをテストしてデバッグします。

つまり、事前定義された定数と事前に初期化されたパブリックの使用を避けたいということです。

クラスの構成は次のようになります。

class mydb
{
   private $host;
   private $database;
   ..

   public function __construct($host, $database ..)
   {
     $this->host = $host;
     $this->database = $database;
   }
}

次のようにクラスを使用できます。

$mydb = new mydb('localhost', 'mydatabase', ..);

データベースにサイトを登録できるようにする場合は、Registerメソッドを記述します。

class mydb
{
   private $host;
   private $database;
   ..

   public function __construct($host, $database ..)
   {
     $this->host = $host;
     $this->database = $database;
   }

   public function Register( $domainname )
   {
      //connect to the database and do register stuff
   }
}

そして、次のように使用します。

 $mydb = new mydb('localhost', 'mydatabase', ..);
 $mydb->Register('MyDomain');
于 2012-09-22T13:24:21.680 に答える