2012-01-02 22 views
0

新しいレコードを作成するには、__constructオプションを使用する必要がありますか?以下は私が「コース」と呼んだクラスです。私は実際には、時間の25%のコースを「作成」するだけで、残りの時間はコースを検索したいと思うでしょう。PHP OOP:コンストラクトを使用して新規レコードを作成する

class Course { 
    private $db; 

    function __construct($db, $data) { 
     global $error, $mysqli; 

     $this->db = $db; 

     requireOrError($data['course_type_id'], "Course Type Required"); 
     requireOrError($data['instructor_id'], "Instructor Required"); 
     requireOrError($data['dz_name'], "DZ Name Required"); 
     requireOrError($data['dz_address'], "DZ Address Required"); 
     requireOrError($data['dz_city'], "DZ City Required"); 
     requireOrError($data['dz_state'], "DZ State Required"); 
     requireOrError($data['dz_zip'], "DZ Zip Required"); 
     requireOrError($data['dz_email'], "DZ Email Required");  
     requireOrError($data['start_date'], "Course Start Date Required"); 
     requireOrError($data['end_date'], "Course End Date Required"); 
     requireOrError($data['student_slots'], "Number Of Student Slots Required"); 

     if(! is_numeric($data['student_slots'])) { 
      $error[] = "Invalid Student Slots - Must be a number"; 
     } 

     setError($error); 

     if(empty($error)) { 
      $add = $mysqli->query("INSERT INTO " . $this->db['courses'] . " (course_type_id, instructor_id, dz_name, dz_address, dz_city, dz_state, dz_zip, dz_email, start_date, end_date, student_slots, notes) VALUES ('$data[course_type_id]', '$data[instructor_id]', '$data[dz_name]', '$data[dz_address]', '$data[dz_city]', '$data[dz_state]', '$data[dz_zip]', '$data[dz_email]', '$data[start_date]', '$data[end_date]', '$data[student_slots]', '$data[notes]')"); 
      redirectTo("instructors.php"); 
     } 
    } 
} 

私はIDを渡すことができ、それがコースのオブジェクトを返します「getCourseInfo」と呼ばれる関数を作成するつもりでした。これを行うにはこれが最善の方法か、または作成する__constructの動作を変更する必要があります。また、私はどのように私は/ルックアップを作成するかの例を私に与えることができますか?

ありがとうございます!

+0

レコードを挿入したい。単純にコンストラクタで基本的なセットアップを行ってから、 "createRecord"メソッドと "validateData"メソッドを提供するのはなぜですか? –

答えて

1

いいえ関数の引数として渡すか、配列として渡すかを記録します。たとえば、次のように

<?php 
class Course { 

    protected $db;  

    public function __construct($db) { 
     $this->db = $db; 
    } 

    public function fetchById($id) { 
     // perform database query; look-up on ID 
    } 

    public function create($data) { 
     // validate your $data 
     // create your record 
     // return either boolean true or the ID of the newly-created record 
     // and errors, either return boolean false or throw an exception 
    } 
} 

次に、あなたのクラスを使用することができます。

<?php 

// create PDO instance in $pdo variable 

$course = new Course($pdo); 

$data = array(
    'course_type_id' => $_POST['course_type_id'], 
    'instructor_id' => $_POST['instructor_id'], 
    // and so on... 
); 

if ($course->create($data)) { 
    echo 'Course created.'; 
} 
else { 
    echo 'Error creating course.'; 
} 

任意のポストされたデータをエスケープし、サニタイズすることを確認します。

2

いいえコンストラクタの主な目的は、新しく作成されたオブジェクトを安定した状態にすることです。 決して "do"何かする必要があります。

-1

クラス自体の目的が操作...である場合、コンストラクタでいくつかの操作を行うのは良いことです。つまり、そのクラスの関数から必要なものがあれば、データベースに挿入する必要があります。

あなたのクラスのソロ目的がデータベースにデータを挿入するのであれば、それをしてください。同じもののための関数を定義してください:

1

オブジェクトの存在を確立することが目的であるため、作成機能をコンストラクタから離しておくことをお勧めします。タンジェンシャル操作の束を実行しないようにしてください。

$obj = new Course; 
$obj->setDb($db)->setData($data); 

あなたの場合

さらに、あなたは(ほぼ完全にコンストラクタでオブジェクトのプロパティを取り込むから利益をフェイク「効率を短縮コード」を無効に)あなたのsetterメソッドで$thisを返すことによって、メソッドチェーンを実装することができますは、他のオブジェクトメソッドをショートカットできる__construct()を実装しています。少なくとも、引数のデフォルト値を定義する必要があります。デフォルトのNULL値を許可すると、コードのテスト容易性が大幅に向上します。あなたは、コンストラクタに引数を渡すなかった場合

だから...以下のようになりますけれども、あなたはおそらくはないはず:コンストラクタのためにあまりにも忙しくだ、とあなたは常に想定してい

class Course { 

    private $db; 

    private $data; 

    function __construct($db=NULL, $data=NULL) 
    { 
    if ($db) { 
     $this->setDb($db); 
    } 
    if ($data) { 
     $this->setData($data); 
    } 
    } 

    function setDb(DbConn $db) 
    { 
    $this->db = $db; 
    return $this; 
    } 

    function setData($data) 
    { 
    if ($data !== (string)$data) { 
     throw new InvalidArgumentException('data argument must be a string'); 
    } 
    $this->data = $data; 
    return $this; 
    } 
} 
関連する問題