0

我对 PHP 和 MYSQL 非常陌生。我知道我应该使用 MYSQLI,但在这种情况下我没有那个选项,所以请多多包涵!

我的 MYSQL 数据库中有三个表,如下所示:

表 A 用户 ID | 话题 | 日期 | 评分

表 B 用户 ID | 用户名 | 用户电子邮件

表 C 主题 | 描述

然后我的 PHP 页面有一个表格,表格显示 TableA 中的信息,每行都有一个“详细信息”按钮。

我想要做的是,如果单击详细信息按钮,则根据该行中的主题显示表 B 和 C 的组合信息。

例如。下图说明了页面上的表格,如果您单击主题 2 行中的按钮,则会出现第二个表格,其中包含选择主题 2 的所有用户的列表。

|主题|用户ID|日期|详情|

| 2 | 01 | 2012 年 11 月 11 日 | 按钮在这里|

| 3 | 02 | 12-11-2012 | 按钮在这里|

| 2 | 03 | 11-01-2012 | 按钮在这里|

| 5 | 04 | 11-08-2012 | 按钮在这里|

单击第一行中的按钮时:

| 用户名 | 用户名 | 用户邮箱 | 话题 |

| 01 | 名称01 | 用户邮箱 1 | 主题描述|

| 03 | 名称03 | 用户邮箱 3 | 主题描述|

我对第一个表的编码如下所示:

    $query = mysql_query("SELECT * FROM course ORDER BY cname") or die ("error");

    echo '</br><h4 align="center"> Listing </h4></br>';     
    echo'<form action="'.$_SERVER['PHP_SELF'].'" method="POST">
<table border="1" width="50%" align="center"> 
<tr>
    <td>
        <h4>Topic</h4>
    </td>
    <td>
        <h4>UserID</h4>
    </td>
    <td>
        <h4>Details</h4>
    </td>
    </tr>';
        while ($row=mysql_fetch_array($query))
            {
            echo'<tr>
        <td>
                       '.$row['topic'].'
        </td>
        <td>
        <form action="'.$_SERVER['PHP_SELF'].'" method="post">
                     '.$row['Description'].'  
                    </td> 
                    <td>    
                    <align="center">
                    <input type="submit" name="list"  value=" button" />
        </form>
        </td>
        </tr>';
    }

拜托,谁能帮我下一步该怎么做?

我知道我应该使用联接,但不确定是哪一种或如何使用。按钮必须以某种方式知道它们在哪一行,以便知道必须显示哪些主题信息,但我不知道如何实现。

4

1 回答 1

0

我不能完全理解你在问什么,也不能理解这些表格是如何相互关联的。我假设表 B 是用户数据库表,表 A 就像一个主题数据库表,我还假设表 C 是对表 A 的注释。这种关系正确吗?(随着我对到底发生了什么越来越清楚,我将编辑这篇文章)。

编辑1:这是你在说什么?正如我已经评论过的,我不明白第三张表用于这样的事情吗?

$sql = "SELECT * FROM table_a WHERE Topic=10";
$ans = mysql_query($sql) or die(mysql_error())

while($result = mysql_fetch_assoc($ans)){

}

mysql_free_result($ans)

编辑 2:为了加快这种交流,我将简要介绍一下我所知道的关于连接表的所有内容。

有几种方法可以从多个表中选择数据,您可以使用最适合您的目的的方法。

假设我们有以下表格设置:

Users : user_id, username, user_email
Topics: topic_id, user_id, topic_title, topic_text
Posts: post_id, topic_id, user_id, post_text

这是我经常处理的 PhpBB 的设置。第一个表很简单,它是用户信息表,存储有关用户的所有信息。第二个是发布的主题列表,仅提供标题的基本信息以及发布者。第三个是重要的,是除原始主题之外的所有帖子。例如,标题为“谁将在战斗中获胜……”的主题,文本为“超人或蝙蝠侠”,在 topic_title 中仅包含“谁将在战斗中获胜……”,在 topic_text 中包含“超人或蝙蝠侠” ,而对“蝙蝠侠”主题的第一条评论将在帖子表中。

