返回相关表数据的Php PDO

返回相关表数据的Php PDO,php,mysql,pdo,Php,Mysql,Pdo,我正在绞尽脑汁想如何让一个场景起作用,我让我的用户登录(可以正常工作),当他们点击主页时,他们会看到一个“类别”列表,这些类别是从我的cat_列表表中提取出来的,但他们只会看到与之相关的“类别”。例如,user1可以访问cat1,user2可以访问cat2,user3可以访问cat1和cat2-我需要一种方法来存储这些cat值并允许用户查看它们。所以cat1的id可以是1,cat2的id可以是2,但我不确定这如何转化为使用SQL命令获取数据 以下是我目前如何显示类别 <?php try

我正在绞尽脑汁想如何让一个场景起作用,我让我的用户登录(可以正常工作),当他们点击主页时,他们会看到一个“类别”列表,这些类别是从我的cat_列表表中提取出来的,但他们只会看到与之相关的“类别”。例如,user1可以访问cat1,user2可以访问cat2,user3可以访问cat1和cat2-我需要一种方法来存储这些cat值并允许用户查看它们。所以cat1的id可以是1,cat2的id可以是2,但我不确定这如何转化为使用SQL命令获取数据

以下是我目前如何显示类别

<?php 

try{
    // Selecting entire row from doc_list table
    $results = $dbh->query("SELECT * FROM cat_list ORDER BY cat_title ASC  ");

}catch(Exception $e) {
    echo $e->getMessage();
    die();
}

$docs = $results->fetchAll(PDO::FETCH_ASSOC);

