【问题标题】:Why does my code only show one post?为什么我的代码只显示一篇文章?
【发布时间】:2014-03-07 20:49:06
【问题描述】:

我一直在开发一个社交网络,一个关键功能是能够在其他用户的个人资料上发帖。但是,我当前的代码只会显示一篇文章。此外,它似乎是显示的第一个帖子。我通过创建新帐户和撰写测试帖子对此进行了测试。代码确实显示了第一篇文章,但如果我再试一次,只有第一篇文章可见。代码如下: 将帖子发送到数据库的代码:

$person = "profile.php?id={$id}";
$post = $_POST['post'];
if($post != "")
{
    $data_added = date("Y-m-d");
    $added_by = $session_username;
    $user_posted_to = $id;
    $post = preg_replace("#[^0-9a-z]#i", "", $post);
    $sqlCommand = "INSERT INTO posts VALUES ('', 
                                             '$post', 
                                             '$data_added', 
                                             '$added_by', 
                                             '$user_posted_to')";
    $commandQuery = mysql_query($sqlCommand) or die ("Couldn't send post");
}
else
{
    echo "You have to fill in the post form...";
}

检索它(并显示它)的代码:

$getPosts = mysql_query("SELECT * 
                           FROM posts 
                          WHERE user_posted_to='$id' 
                       ORDER BY id DESC LIMIT 15") or die("Couldn't find any posts");
while($row = mysql_fetch_array($getPosts))
{
    $id = $row['id'];
    $body = $row['body'];
    $date_added = $row['date_added'];
    $added_by = $row['added_by'];
    $user_posted_to = $row['user_posted_to'];
    $querya = mysql_query("SELECT * 
                             FROM members 
                            WHERE username='$added_by' LIMIT 1");
    while($row = mysql_fetch_array($querya))
    {
        $user_added = $row['id'];                           
    }
    $user_added = "profile.php?id={$user_added}";
}

echo "
    <div>
    <h3><a href='$user_added'>$added_by</a> - $date_added </h3>
    <p> $body</p>
    </div><br />
    ";

如果有人需要更多代码,比如我的数据库连接,请发表评论。

【问题讨论】:

  • 使用while() 循环从LIMIT 1 查询中获取单行是货物崇拜编程的一个相当大的症状。您确实应该将两个嵌套查询重写为单个 JOINed 查询。另外,您很容易受到 SQL 注入攻击...
  • SELECT p.id, p.body, p.date_added, p.added_by, p.user_posted_to, m.id FROM posts p JOIN members m ON p.added_by = m.username WHERE p.user_posted_to = '$id' ORDER BY p.id DESC LIMIT 15可以避免双重查询。你也有严重的 SQL 注入 问题。
  • ....... 祝你社交网络好运!
  • 它有点裸露,但您可以在 [link] (destinationstation.site40.net/index.php) 上查看我的网站。该域名只是我用来测试它的旧域名,并不是网站的名称(尚未确定)

标签: php html database post forum


【解决方案1】:

在您的 while cicle 中,您填写了一些变量,但您不使用它们。 您只在循环之外使用echo,所以只使用一次,因此您只打印while 循环的最后一个实例的值。

试试

    $getPosts = mysql_query("SELECT * FROM posts WHERE user_posted_to='$id' ORDER BY id DESC LIMIT 15") or die("Couldn't find any posts");
                while($row = mysql_fetch_array($getPosts)){
                    $id = $row['id'];
                    $body = $row['body'];
                    $date_added = $row['date_added'];
                    $added_by = $row['added_by'];
                    $user_posted_to = $row['user_posted_to'];

                    $querya = mysql_query("SELECT * FROM members WHERE username='$added_by' LIMIT 1");
                    while($row = mysql_fetch_array($querya)){
                        $user_added = $row['id'];                           
                        }
                        $user_added = "profile.php?id={$user_added}";
                    echo "
                    <div><h3><a href='$user_added'>$added_by</a> - $date_added </h3><p> $body</p></div><br />";
                                                }

【讨论】:

  • 顺便说一句,我同意评论说你需要一些认真的改进。 mysql 函数已被弃用,您很容易被注入。 PDO 中的预处理语句可以解决这两个问题。
  • 如果您说他正在使用echo 打印循环外的帖子,那么它只会打印一次会更有意义。
  • @Prix 感谢您的评论,我编辑了答案以使其更清晰