Php PDO MySQL Table加入

时间:2015-05-13 09:59:07

标签: mysql

我正在摸不着头脑,因为我的生活无法理解?

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

用户情况:

用户登录并可以看到他们有权访问的类别列表(问题#1),他们点击该类别,并且会有一个与该类别关联的文档列表(问题#2)他们点击该类别doc,他们可以看到doc信息(我所指的doc / docs只是数据库中的行存储,工作正常)。

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

问题#2 - 我已经研究了如何将'doc'分配给一个类别,但只有1,我需要的是'doc'能够在需要时成为多个组的一部分。

以下是我如何设置这一切:

在类别视图页面上,我抓取数据以显示类似的类别:

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

当您单击某个类别时,这就是我查询数据库的方式:

"SELECT * FROM cat_list WHERE cat_id = ?"

我从网址获取了cat id,所以我知道我属于该类别。

在此下面,我正在执行另一个查询,仅显示属于该类别的文档(有效)

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

我希望这有道理吗?

这是我的数据库设置:

Catagory表:

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 ;

更新

<?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();
    }
}

?>

如上所述,我可以返回这些类别中的文档的值,但是我需要它来获取我所在类别的id并通过仅仅分配静态数字来显示结果上面(4,cat_no)“我需要在哪里说数字作为对我所在页面的cat_id的引用

3 个答案:

答案 0 :(得分:2)

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

问题#2 - 我已经研究了如何将“doc”分配给一个类别,但只有1个,我需要的是'doc'能够在需要时成为多个组的一部分。 答案:在您的doc_list表中,将cat_no数据类型更改为文本,并将所有类别值定义为逗号分隔。例如:对于doc1,cat_no将为1,2,3(其中1 2和3是不同的类别ID)。然后你可以使用mysql的FIND_IN_SET找出一个类别或一组类别的文档。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

然后你必须在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。