0

我有 PHP 代码可以从 tbl_categorie 中选择类别,现在我有一个多选形式,其中一篇文章可以有多个类别。在数据库中插入值时,我想将多个类别值存储在一列/属性中。其中 ID_CAT 属性将仅存储 tbl_categorie 的类别 ID,由逗号 (,) 分隔。我在一个数据库中有两个表,

 tbl_blog:                           
  ID_BLOG    ID_CAT               TITLE          ARTICL        DATE
  1          1,3                  title1         article1      2013-03-04
  2          4,10                 title2         article2      2013-03-04 
  3          3,6                  title3         article3      2013-03-04

 tbl_categorie:                           
  ID_CAT    NOM_CAT               
  1          HTML                
  2          CSS                
  3          DESIGN
  4          PHP
  5 ..

尽管我使用了 implode() 语句,但我首先遇到了为一篇文章添加两个 ID_CAT 的问题,但是当我将 ID_CAT 的类型从 int 更改为 varchar 时,她可以工作,这是添加文章的过程:

Article::creatArticle(0,$_POST['title'],implode(', ', $_POST['id_categorie']),$_POST['article']);

这是从 class_article 添加文章的功能:

/**
 * function créeArticle
 */ 
public static function creatArticle($id_article,$title,$id_categorie,$article)
{
    global $db; 
    $req = $db->prepare("INSERT INTO blog (ID_BLOG,TITLE,ID_CAT, ARTICLE,DATE) VALUES ('',:title,:id_categorie,:article,'".date('Y-m-d')."')"); 
    $ok = $req->execute(Array('title' =>$title,'id_categorie' => $id_categorie,'article' => $article));
     return $db->lastInsertId();
    //$erreur = $req->errorInfo();
}

现在我有问题要获取每篇文章中应包含的所有类别,这就是我在后台使用魔术方法 get() 获取文章表的方式,她只返回第一个值中的第一个值:

 <?php
    foreach(Article::getAllArticle()as $blog ){
        $article= new Article($blog->ID_BLOG);
        $categorie = new Categorie($article->getIDCategorie());

        echo'
                    <tr>';
                            echo '<td><input type="checkbox" /></td>';
                            echo '<td>'.$article->getTitlearticle().'</td>';
                            echo '<td>'.$categorie->getNomCategorie().'</td>';
                            echo '<td>'.$article->getDatearticle().'</td>';
                            echo '<td>35</td>';
                            echo ' <td class="actions">';
                            echo '<a href="javascript:editArticle('.$article->getIDarticle().');" title="Edit this content"><img src="img/icons/actions/edit.png" alt="" /></a>';
                            echo ' <a href="javascript:deleteArticle('.$article->getIDarticle().');" title="Delete this content"><img src="img/icons/actions/delete.png" alt="" /></a></td>';
                            echo '</tr>';

                        } ..

我知道我必须使用explode() 语句或制作一个循环,但我无法弄清楚如何:(,而且我怀疑ID_CAT 的类型应该是varchar 导致问题吗?谢谢!

4

2 回答 2

0

很难理解你在做什么以及你想做什么。我不确定您是从 CSV 文件还是从数据库中获取结果?

如果它来自数据库,据我所知,您需要规范化您的数据库表。在博客和类别之间创建一个链接表,这样可以更轻松地返回结果。一个简单的连接 sql 将获取一个类别中的所有文章或获取与该文章关联的所有类别。

tbl_blog:                           
  ID_BLOG                TITLE          ARTICL        DATE
  1                      title1         article1      2013-03-04
  2                      title2         article2      2013-03-04 
  3                      title3         article3      2013-03-04

 tbl_categorie:                           
  ID_CAT    NOM_CAT               
  1          HTML 

tbl_blogcat
 ID_BLOG    ID_CAT 
 1           1
 1           3
 2           4
 2           10

现在可能需要做一些额外的工作,但将来值得。将您的类别存储为逗号分隔的字符串会使搜索变得困难。

于 2013-03-06T21:23:15.813 回答
0

这个问题可以很容易地解决,你可以创建一个新表来存储tbl_blog 和 tbl_catagory的主要 id 的信息。这样做的好处是,当您选择更多类别的博客时,它将存储您的博客每个类别的信息。桌子看起来像......


tbl_combine:

ID_COMB    ID_Blog    ID_Cat
1          1          2
2          1          1
3          1          3
4          2          3
5          2          2
6          3          1
7          3          2
8          3          3


上面我们只放了 3 个博客和 3 个类别。tbl_combine可以在每一行中存储其所选博客的 每个博客类别的主 ID。所以我们可以插入无限类别的博客。不需要爆炸或内爆功能。

然后我们可以检索任何博客类别。查询看起来像。






SELECT
      (SELECT category_name FROM tbl_catagory 
       WHERE id_cat=A.id_cat) 
       AS catagory_name 
FROM tbl_combine 
AS A 
WHERE id_blog=$blog_id





注意我们只存储tbl_blog 和 tbl_catagory表的 id 是tbl_combine它不会慢

于 2013-03-06T21:45:31.230 回答