1

データベースから顧客の電子メール アドレスを取得したい場合、次の方法は不適切です。$row には、customerテーブル内のすべてのフィールドの要素が含まれるためです。

$result = mysqli_query ('SELECT * FROM customer WHERE custid = 1');
$row = mysqli_fetch_array ($result, MYSQLI_ASSOC);

$row には電子メール アドレスの 1 つの要素が含まれるため、これはより適切であると考えられます。必要なのはこれだけです。

$result = mysqli_query ('SELECT email FROM customer WHERE custid = 1');
$row = mysqli_fetch_array ($result, MYSQLI_ASSOC);

同じロジックをオブジェクトに適用しようとしています。「顧客」オブジェクトに 50 個のプロパティ/フィールドがある場合、1 つだけにアクセスする必要があるときに 50 個のプロパティすべてを入力するのは一般的ですか?

以下は顧客クラスとオブジェクトの基本的な例です。顧客の電子メールアドレスを取得するだけで、他のすべての詳細を取得したくない場合、リソースを大量に消費します (この例では、「顧客」オブジェクトには 5 つのプロパティがありますが、実際にはもっと多くの可能性があります):

class Customer {

    private $custid;
    private $firstname;
    private $lastname;
    private $email;
    private $dateadded;

    public function getCustomer ($id) {
        $result = mysql_queryi ('SELECT * FROM customer WHERE custid = ' . $id);
        $row = mysqli_fetch_array ($result, MYSQLI_ASSOC);
        foreach ($row as $key => $value) {
            if (isset ($this->$key)) {
                $this->$key = $value;
            }
        }
    }
}

$customer = new Customer ();
$customer->getCustomer (1); // All I wanted is the email address, but now I have everything :-(
4

3 に答える 3

1

getCustomerクエリするフィールドの配列を受け入れる関数に2番目の引数を作成できます

public function getCustomer ($id, $fields=array('*')) {
    $fields = implode(',', $fields);
    $result = mysql_queryi("SELECT {$fields} FROM customer WHERE ...");
    // ...

使用法

// get entire customer
$customer->getCustomer(1);

// just get the email field
$customer->getCustomer(1, array('email'));

// get full name
$customer->getCustomer(1, array('firstname', 'lastname'));

ボーナス:

モデルでフィールドを少し異なる方法で保存することをお勧めします

class Customer
    private $_data;

    public function getCustomer($id, $fields=array('*')) {
        // ...
    }

    // PHP magic set method
    // calling $this->foo = 'bar' results in $this->_data['foo'] = 'bar'
    public function __set($key, $value) {
        return $this->_data[$key] = $value;
    }

    // PHP magic get method
    // calling $this->foo results in $this->_data['foo']
    public function __get($key) {
        return array_key_exists($key, $this->_data)
            ? $this->_data[$key]
            : null
        ;
    }
}

このようにして、静的に定義されたすべてのインスタンス変数を取り除くことができます。例: private $custid;private $firstname;private ...

代わりに、すべてのフィールドが$this->_dataプライベート連想配列に格納されます。

getCustomerこれの良いところは、関数の記述方法を変更する必要さえないことです。

PHP マジック メソッドの詳細

于 2012-11-26T19:36:50.073 に答える
0

メール アドレスの取得メソッドを作成できます。

public function getCustomerEmail ($id) {
    $result = mysql_queryi ('SELECT email FROM customer WHERE custid = ' . (int)$id);
    $row = mysqli_fetch_array ($result, MYSQLI_ASSOC);
    foreach ($row as $key => $value) {
        if (isset ($this->$key)) {
            $this->$key = $value;
        }
    }
}

PS:変数をクエリで使用する前に、変数をサニタイズすることを忘れないでください

于 2012-11-26T19:35:33.873 に答える
0

最初に...
実際のオブジェクトから顧客オブジェクトを取得するためのロジックを本当に分離する必要があります...例については、リポジトリ/ファサードパターンを参照することをお勧めします。

例えば。CustomerCollectionInstance->getCustomer($id) は Customer エンティティを返します。

あなたの例は非常に単純であるため、電子メールとすべてのフィールドのみをプルすることとの違いは重要ではありません。オブジェクトが大量にある場合、500 件の注文がある顧客を例に挙げてみましょう。注文は独自のオブジェクトに分割する必要があり、エンティティ オブジェクトを組み立てるときは、重いオブジェクトをロードするのではなく、その場所にプロキシ オブジェクトを配置して、アクセス時にデータベースにそのデータをクエリする必要があります。



例えば。

  • CustomerCollection で getCustomer を呼び出します...

  • CustomerCollection は、基本データがロードされた CustomerEntity を返し、customerOrders は CustomerOrderCollectionProxy オブジェクトで設定されます。

  • CustomerOrderCollectionProxy オブジェクトを返す CustomerEntity->getOrders() を呼び出します

  • CustomerOrderCollectionProxy を呼び出すと、DB から必要なデータがロードされているかどうかが最初にチェックされます。そうでない場合は、実際の CustomerOrderCollection が作成され、必要な日付を持つオブジェクトへのすべての呼び出しが委任されます。



例については、プロキシ パターンを参照してください。

于 2012-11-26T20:06:01.563 に答える