if条款将无法按要求工作


if clauses will not work as wanted

所以我有一个论坛,用户可以在其中发布几个字符。现在,在编辑帖子页面上,我希望在选择菜单中选择发布帖子的角色。如果帖子已经发送,但出现错误,玩家选择使用其他角色编辑,而不是最初发布帖子的角色,我希望选择该角色。

现在的问题是,它打印的字符数量与用户的字符数量一样多。

所以,让我们假设这个角色,使这篇文章叫鲍勃。拥有Bob的用户有6个字符,它将打印Bob六次。当它应该是鲍勃选择,然后所有其他字符。如果他们选择用另一个字符编辑,我希望选择那个字符,然后打印所有其他字符。我希望你能理解。

$post = $db->query("SELECT c.subject, a.message, a.hide_smilies, a.posted, b.name, b.user_id, c.id AS topic_id, c.closed, d.id AS forum_id, d.name AS forum_name FROM posts a 
               INNER JOIN characters b ON a.poster = b.id 
               INNER JOIN topics c ON a.topic_id = c.id
               INNER JOIN forums d ON c.forum_id = d.id
               WHERE a.id = $id")->fetch();

Character to edit with:
foreach($db->query("SELECT id, name FROM characters WHERE user_id = $is_logged_in ORDER BY name ASC") as $row):
if (isset($_POST['character']) && ($row['id'] == $_POST['character'])) {
   echo '<option value="'.$row['id'].'" selected>'.$row['name'].'</option>';
} else if (isset($post['name'])) {
   echo '<option value="'.$row['id'].'" selected>'.$post['name'].'</option>';
} else  {
   echo '<option value="'.$row['id'].'">'.$row['name'].'</option>';
}
endforeach

更改此行:

} else if (isset($post['name'])) {

至:

} else if ($post && $post['name'] == $row['name']) {

isset($post['name']在循环中每次都是相同的,所以您为提取的每一行打印$post['name']

这不是一个完整的答案,但这是一个开始它太大了,无法放入评论!

使用绑定变量来防止SQL注入(正如其他人在评论中所建议的那样)。改进环路结构和其他改进

$sql = <<<EOF
SELECT c.subject, a.message, a.hide_smilies, a.posted, b.name, b.user_id, c.id AS topic_id, c.closed, d.id AS forum_id, d.name AS forum_name 
FROM posts a 
INNER JOIN characters b ON a.poster = b.id 
INNER JOIN topics c ON a.topic_id = c.id
INNER JOIN forums d ON c.forum_id = d.id
WHERE a.id = ?
EOF;
$stmt = $db->prepare($sql);
$stmt->bind_param("s", $is_logged_in); 
$result = $stmt->fetch();
$char_sql = <<<EOF
SELECT id, name 
FROM characters WHERE user_id = ? 
ORDER BY name ASC
EOF;
$stmt = $db->prepare($char_sql);
$stmt->bind_param( "s", $id);
$result = $stmt->execute();

foreach ($result->fetch_row($char_sql) as $row):
    $id = $row['id']; $name = $row['name'];
    if (isset($_POST['character']) && ($id == $_POST['character'])) {
       echo "<option value='{$id}' selected>{$name}</option>";
    } else if (isset($post['name'])) {
        echo "<option value='{$id}' selected>{$post['name']}</option>";
    } else  {
        echo "<option value='{$id}'>{$name}</option>";
    }
endforeach;