2012-08-14 35 views
0

我用簡單的方法解釋這個問題有點困難,所以解釋會很長。 如果評論有用或不可用(簡單是或否),用戶可以投票,當他這樣做時,他的投票將發送到數據庫 - >表'user_vote'。Codeigniter 2.1 - 在foreach循環中使用爆炸

user_vote有兩列 - user_id和container。每個用戶在此表中只有一行。當他投新票時,現場容器被更新。例如,與ID 205評論用戶投票和他投,並與ID 300評論他投沒有。 表user_vote將看起來像這樣:

user_id-> 111;

容器 - > 205 - 是的,300沒有

這是工作的罰款,直到這個代碼在這裏,在這裏我需要檢查,如果用戶已經在特定的評論投票。此代碼工作部分 - 問題是以下幾點:

是用戶已經投3時間,如果註釋的ID匹配$拆分[0]將一次性寫$文本,它會產生2一套按鈕,如果ID的評論不匹配,它會產生3組按鈕(部分elseif工作正常)。

我在做什麼錯,我該如何以正確的方式編寫代碼?

<div class="zuta_strana_komentar_korisno" data-id="<?php echo $cmm['id_comment'] ?>"> 
    <?php if(isset($glas) && !empty($glas)) : 
    $br = explode(',', $glas->container); 
    foreach($br as $br) :         
    $split = explode('-', $br); 
    if($split[0] == $cmm['id_comment']) : ?> 
    <?php 
    if($split[1] == 'yes') : 
    $text = 'koristan.'; 
    else : 
    $text = 'nekoristan.'; 
    endif; 
    ?> 
    <p>Ovaj komentar vam je bio <?php echo $text ?></p> 
    <?php else :?> 
    <p>Da li vam je ovaj komentar bio od pomoći?</p> 
    <button role="yes">Da</button><button role="no">Ne</button> 
    <?php 
    endif; 
    endforeach;    
    elseif($this->session->userdata('is_logged_in') == TRUE && empty($glas)) : ?> 
    <p>Da li vam je ovaj komentar bio od pomoći?</p> 
    <button role="yes">Da</button><button role="no">Ne</button> 
    <?php endif ?> 
    </div> 
+0

一個手柄,我認爲這個問題是在'中的foreach($ br as $ br):'把它改成foreach($ br as $ br_value):' - 那麼你也需要在這個循環中把所有$ br改爲$ br_value。 – TigerTiger 2012-08-14 10:34:55

回答

1

你根本不當設計數據庫。良好的數據庫設計不會在字段中使用逗號分隔的列表存儲信息。通過將數據存儲在逗號分隔的列表中,您實質上將取消所有數據庫的查詢功能。使用表格,這就是爲什麼你給他們!

我建議創建表:userscommentsvotes

users表包含idusername ...等領域

comments表包含idbodyuser_id中...其他領域

votes表包含idcomment_iduser_idyes_or_no ...等領域

然後得到關於如何正確使用SQL Joins

+0

我設法解決了這個問題,但我發現你的建議非常有用。我設計DB的方式背後的想法是有一個小表 - >一個用戶只使用一行。我想逃避一個用戶投票(例如)百萬次的情況。如果每個投票都有唯一的ID,它將創建百萬行 - 僅針對一個用戶,並且如果有很多用戶,DB將會非常非常大。我沒有設計數據庫的培訓,所以我使用自己的邏輯,而我的邏輯並不總是合乎邏輯的:D。謝謝你的建議 :)。 – Sasha 2012-08-15 11:25:58

+0

我的榮幸。用PHP保護你的數據庫寫入;在您對投票表執行寫操作之前,請先計算用戶對該特定評論已有多少票。如果計數太高,拒絕寫入併發送用戶相應的錯誤消息,否則接受寫入。這將使您的投票表的大小保持較低(相對而言)。 – 2012-08-15 16:40:44

0

所有你需要做的是改變

$br = explode(',', $glas->container); 
foreach($br as $br) :         

$br_lines = explode(',', $glas->container); 
foreach($br_lines as $br) :         

但你真的需要你的PHP邏輯從HTML第一分開。我的眼睛想流血似乎太神了。

+0

這個解決方案不起作用(一切都以同樣的方式工作)。它對我的眼睛有同樣的效果,但直到我弄清楚,它會保持這種方式。 – Sasha 2012-08-14 11:03:43

0

試試這個代碼:

<?php if(isset($glas) && !empty($glas)) { 
    $br = explode(',', $glas->container); 
    foreach($br as $b) {         
     $split = explode('-', $b); 
     if($split[0] == $cmm['id_comment']) { 
     ?> 
     <p>Ovaj komentar vam je bio <?php echo ($split[1] == 'yes')?'koristan.':'nekoristan.'; ?></p> 
     <?php } else {?> 
     <p>Da li vam je ovaj komentar bio od pomoći?</p> 
     <button role="yes">Da</button><button role="no">Ne</button> 
     } 
    } 
}