Php/mysqli 论坛

Php / mysqli forum

所以我是 MySqli 的新手,PHP 我正在尝试创建一个论坛。 我现在被困在这一点上,我得到论坛来显示我的“板”和“线程”,但它在每个板上显示相同的线程。 此外,无论我点击哪个线程,它总是将我带到同一个线程。 这是我的观点的代码-thread.php.

<?php
include 'forumdb.php';
$board_id = $_GET['board_id'];
$thread_id = $_GET['thread_id'];

$get_board = $mysqli->query("SELECT * FROM boards WHERE board_id = $board_id");
$board_data = $get_board->fetch_assoc();

$get_thread = $mysqli->query("SELECT * FROM threads WHERE thread_id = $thread_id");
$thread_data = $get_thread->fetch_assoc();
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $thread_data['thread_title'] ?></title>
</head>
<body>
<a href="forum.php">Home</a> | <a href="view-board.php?board_id=<?php echo $board_id ?>"><?php echo $board_data['board_name'] ?></a> | <b><?php echo $thread_data['thread_title'] ?></b><br><br>
Title: <b><?php echo $thread_data['thread_title'] ?></b><br><br>
<b>Content:</b><br>
<?php echo $thread_data['thread_content'] ?>
</body>
</html>

这是我的代码-board.php

<?php
include 'forumdb.php';
$board_id = $_GET['board_id'];
$get_board = $mysqli->query("SELECT * FROM boards WHERE board_id = $board_id");
$board_data = $get_board->fetch_assoc();
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $board_data['board_name'] ?></title>
</head>
<body>
<a href="forum.php">Home</a> | <b><?php echo $board_data['board_name']; ?></b><br><br>
<a href="add-thread.php?board_id=<?php echo $board_id ?>">Post New Thread</a><br><br>
<?php
$threads = $mysqli->query("SELECT * FROM threads WHERE board_id = $board_id");
while ($thread_data = $threads->fetch_assoc()) { ?>
<b>#<?php echo $thread_data['thread_id'] ?></b> <a href="view-thread.php?thread_id=<?php echo $thread_data['thread_id'] ?>&board_id=<?php echo $board_id ?>"><?php echo $thread_data['thread_title'] ?></a>
<?php }
if ($threads->num_rows == null) {
echo '<br><br>no threads posted yet';
}
?>
</body>
</html>

我知道你说过你不想让我们关注安全问题,所以我不去管它。事实上,如果您刚刚开始,我会完全删除数据库并首先关注原始 PHP。老实说,我也不是在开玩笑。您将很多东西组合在一起,PHP、MySQL、HTTP 和 HTML,有时您会在事物之间跳转时迷失方向。

相反,在您的 forumdb.php 文件中,现在只需使用几个全局变量。我们通常希望避免使用它们,但它们既消除了复杂性,又让我们所有人都能看到系统中的所有数据。我们无法调试我们看不到的东西。

global $boards;
global $threads;

$boards = [
    [
        'board_id' => 1,
        'board_name' => 'Board #1',
    ],
    [
        'board_id' => 2,
        'board_name' => 'Board #2',
    ]
];

$threads = [
    [
        'thread_id ' => 1,
        'board_id' => 2,
        'thread_title' => 'Thread title #1',
        'thread_content' => 'Content',
    ],
    [
        'thread_id ' => 2,
        'board_id' => 1,
        'thread_title' => 'Thread title #2',
        'thread_content' => 'Content',
    ],
    [
        'thread_id ' => 3,
        'board_id' => 2,
        'thread_title' => 'Thread title #3',
        'thread_content' => 'Content',
    ],
    [
        'thread_id ' => 4,
        'board_id' => 1,
        'thread_title' => 'Thread title #4',
        'thread_content' => 'Content',
    ],
];

然后做几个辅助函数:

function get_board(int $board_id): ?array
{
    global $boards;
    foreach ($boards as $board) {
        if ($board['board_id'] === $board_id) {
            return $board;
        }
    }
    return null;
}

function get_threads_by_board_id(int $board_id): array
{
    global $threads;
    $ret = [];
    foreach ($threads as $thread) {
        if ($thread['board_id'] === $board_id) {
            $ret[] = $thread;
        }
    }
    return $ret;
}

这些函数将按 ID 搜索板,return null 或数组,以及线程 return 所有与该 ID 匹配的板。您的其余代码通常可以保持发言权。现在不要费心添加额外的字段,让你的循环正常工作。

这样做的好处也是,一旦它开始工作,就可以很容易地将功能更改为数据库版本,而无需对代码进行太多更改。