2017-11-23 8 views
1

私はさまざまなボタンやリンクのクリックデータを保存しています。私はサーバー上でPHPを使用し、AJAXはすべてのボタンをクリックし、要求内でいくつかのボタンをクリックしたことを示す信号を送信します。サーバーはこれを受け取り、DB内の適切な行を見つけて、カウンタ値をインクリメントします。行が見つからない場合(新しいボタンが追加された場合)、新しい行が作成されます。(PHP)OOPデザイン - 一般化メソッド

だから私は、次のクラス作成しました:

class MysqlDatabase extends Database 
{ 
    protected $db_driver; 
    protected $db_host; 
    protected $db_name; 
    protected $user; 
    protected $password; 

    // Allow for 1 query to be set at any time 
    protected $query; 

    public function getClicks($category) 
    { 
     $clicks = $this->db->prepare("SELECT num FROM clicks WHERE category = Five"); 
     $clicks->execute(); 
     $num = $clicks->fetch(PDO::FETCH_ASSOC); 

     print_r($num); 
    } 

    private function checkCategory($category) 
    { 
     // This needs to check to see if the category for the button exists... 
     $query = "SELECT 1 FROM clicks WHERE category = :category"; 
     $prepare = $this->db->prepare($query); 
     $prepare->bindParam(':category', $category); 
     $prepare->execute(); 
     $truth = $prepare->fetch(PDO::FETCH_ASSOC); 

     if(!$truth){ 
      return 0; 
     } 
     else{ 
      return 1; 
     } 
    } 

    public function addClickRow($category) 
    { 
     $clicks = 0; 
     $query = $this->db->prepare("INSERT INTO clicks (category, num) VALUES (:category, :num)"); 
     $query->bindParam(":category", $category); 
     $query->bindParam(':num' , $clicks, PDO::PARAM_INT); 
     $query->execute(); 
    } 

    public function incrementClick($category) 
    { 
     $checked = $this->checkCategory($category); 
     if($checked == 0){ 
      $this->addClickRow($category); 
     } 
     $query = $this->db->prepare("UPDATE clicks SET num = num + 1 WHERE category = :category"); 
     $query->bindParam(":category", $category); 
     $truth = $query->execute(); 
    } 
} 

CODE TLを; DR:

  • ます$ this-> getClicks():クリックデータを返すことになって - この私の問題のメソッドです
  • $ this-> checkCategory():行が存在するかどうかを調べるヘルパー関数、存在しない場合は$this->addClickRow
  • の$ this - > addClickRow():データベースに新しい行を追加し
  • の$ this - > incrementClick():DB
  • FYI

でクリック値をインクリメントし、クラスDatabaseは、単に接続を確立します。ほとんどの機能はこのクラスにあります。また、私は$queryプロパティを使用して停止したようないくつかの矛盾を無視してください。


私はプロジェクトごとに少なくともこの交差点に来るように感じ、それは常に同じ一般的なアイデアです。私は、1つの値を返すメソッドを持つことができ、1つのパラメータを取り込み、すべてがあるまでループします。あるいは、単にすべてを返すパラメータを持たないメソッドを作成し、サーバー/クライアント側でフィルターをかけて、ユーザーが見たいものだけを表示することができます。


短い例:ユーザーが作成した3つのリンクのクリックデータが必要な場合を考えてみましょう。彼らが使用するインターフェースでは、オプションを指定することができます(これらの3つのリンクを簡単に選択し、それらのデータのみを取得することができます。

コードについて:このメソッドは、1つのパラメータを取り、値を取得し、クライアントORサーバ側(ここでは2つの選択肢)にループすることができます。あるいは、メソッドは可変数の引数を取ることができます(そしてsplat演算子でアンパックする)。または、このメソッドは0個のパラメータを取り込み、すべてを戻してから、クライアントまたはサーバー側(別の2つの異なる選択肢)でフィルタリングできます。私は実際にこれらの一般的なアイデアをミックスして一致させることができ、同じ結果を達成するために40の異なる組み合わせがあります。


状況に最も直感的なのはどうすればよいですか?あるいは何らかのベストプラクティスがあります。 1つの値を取得するのが最もモジュラーで柔軟性があるようですが、すべての値を取得する必要がある場合など、柔軟性がなく、実装が面倒な場合もあります.30件のAJAXリクエストを生成するか、単純に1 AJAXリクエストを、サーバ上の別のメソッドに呼び出します。このメソッドは、このretrieveメソッドを30回呼び出します。

この謎を説明する単語がありますか?

編集:長いポストに申し訳ありませんが、キーポイントを保持しながらできるだけ凝縮しようとしました。彼らはで 条件を使用して、あなたのクリックをフィルタする配列と1つのパラメータに関する

+0

私は2つの異なるオプションを使用して、両方に行くだろう:単一の結果のための引数を取り、パラメータが欠落している場合、(すべてを返す機能のいずれか関数がすべての可能な値を "知る"ことができる場合、引数のデフォルト値で行うことができます)、または異なる型の引数をとる関数、配列の場合はすべて結果、単一の場合は単一の値(関数が分からない場合すべての値が何であるか)。しかし、私はコーディング構造理論の専門家ではない – Kaddath

+0

こんにちは、心配しないでください。私はちょうどそれについての意見や他の人の意見を見たいと思っていました。私は他の人からこのことの多くを見ることができないので、他の人がやりたいことや好きなことを尋ねてみたいと思っています。洞察のおかげで、私は実際には、2つの異なるメソッドを作成するのではなく、すべてをデフォルトにすることについて考えることもありませんでした。 – cchoe1

答えて

1

何?。

PHP> = 5.6

function getClicks($categories = []){ 
    $sql = ''; 
    if(!empty($categories)){ 
      $cats = implode(',', $categories); 
      $sql = "SELECT num FROM clicks WHERE category in ({$cats})"; 
    }else{ 
      $sql = "SELECT num FROM clicks"; //Return all row of clicks table 
    } 
    $clicks = $this->db->prepare($sql); 
    $clicks->execute(); 
    $num = $clicks->fetch(PDO::FETCH_ASSOC); 

    print_r($num); 
} 
+0

オハイオ州は、私が考慮しなかった爆縮の素晴らしい使用です。したがって、これは、 'buttonOne、buttonTwo、buttonThree、...'というフィルタの文字列に一致する1つのクエリですべての行を返す必要があります。 1つのすべての3つの問題、素敵な! – cchoe1