Php:分组并添加错过的字段

时间:2016-07-26 08:47:05

标签: php mysql

我在数组中有这样一个表:

cid plugin  lang_id     name    father  
1   Newspage    1   Actualidad  1
1   Newspage    2   News    1
2   Newspage    1   Tecnologia  1
2   Newspage    2   Tech    1
3   Newspage    1   Deportes    1
3   Newspage    2   Sports  1
4   Newspage    1   Ocio    1

在此示例中,有两种语言(1:西班牙语和2:英语),但管理员可以添加更多语言

我想做一个"修改类别"部分并通过CID对其进行分组,并为每种语言输入框,如果错过的语言我想显示空输入以添加错过的语言。

这样的事情: http://i.imgur.com/fGCUgKc.png

我的实际不良代码就是这样:

    $content = "<div class='catlist'>";     
$content .= "<p>{$LANGDATA['L_NEWS_MODIFIED_CATS']}</p>";
$query = $db->select_all("categories", array ("plugin" =>  "Newspage", "lang_id" => 1)); 

while ($cat_grouped = $db->fetch($query)) {
    $content .= "<form id='cat_mod' method='post' action=''>";
    $content .= "<div>";

    foreach ($langs as $lang) {
        if ($lang['lang_id'] == $cat_grouped['lang_id']) {
            $content .= "<label>{$lang['lang_name']}</label> <input type='text' name='{$lang['lang_id']}' value='{$cat_grouped['name']}' />";
        } else {                                   
            $query2 = $db->select_all("categories", array ("plugin" =>  "Newspage", "cid" => "{$cat_grouped['cid']}", "lang_id" => "{$lang['lang_id']}"));
            if($db->num_rows($query2) <= 0) {
                $content .= "<label>{$lang['lang_name']}</label> <input type='text' name='{$lang['lang_id']}' value='' />";
            } else {
                $other_lang_cat = $db->fetch($query2);
                $content .= "<label>{$lang['lang_name']}</label> <input type='text' name='{$lang['lang_id']}' value='{$other_lang_cat['name']}' />";
            }
        }
    }
    $content .= "<input type='hidden' name='cid' value='{$cat_grouped['cid']}' />";
    $content .= "<input type='submit' name='ModCatSubmit' value='{$LANGDATA['L_NEWS_MODIFY']}' />";
    $content .= "</div></form>";
}
$content .= "</div>";

此:

$db->select_all(...);

平均     $ db-&gt; select_all(&#34; table&#34;,$ WHERE,...)

我想在一个查询中检索所有内容并在php中完成工作

我的实际代码非常糟糕,假设lang_id=1存在于每个条目中,并且几乎没有查询!呵呵!

我的旧代码使用&#34; GROUP BY cid&#34;对于第一个查询而不需要使用&#34; lang_id = 1&#34;但系统升级后该行会出错:

报告:SELECT列表的表达式#3不在GROUP BY子句中,并且包含非聚合列

并且不想再次使用。

任何想法最好的方法吗?

2 个答案:

答案 0 :(得分:0)

我不知道你的数据库是什么,所以我正在写一个伪代码。

首先,我将使用分页来限制数据库查询,例如每页10/20个短语。所以查询将是:

SELECT * FROM language_phrases WHERE cid IN (
    SELECT DISTINCT cid FROM language_phrases WHERE plugin = 'Newspage'
    LIMIT 0,10
)

然后我将首先使用数据库中的数据来获取cid值:

$cid = array();
$strings = array();

while($row = $db->fetch($result))
{
    if(!in_array($cid,$row["cid"]))
    {
        $cid[] = $row["cid"];
    }
    $strings[]= array(
        "cid" => $row["cid"],
        "lang_id" => $row["lang_id"],
        "name" => $row["name"],
        "father" => $row["father"]
    );
}

然后我会在我的缓冲区中将此表和不同的cid放在此页面中。然后PHP将完成剩下的工作:

foreach($cid as $idx=>$key)
{ 
   $values = array_filter($strings,function($d) use ($key) { 
       return $d["cid"] == $key; 
   });
   // build the form with the $values array.
}

答案 1 :(得分:0)

这个问题令人头疼,但我制作了另一个版本,只有一个查询。

我稍后会检查Taha Paksu版本/方式(谢谢!)

   $content = "<div class='catlist'>";     
$content .= "<p>{$LANGDATA['L_NEWS_MODIFIED_CATS']}</p>";
$query = $db->select_all("categories", array ("plugin" =>  "Newspage"), "ORDER BY cid"); 

$cats = [];
$catsids = [];
while ($cats_row = $db->fetch($query)) {
    $cats[] = $cats_row;  
    $catsids[] = $cats_row['cid'];
}
$catsids = array_unique($catsids);
$foundit = 0;
foreach ($catsids as $catid) {
    $content .= "<form id='cat_mod' method='post' action=''>";
    $content .= "<div>";         
    foreach ($langs as $lang) {   
        foreach ($cats as $cat) {                    
            if (($catid == $cat['cid']) && ($cat['lang_id'] == $lang['lang_id'])) {
                $content .= "<label>{$lang['lang_name']}</label> <input type='text' name='{$lang['lang_id']}' value='{$cat['name']}' />";
                $foundit = 1;
            }                   
        }
        if ($foundit == 0) {
            $content .= "<label>{$lang['lang_name']}</label> <input type='text' name='{$lang['lang_id']}' value='' />";
        }                   
        $foundit = 0;                
    }
    $content .= "<input type='hidden' name='cid' value='$catid' />";
    $content .= "<input type='submit' name='ModCatSubmit' value='{$LANGDATA['L_NEWS_MODIFY']}' />";
    $content .= "</div></form>";   
}