php/mysqli 论坛

Posted

技术标签:

【中文标题】php/mysqli 论坛【英文标题】:Php / mysqli forum 【发布时间】:2021-07-07 22:55:09 【问题描述】:

所以我对 mysqli 和 php 还很陌生,我正在尝试创建一个论坛。 我现在被困在这一点上,我让论坛显示我的“板”和“线程”,但它在每个板上显示相同的线程。 此外,无论我点击哪个线程,它总是将我带到同一个线程。 这是我的 view-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>

这是我的 view-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>

【问题讨论】:

在深入了解之前先查看***.com/questions/60174/…,因为您的代码易受sql注入 在任何人了解漏洞之前。这个项目不应该是安全的。专注于我的问题,而不是其他任何事情。 请先修复SQL注入。只有这样我们才能调查任何其他问题 缺少参数化查询可能会导致除了安全问题之外的其他问题,它可能会由于未转义的输入而导致崩溃。 100% 值得修复。 i'm pretty new to MySqli and PHP ... I'm trying to create a forum。不要咬得比你能咀嚼的多。这并不意味着令人沮丧,只是现实。为了创建一个可用的论坛应用程序,有很多知识需要了解,即使您的目标相对温和。通过更简单、离散的示例和小型项目,专注于学习一些核心技能和编程概念。从一些代码和 cmets 来看,您似乎跳过了那部分并直接“构建了一些很酷的东西”,然后不可避免地陷入了复杂性。 【参考方案1】:

我知道你说过你不想让我们专注于安全问题,所以我就不说了。事实上,如果您刚刚开始,我会完全删除数据库,并首先关注原始 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 搜索板,返回 null 或数组,线程返回与该 ID 匹配的所有内容。您的其余代码通常可以保留发言权。现在不要费心添加额外的字段,让你的循环正常工作。

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

【讨论】:

以上是关于php/mysqli 论坛的主要内容,如果未能解决你的问题,请参考以下文章

如何破解论坛下载限制?!

山东大学论坛的建立(世一大论坛)

山东大学论坛的建立(世一大论坛)

山东大学论坛的建立(世一大论坛)

山东大学论坛的建立(世一大论坛)

怎样破解论坛交货币下载附件