2012-12-03 116 views
0

所以我有一個從數據庫中有值的表:PHP和HTML表格邏輯

$result=mysql_query("SELECT * FROM database WHERE date = '$period'") or die (mysql_error()); 
while ($row_result = mysql_fetch_array($result) { 
    $article = $row_result['article']; 
    ... 
    //It shows something like this: 

id | article | some more data | 
4 | 1234 | data   | 
8 | 654  | data   | 
9 | 654  | data   | 

每行顯示,但現在我想什麼做的是顯示每個凝聚了一些文章後,另一行值,但是如果商品編號相同,則會在例如那兩個之後顯示一行。我不知道現在有多少商品編號是相同的,但如果它們在一張表中相互顯示,並且它們具有相同的值,那麼我想在它們之後顯示一行。

首先,我做了這樣的事情:

$article2 = ""; 
if ($article2 != $article) { 
    <td>...</td> 
     ..... 
} 
$article2 = $article; 

但是,這是獨一無二的文章有用,它顯示的文章之後,一個額外的行,但如果我有一個5行與同一篇文章也顯示了額外的在第一篇文章後排。像這樣:

id | article | some more data | 
    4 | 1234 | data   | 
extra | 1234 | sum data  | 
    8 | 654  | data   | 
extra | 654  | sum data  | 
    9 | 654  | data   | 

我需要一些邏輯的幫助,理解額外的行只在每個不同的物品編號後顯示。我希望你們明白我在做什麼:)我會感謝一些幫助。

+2

不可以用文章ID 1234,654分組嗎? – vodich

+0

您正在使用[an **過時的**數據庫API](http://stackoverflow.com/q/12859942/19068)並應使用[現代替換](http://php.net/manual/en/ mysqlinfo.api.choosing.php)。我們無法看到'$ period'來自哪裏,但是你也可能容易受到[SQL注入攻擊](http://bobby-tables.com/)**的影響,即現代API會使[防衛](http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php)你自己。 – Quentin

+0

謝謝你的提示:)。 – Myt

回答

0

!更新了您的意見。

$result=mysql_query("SELECT * FROM database WHERE date = '$period' ORDER BY ABS(machine),shift,id,article ASC"); 

$currentArticle = 0; 
while ($row = mysql_fetch_array($result)) { 
    if ($row['article']!=$currentArticle) { //check1 
     if ($currentArticle != 0) { //check2 
      //show extra row for article > $currentArticle 
      //your query doesnt contain this article, but I guess that is correct? 
      $result_kogus = mysql_query("SELECT SUM(amount), SUM(reject), SUM(work) FROM database WHERE date = '$periood' AND machine = '".$row['machine']."' AND order = '".$row['order']."'") or die (mysql_error()); 

      //print row 
     } 

     $currentArticle = $row['article']; 
    } 
    //show regular row 
} 

if ($currentArticle != 0) { //check 3 > print summary after last row 
    $result_kogus = mysql_query("SELECT SUM(amount), SUM(reject), SUM(work) FROM database WHERE date = '$periood' AND machine = '".$row['machine']."' AND order = '".$row['order']."'") or die (mysql_error()); 

    //print row 
} 



//What would happen on your example data: 
//id | article | some more data | 
//4 | 1234 | data   | 
//8 | 654  | data   | 
//9 | 654  | data   | 

//round 1, article 1234 
//check1 = true (1234!=0) 
//check2 = false (0!=0) 
//currentArticle is changed to 1234 
//regular row printed 

//round2, article 654 
//check1 = true (654!=1234) 
//check2 = true (1234!=0) 
//query is executed 
//summary is printed for 1234 
//currentArticle is changed to 654 
//regular row printed 

//round3, article 654 
//check1 = false (654!=654) 
//regular row printed 

//loop ends 

//check3 = true (654!=0) 
//query is executed 
//summary is printed for 654 
+0

我無法通過文章訂購它們,因爲還有其他字段需要對數據進行排序。 $ result = mysql_query(「SELECT * FROM database WHERE date ='$ period'ORDER BY ABS(machine),shift,id ASC」);我在那之前留下了這個命令,對不起。我在while循環中做了一個新的查詢:\t $ result_kogus = mysql_query(「SELECT SUM(amount),SUM(reject),SUM(work)FROM database WHERE date =' $ row ['order']。「'」)或者die(mysql_error()); $ row ['machine']。''AND order ='「。但這裏按文章排序不再有幫助。有什麼建議麼 ? – Myt

+0

那麼,這個邏輯仍然適用。但是這意味着「在開始一篇新文章之前顯示這一行」。 EG:它將顯示文章x的3次,然後是x的彙總行,然後是文章y的兩倍,然後是文章y的彙總行,然後是文章x和文章x的另一個彙總行。但總是有一個變化,通過訂購另一個col,它會自動正確地爲物品排序。或者使用兩個命令。 ORDER BY ABS(機器),文章 –

+0

嗯......當我添加邏輯的時候,它仍然不能按照我想要的方式工作,然後在每篇文章後面顯示彙總行。儘管如此,:)仍然感謝您的幫助 – Myt

0

確保$article2="";是外循環,這樣的:

$article2=""; 
while ($row_result = mysql_fetch_array($result) { 
    $article = $row_result['article']; 
    //... 
    if ($article2 != ($article || "")) { 
    print "<td>...</td>"; 
    print " ..... "; 
    } 
    $article2 = $article; 
    //... 
} 

而且你還需要檢查第一循環與!= ""