现在,假设我在我的论坛板上,所以我想查看所有的主题来决定我应该在哪里发帖。这是通过

$sql = "SELECT t.*,u.username FROM topics t, users u WHERE u.user_id=t.user_id";
$ans = mysql_query($sql);

while($result = mysql_fetch_assoc($ans)){
     echo $result['topic_title'].' | '.$result['username'].'<br />';
}

这是连接表的最基本版本。它说我要从主题中选择所有内容,并从用户表中的 user_id 列与主题表中的 user_id 列相同的用户中选择用户名。还有另一种写法,但现在让我们关注基础知识。

这会给你这样的结果

Who would win in a fight... | Bob123
If you could go anywhere in the world | Jose567
Where is the most awkward place you've ever sneezed | Sneezerella

我没有放入代码来使标题可点击,但假设您了解 HTML,那应该不难。所以现在假设我们点击了这些链接之一,它看起来应该类似于

<a href="viewtopic.php?t=1">Who would win in a fight...</a>

所以,我们现在在 viewtopic.php 上,被传递了一个参数,t。然后我们将采取 t 并像这样进行:

//Assuming connections somewhere up here

$sql = "SELECT t.*,u.username FROM topics t, users u WHERE u.user_id=t.topic_id AND t.topic_id=".$_GET['t']; //This should look familiar, also remember to sanitize your MySQL data, don't just tack it on straight from the $_GET variable like I did. I'm typing this while dealing with my 8 month old
$ans = mysql_query($sql) or die(mysql_error());
$first_post = mysql_fetch_assoc($ans);
echo first_post['topic_title'].'-'.$first_post['username'].'<br /> '.$first_post['topic_text'].' <hr />';
//Outputs something like "Who would win in a fight... - Bob123 <br /> Superman or Batman?
mysql_free_result($ans);
//Gotten the first post and everything else, now to see the comments.

$sql = "SELECT p.*,u.username FROM posts p, users u WHERE u.user_id=p.user_id AND p.topic_id = ".$_GET['t'];
$ans = mysql_query($sql) or die(mysql_error())
while($result = mysql_fetch_assoc($ans)){

   echo $result['username'].' <br />'.$result['post_text'].'<hr />';

}
//This will output something like Sneezerella <br /> Batman <hr /> Bob123 <br /> Superman <hr /> ....[etc]....

mysql_free_result($ans)

有时您也必须使用 LEFT JOIN、RIGHT JOIN 和/或 INNER JOIN 语句。据我所知,这里有区别

  1. 内连接 - 这是编写 SELECT t 的另一种方式。,u.username FROM topic t, users u WHERE t.user_id = u.user_id。这里的语法是 SELECT t。,u.usernmae FROM topic t INNER JOIN users u ON u.user_id = t.topic_id。此方法在添加的表中查找 1 行,在本例中为“用户”。如果它没有找到对应的行,它将返回一个空值。IE 如果我在主题帖子上有 user_id = 1,而 user_id 实际上是 2,则不会返回任何内容。
  2. 左连接 - 将右表中的数据添加到从左侧选择的数据上。W3Schools 上的这篇文章对其进行了快速分解。基本上它总是从原始表中选择,并且会为任何其他结果返回 NULL。语法与 INNER JOIN 相同,只需将 INNER 替换为 LEFT。所以我们会得到SELECT t.* FROM topics t LEFT JOIN users u ON u.user_id=t.user_id。在上面的示例中,我说过如果两个表中的 user_id 不匹配,则不会返回任何内容。LEFT JOIN 并非如此。相反,如果相同的情况是真的,您将收到结果,就好像您刚刚从主题表中选择一样,以及一个名为 username 的列的结果为 NULL。
  3. Right Join - 与 LEFT JOIN 相同的功能。我不能说我曾经使用过这个,因为我更喜欢使用 LEFT JOIN。基本上,RIGHT JOIN 查询看起来像 SELECT t.*, u.username FROM topics t RIGHT JOIN users u ON u.user_id=t.user_id。这将为主题中的所有列提供具有 NULL 的所有用户名。这也许可以通过这篇关于 W3Schools 的文章得到更好的解释。
于 2013-11-02T20:55:33.970 回答