2017-08-01 5 views
-1

私は各レベルのすべてのメンバーをカウントする必要があります。私は15レベルの深いコミッションモデルを持っているので、人は自分のダウンラインにいる全チーム。各レベルの会員数を数えたいと思います。 第1レベル10のメンバー、第2レベル55メンバー、第3レベル35メンバーのようなものです。 第1レベル、第2レベル、第15レベルまでの親IDのメンバーの総数を数える必要があります。 は、私はあなたが任意の明確化が必要な場合は、私が説明しますコメントしてくださいどのように15レベルの深さで15レベルのメンバーを数えるかPHPの各レベル

$result = mysqli_query($con, "SELECT count(*) FROM affiliateuser where referedby = '" . $_SESSION['username'] . "' AND active = 1"); 

のような最初のレベルにカウントすることができますよ。 ここで最初の2レベルコードを共有しています。以下のコードを確認してください。

$totalref = 0; 
$totalrefear = 0; 
$query = "SELECT fname,email,doj,active,username,level,pcktaken FROM affiliateuser where referedby = '" . $_SESSION['username'] . "'"; 
$result = mysqli_query($con, $query); 
while($row = mysqli_fetch_array($result)) { 
    $ac = "$row[active]"; 
    $countusername = "$row[username]"; 
    $countuserlevel = "$row[level]"; 
    $pcktook = "$row[pcktaken]"; 
} 
は私がでユーザーをカウントするため、このクエリをしようとしています

$totalrefear = 0; 
$query = "SELECT fname,email,doj,active,level,username FROM affiliateuser where referedby = '" . $_SESSION['username'] . "'"; 
$result = mysqli_query($con, $query); 
while($row = mysqli_fetch_array($result)) { 
    $ac = "$row[active]"; 
    $countusername = "$row[username]"; 
    $countuserlevel = "$row[level]"; 
    $query2level = "SELECT fname,email,doj,active,level,username,pcktaken FROM affiliateuser where referedby = '$countusername'"; 
    $result2level = mysqli_query($con, $query2level); 
    while($row2 = mysqli_fetch_array($result2level)) { 
     $ac2 = "$row2[active]"; 
     $countusername2 = "$row2[username]"; 
     $countuserlevel2 = "$row2[level]"; 
     $pcktook = "$row2[pcktaken]"; 
    } 
} 

ダウンラインユーザの第二レベルのフェッチを開始ダウンユーザーの1レベルのフェッチを開始しました親の第2レベル。しかし、それは私のデータベース全体のユーザーを数えています。私はちょうど2レベルのユーザーを数えたいと思います。私の体は私がそれを解決するのを助けますか?

$queryridd =mysqli_query($con, "SELECT COUNT(Id) AS countt, level AS Lebel from affiliateuser WHERE level = '$countuserlevel' GROUP BY level"); 
+2

