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 论坛的主要内容,如果未能解决你的问题,请参考以下文章