Php PDO MySQL Table joins



我在某些东西上挠头,一生无法弄清楚吗?

我正在在工作中构建一个小应用程序,就像一个迷你CMS。这是它的工作原理。

用户情况:

用户登录并可以看到他们可以访问(第1期)的类别列表,他们单击该类别,并且将有与该类别相关联的文档列表(第2期),他们单击该类别Doc,他们可以看到DOC信息(我指的是Doc/Docs只是数据库中的行商店,并且正常工作)。

问题1-我不确定如何限制用户看到某些类别或控制对这些类别的访问。

第2期 - 我已经确定了如何将'doc'分配给类别,但只有1个,而我需要的是"文档",可以在需要时能够成为多个组的一部分。

这是我设置所有内容的方式:

在"类别查看"页面上,我获取数据以显示类别:

"SELECT * FROM cat_list ORDER BY cat_title ASC"-我需要限制用户看到的类别。

单击类别时,这就是我查询db的方式:

"SELECT * FROM cat_list WHERE cat_id = ?"

我从URL获取猫ID,所以我知道我属于该类别。

在此下方,我正在做另一个查询以显示属于该类别的文档(有效)

"SELECT doc_list.doc_title, doc_list.cat_no, doc_id FROM doc_list WHERE cat_no = ?"-但是问题在doc_list表中我有一个称为cat_no的列,它是cat的ID,我只能在一个docs可能的多个类别的aprt时存储1个。

我希望这有意义吗?

这是我的数据库设置:

类似表:

CREATE TABLE `cat_list` (
`cat_id` int(11) NOT NULL,
  `cat_title` varchar(32) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf16 AUTO_INCREMENT=5 ;

文档表:

CREATE TABLE `doc_list` (
`doc_id` int(11) NOT NULL,
  `doc_title` varchar(50) NOT NULL,
  `doc_content` text NOT NULL,
  `doc_created` datetime NOT NULL,
  `doc_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `user_id` int(11) NOT NULL,
  `cat_no` int(11) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf16 AUTO_INCREMENT=122 ;

用户表:

CREATE TABLE `user_login` (
`id` int(11) NOT NULL,
  `username` text NOT NULL,
  `firstname` varchar(30) NOT NULL,
  `lastname` varchar(50) NOT NULL,
  `password` varchar(64) NOT NULL,
  `psalt` text NOT NULL,
  `role` int(11) NOT NULL
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

update

<?php require_once '../db_con.php'; 
if(!empty($_GET['cat_id'])){
    $cat = intval($_GET['cat_id']);
try{
    $results = $dbh->prepare("SELECT * FROM doc_list WHERE FIND_IN_SET(4, cat_no)"); // I need that number in the FIND_IN_SET to refelct the category I am in
    $results->bindParam(1, $cat);
    $results->execute();
    } catch(Exception $e) {
    echo $e->getMessage();
    die();
    }
    $doc = $results->fetchAll(PDO::FETCH_ASSOC); 
    if($doc == FALSE){
        echo '<div class="container">';
        echo "<img src='../img/404.jpg' style='margin: 40px auto; display: block;' />";
        echo "<h1 style='margin: 40px auto; display: block; text-align: center;' />Oh Crumbs! You upset the bubba!</h1>";
        echo '<a href="userList.php"  style="margin: 40px auto; display: block; text-align: center;">Get me outta here!</a>';
        echo'</div>';
        die();
    }
}
?>

您可以返回这些类别中文档的值上面(4,cat_no)"我需要它说数字以作为对页面cat_id的参考,我在

问题#1-我不确定如何限制用户看到某些类别或控制他们对这些类别的访问。答案:为用户创建一些角色,并将这些角色分配给每个用户。根据用户的角色,您可以限制用户查看特定类别。

第2期 - 我已经弄清楚了如何将'doc'分配给类别,但只有1个,而我需要的是" doc",可以在需要时能够成为多个组的一部分。答案:在您的DOC_LIST表中,将CAT_NO数据类型更改为文本,并将所有类别值定义为逗号分隔。例如:对于DOC1,CAT_NO为1,2,3(其中1 2和3是不同的类别ID)。然后,您可以使用MySQL的Find_in_set来找出类别或一组类别的文档。

请参阅@prembaranwal的评论,后者帮助我回答了自己的问题

我认为您希望能够在多个类别上使用文档。

然后,您必须在doc_list和cat_list之间添加额外的表格,说:

category_documents (table) with columns:
cd_id (pk)
cat_id (key of cat_list)
doc_id (key of doc_list)

您现在可以在多个类别上使用文档。

现在在doc_list表中放置cat_no。

最新更新