使用implode和magic __get()从DB存储和获取CSV列

时间:2013-03-06 19:44:17

标签: php mysql get explode implode

我有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 ..

我首先要为一篇文章添加两个ID_CAT,尽管我使用了implode()语句,但是当我将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会产生问题吗? thanx!

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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 它不会慢