【问题标题】:Php PDO returning related table dataphp PDO 返回相关表数据
【发布时间】:2015-05-13 18:08:54
【问题描述】:

我正在为如何让一个场景工作而摸不着头脑只能看到它们关联的“类别”。例如,user1 可以访问 cat1,user2 可以访问 cat2,user3 可以访问 cat1 和 cat2 - 我需要一种方法来存储这些 cat 值并允许用户查看它们。所以 cat1 的 id 可能是 1,而 cat 2 的 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>';}


?> 

我的表格是这样组成的:

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 `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
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

我真的很难理解或找出链接它们并指定谁看到什么的最佳方式?我已经研究了 JOINS 以及具有外键的表之间的关系,甚至还有一个单独的新表(规范化) - 但是从上面的形式我需要获取从登录传递的用户 $_SESSION 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");




?>

【问题讨论】:

  • $user = $_POST['var']; $_SESSION['var'] = $_POST['var']; $id=$_SESSION['var']; 类型的东西。这当然是一个粗略的草稿。向我们展示你得到了什么,就登录而言。
  • 类别和用户之间没有关系。那么你怎么能说一个用户可以访问 cat1 而另一个是 cat2 等等呢?
  • @anantkumarsingh 我是说这就是我想要达到的目标,用户和类别之间的关系是我想要达到的目标以及如何最好地接近它
  • @Fred-ii- 请参阅我的问题的更新部分
  • 这种关系的基础是什么?加入有好处吗?但什么是基础?如果 cat id 和 user id 相同,则表示用户可以访问该类别 - 这种关系是否正常?

标签: php mysql pdo


【解决方案1】:

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

这是你缺少的一点!

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

CREATE TABLE `user_cats` (
  `user_id` int(11) NOT NULL,
  `cat_id` int(11) NOT NULL,
);

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

您的结果查询应如下所示:

$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));

其中 $id 是您从成功登录获得的 user_id。

对更新 2 的响应

抱歉,我的 mySQL 和 PHP 有点生锈了,我正在从您上面的代码中复制并粘贴一些您说可以正常工作的部分。

首先,我的查询中的“A”和“B”是表别名——它们只是使查询更易于阅读,因此您可以编写“A.column_name”而不是“my_long_table_name.column_name”。为了清楚起见,我可能应该包含一个可选的“[AS]”,但我习惯于省略它。 有关 mySQL 中别名的一些信息,请参见此处:http://www.techonthenet.com/mysql/alias.php

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

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

<?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>';
    }
}

?>

请注意,我已将 foreach 循环中的迭代器变量更改为“$doc_item”,因为在我看来使用与数组相同的变量是一个错误!

【讨论】:

  • 我已经按照建议创建了表格,这是有道理的,但是我在您的查询中不理解 A. & the B.
  • 我试图执行代码,但它对我尖叫未定义变量:id 和此错误:未捕获异常 'PDOException' 并带有消息'SQLSTATE [23000]:完整性约束违规:1052 列/Applications/MAMP/htdocs/dashboardr v3.1.8/home.php:38 中的 on 子句中的“cat_id”不明确”堆栈跟踪:#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 的任何变量,例如 $_SESSION['id']...
  • 我很难理解?您能否使用我上面的代码示例并修改以向我展示如何使用您建议的表格进行调整?
  • 请在上面的回答中查看我对您的 UPDATE 2 的额外回复。
猜你喜欢
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2013-03-08
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多