foreach($docs as $docs){  

echo '
    <a href="catView.php?cat_id='.$docs["cat_id"].'">
    <div class="indexBox">
    <div class="indexBoxHeader"><i class="fa fa-phone" style="font-size: 2em;"></i></div>
    <div class="indexBoxFooter">
    <p>
    '.$docs["cat_title"].'
    </p>
    </div>
    </div>
    </a>';}


?> 
我真的很难理解或找出最好的方法来链接它们,并指定谁看到了什么?我已经研究了带有外键的表之间的连接和关系,甚至有一个单独的新表al在一起(规范化)——但是从我上面的内容中,我需要获得从登录中传递的用户$\u会话id,然后获取该值并检查他们可以看到哪些类别

更新

<?
session_start();
if(isset($_SESSION['user'])){
    header("Location:home.php");
    exit;
}


    $dbh=new PDO('mysql:dbname=dashboardr;host=******', '******', '******');
    $email=$_POST['username'];
    $password=$_POST['pass'];

    if(isset($_POST) && $email!='' && $password!=''){
        $sql=$dbh->prepare("SELECT * FROM user_login WHERE username=?");
        $sql->execute(array($email));

    while($r=$sql->fetch()){
        $p=$r['password'];
        $p_salt=$r['psalt'];
        $id=$r['id'];
    }

        $site_salt="subinsblogsalt";
        $salted_hash = hash('sha256',$password.$site_salt.$p_salt);

    if($p==$salted_hash){
        $_SESSION['user']=$id;
      $_SESSION['username']=$email;
      $_SESSION['firstname']=$firstname;

        header("Location:home.php");

    }else{
        echo "<h2>Username/Password is Incorrect.</h2>";
        }
    }
?>

**更新2**

以下是home.php文件,其中需要查看类别:

<?php include 'header.php'; ?>

<?php

if(isset($_SESSION['user'])){ $_SESSION['user']=$id; 
$results = $dbh->query("SELECT * FROM cat_list JOIN user_cats ON cat_id = cat_id WHERE user_id = ? ORDER BY cat_title ASC");




?>

根据您的需求描述,用户和类别具有一对多关系(一个用户可以访问多个类别)-但是用户实际上并不“拥有”类别(多个用户可以访问同一类别),因此您必须有一个中间表来定义两者之间的关系

这是你错过的一点

该表应该如下所示(我的mySQL有点生锈,所以如果有语法错误,请原谅我):

如何填充这取决于您!请注意,不应复制给定用户的cat_ID,否则您将在列表中获得重复的类别

然后,您的结果查询应该如下所示:

$sql=$dbh->prepare(("SELECT A.* FROM cat_list A JOIN user_cats B ON A.cat_id = B.cat_id WHERE B.user_id = ? ORDER BY A.cat_title ASC");
$sql->execute(array($id));
<?php
include('header.php');

if(isset($_SESSION['user'])){

    try {
        /* Note: I would put stuff like this in a common include for all your pages that need DB access */
        $dbh=new PDO('mysql:dbname=dashboardr;host=******', '******', '******');

        $sql=$dbh->prepare(("SELECT A.* FROM cat_list AS A JOIN user_cats AS B ON A.cat_id = B.cat_id WHERE B.user_id = ? ORDER BY A.cat_title ASC");
        $sql->execute(array($_SESSION['user']));
    } catch(Exception $e) {
        echo $e->getMessage();
        die();
    }

    $docs = $sql->fetchAll(PDO::FETCH_ASSOC);

    foreach($docs as $doc_item) {  
        echo '
            <a href="catView.php?cat_id='.$doc_item["cat_id"].'">
            <div class="indexBox">
            <div class="indexBoxHeader"><i class="fa fa-phone" style="font-size: 2em;"></i></div>
            <div class="indexBoxFooter">
            <p>
            '.$doc_item["cat_title"].'
            </p>
            </div>
            </div>
            </a>';
    }
}

?>
其中$id是您从成功登录中获得的用户id

对更新2的响应

对不起,我的mySQL和PHP有点生疏了,我从上面的代码中复制和粘贴了一些你说有效的代码

首先,我的查询中的“A”和“B”是表别名-它们只是使查询更易于阅读,因此您可以编写“A.column\u name”而不是“my\u long\u table\u name.column\u name”。有一个可选的“[AS]”,为了清楚起见,我可能应该包括它,但我习惯于省略它。 有关mySQL中别名的一些信息,请参见此处:

“$id”是您的登录代码中的变量,但它当然只存在于该页面。您已经将其存储在会话变量中,因此只需要从home.php中的会话中检索它。您似乎有点倒退,并且正在将一个不存在的变量分配回会话

我会让home.php看起来更像这样:

$sql=$dbh->prepare(("SELECT A.* FROM cat_list A JOIN user_cats B ON A.cat_id = B.cat_id WHERE B.user_id = ? ORDER BY A.cat_title ASC");
$sql->execute(array($id));
<?php
include('header.php');

if(isset($_SESSION['user'])){

    try {
        /* Note: I would put stuff like this in a common include for all your pages that need DB access */
        $dbh=new PDO('mysql:dbname=dashboardr;host=******', '******', '******');

        $sql=$dbh->prepare(("SELECT A.* FROM cat_list AS A JOIN user_cats AS B ON A.cat_id = B.cat_id WHERE B.user_id = ? ORDER BY A.cat_title ASC");
        $sql->execute(array($_SESSION['user']));
    } catch(Exception $e) {
        echo $e->getMessage();
        die();
    }

    $docs = $sql->fetchAll(PDO::FETCH_ASSOC);

    foreach($docs as $doc_item) {  
        echo '
            <a href="catView.php?cat_id='.$doc_item["cat_id"].'">
            <div class="indexBox">
            <div class="indexBoxHeader"><i class="fa fa-phone" style="font-size: 2em;"></i></div>
            <div class="indexBoxFooter">
            <p>
            '.$doc_item["cat_title"].'
            </p>
            </div>
            </div>
            </a>';
    }
}

?>

$user=$\u POST['var']$_会话['var']=$_POST['var']$id=$\u会话['var']事物类型。这当然是一份草稿。让我们看看你得到了什么,只要登录。类别和用户之间没有关系。那么,你怎么能说一个用户可以访问cat1,另一个用户可以访问cat2等等?@anantkumarsingh我是说这就是我的目标,用户和类别之间的关系是我想要了解的,以及如何最好地处理it@Fred-ii-请参阅我问题的更新部分,这种关系的基础是什么?加入有好处吗?但基础是什么?如果cat id和用户id相同,这意味着用户可以访问该类别-关系正常吗?我已经按照建议创建了表,这很有意义,但是,我不理解您的查询中的A和B。我试图执行代码,但它向我尖叫,未定义的变量:id和als此错误:未捕获异常“PDOException”,消息为“SQLSTATE[23000]:完整性约束冲突:on子句中的1052列“cat_id”在/Applications/MAMP/htdocs/dashboardr v3.1.8/home.php:38堆栈跟踪:#0/Applications/MAMP/htdocs/dashboardr v3.1.8/home.php(38):PDOStatement->execute(Array)#1{main}在第38行的/Applications/MAMP/htdocs/dashboardr v3.1.8/home.php中抛出的
$id
将是用户id所在的任何变量,就像
$\u SESSION['id']
…我很难理解?你能用我上面的代码示例和修正来告诉我你将如何使用你建议的表格进行调整吗?请在我上面的回答中查看我对更新2的额外回复。