分かりやすいコードインデントが良い考えです。 このコードを読むと、コードをデバッグするのに役立ちます**。 [コーディング標準を素早く見てください](http://www.php-fig.org/psr/psr-2/)を参考にしてください。 このコードを数週間/数ヶ月で修正するように求められ、最終的に私に感謝します。 – GrumpyCrouton

+4

[Little Bobby](http://bobby-tables.com/)によると** [あなたのスクリプトはSQLインジェクション攻撃の危険にさらされている](http://stackoverflow.com/questions/60174/how-cani-i- PHPでのSQLインジェクション防止)**。 [MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)の[Prepared Statements](http://en.wikipedia.org/wiki/Prepared_statement)について学んでください。 ** [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)**でも安全ではありません! – GrumpyCrouton

+0

期待される出力と実際の出力は何ですか? – GrumpyCrouton

答えて

0

あなたがPARENT_IDフィールドを持っていると仮定すると、別のレベル

<?php 

$query = "SELECT fname,email,doj,active,level,username FROM affiliateuser where referedby = '" . $_SESSION['username'] . "'"; 
$result = mysqli_query($con, $query); 
while($row = mysqli_fetch_array($result)) { 
    $ac = "$row[active]"; 
    $countusername = "$row[username]"; 
    $countuserlevel = "$row[level]"; 
    // use if to check the level 
    if($countuserlevel == 2) { // use if to check the level 

     $query2level = "SELECT fname,email,doj,active,level,username,pcktaken FROM affiliateuser where referedby = '$countusername'"; 
     $result2level = mysqli_query($con, $query2level); 
     while($row2 = mysqli_fetch_array($result2level)) { 
      $ac2 = "$row2[active]"; 
      $countusername2 = "$row2[username]"; 
      $countuserlevel2 = "$row2[level]"; 
      $pcktook = "$row2[pcktaken]"; 
     } 

     $queryridd = mysqli_query($con, "SELECT COUNT(Id) AS countt, level AS Lebel from affiliateuser WHERE level = '$countuserlevel' GROUP BY level"); 
     while($rowbb = mysqli_fetch_array($queryridd)) { 
      $countingUsers2 = "$rowbb[0]"; 
     } 

    } 
} // use if to check the level 
?> 
<td class='text-left'><?php echo $countingUsers2; ?></td> 
+1

潮を回して、乱暴で危険なコーディングを教える/伝播させないようにします。 準備文なしで回答を投稿した場合[投稿前にこれを検討してください](http://meta.stackoverflow.com/q/344703/)。 さらに、[もっと貴重な答えは、正しい方法をOPに表示することによって得られる](https://meta.stackoverflow.com/a/290789/1011527)。 – GrumpyCrouton

+1

[Little Bobby](http://bobby-tables.com/)によると** [あなたのスクリプトはSQLインジェクション攻撃の危険にさらされています](http://stackoverflow.com/questions/60174/how-cani-i- PHPでのSQLインジェクション防止)**。 [MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)の[Prepared Statements](http://en.wikipedia.org/wiki/Prepared_statement)について学んでください。 ** [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)**でも安全ではありません! – GrumpyCrouton

+0

問題は解決していませんが、私は各レベルのメンバーを数えたいと思います。たとえば、ログインしてダッシュボードに15レベルあります。だから私はあなたの15レベルの各レベルでメンバーを数えたいと思います。基本的に、私はMLMソフトウェアを作成しています。私はすでに最初の2レベルのコードを共有しました。確認してください。 –

0

に進む前に、あなたが見ているものと同じPARENT_IDてきたどのように多くのレコードのカウントのレベルをチェックするためにifを使用してください。次のレベルを下げるには、今取得したレコードごとに繰り返します。

今、あなたはどうやってそれをしますか?

まず、データベースを正しく計画する必要があります。ツリー構造を作るには、simple parent - child using recursion, to materialized path, to nested setsから多くの方法があります。それぞれに長所と短所があります。私は個人的に実現した道が好きです。アプリケーションのツリーの深さによって親子のバリエーションが増える可能性があります。

データベースの構造はどのようになっていますか?

Superheroes 
---------- 
id   <--\ 
parent_id ---/ 
name 

あなたがそうのような階層持っているのであれば:

      1 Steven Rogers 
         /   \ 
        2 Bruce Banner  3 Wally West 
       /  \ 
     4 Peter Parker  5 Jay Garrick 
     /  \ 
6 Barry Allen 7 Reed Richards 

をあなたのテーブルがそうのようになります直接スティーブ・ロジャースを下回っている人を見つけるために

 superheroes 
     ----------- 
id parent_id name 
1 0   Steven Rogers 
2 1   Bruce Banner 
3 1   Wally West 
4 2   Peter Parker 
5 2   Jay Garrick 
6 4   Barry Allen 
7 4   Reed Richards 

$sth = $dbh->prepare("select id,name from superheroes where parent_id=?"); 
$sth->execute(array(1)); 
$result = $sth->fetchAll(); 

Pの直下にいる人を見つけるにはエターパーカー、

$sth = $dbh->prepare("select id,name from superheroes where parent_id=?"); 
$sth->execute(array(4)); 
$result = $sth->fetchAll(); 

偉大な、それは1つのレベルを取得します。どのように次のレベルを取得するのですか?これは関数の仕事です。(。スコープが対処するのは非常に簡単であるため、実際には、クラスは、はるかに良いでしょう)

class CountDownLine { 

    public function __construct($database) { 

     $this->db = $database; 
    } 

    public function getDownline($id, $depth=2) { 

     $stack = array($id); 
     for($i=1; $i<=$depth; $i++) { 

      // create an array of levels, each holding an array of child ids for that level 
      $stack[$i] = $this->getChildren($stack[$i-1]); 
     } 

     return $stack; 

    } 

    public function countLevel($level) { 

     // expects an array of child ids 
     settype($level, 'array'); 

     return sizeof($level); 
    } 

    private function getChildren($parent_ids = array()) { 

     $result = array(); 
     $placeholders = str_repeat('?,', count($parent_ids) - 1). '?'; 

     $this->$db->prepare("select id from superheroes where parent_id in ($placeholders)"); 
     $this->$db->->execute(array($parent_ids)); 

     while($row=$this->$db->fetch()) { 

      $results[] = $row->id; 
     } 

     return $results; 
    } 

} 

しくみはこうだ:

$DL = new CountDownLine(new Database); // inject your favorite database abstraction 

$id = 1; // ie, id of Steve Rogers 
$depth = 2; // get the counts of his downline, only 2 deep. 

$downline_array = $DL->getDownline($id, $depth=2); 

// => $downline_array[1] = [2,3] 
// => $downline-array[2] = [4,5] 

$count_of_first_level = $DL->countLevel($downline_array[1]); 
$count_of_second_level = $DL->countLevel($downline_array[2]); 

注:これは概念を示すことです。私はデータベース上でそれをテストしなかった。あなたは、あなたのデータベースアクセスの方法で動作するようにそれを適応させる必要があります。

関連する問題