使用 for each 循环回显每个相应主题下的内容?

Echoing out contents under each respective topic using for each loop?

提问人:Anan 提问时间:4/19/2022 最后编辑:DarkBeeAnan 更新时间:4/19/2022 访问量:53

问:

我的表格看起来像

同上 主题
1 谷歌 bla bla..1
2 优酷 bla bla..2
3 亚马逊河 bla bla..3
4 谷歌 bla bla..4
5 谷歌 bla bla..5
6 优酷 bla bla..6

现在我想要像 Udemy 课程列表一样。 在每个主题下,按各自的顺序列出所有句子。

例如。我想要的,

Google   ^
bla bla..1
bla bla..4
bla bla..5


YouTube  ^
bla bla..2
bla bla..6


Amazon  ^
bla bla..3

注意:谷歌不应该排在第一位,我认为一切都是根据 id 排序的。 想法:就像 Udemy 在他们的一门课程中一样,有一个介绍主题,该主题下有一些视频,还有另一个称为基本的主题,该主题下也有一些内容/视频等,最后有结束课程主题,在该主题下有一些列出的内容/视频。

所以现在假设我说的主题是上表的主题,内容是上表的句子。

在本例中,我想显示名为 Google 的主题,并在该主题下显示它的句子。YouTube 也是如此,很快......

我尝试的是:呼应所有主题和句子,但这里的问题是我已经显示了每个主题下的所有内容,即有 3 个 Google、2 个 YouTube 和一个亚马逊 主题在他们各自的句子上。

$select = $db_conn->query("SELECT * FROM contents WHERE email = '$email' ORDER BY id");   
foreach($select as $select_data){
    $topic = $select_data['topic'];
    $sentence = $select_data['sentence'];
    $id = $select_data['id'];
    echo "<h2>$topic</h2>"; // this should be echo out once only if the same topic is there
    echo "<p>$sentence</p>";  
}

那么我该如何解决这个问题呢?

php mysqli foreach

评论

0赞 DarkBee 4/19/2022
您已开放进行 SQL 注入
0赞 Dharman 4/19/2022
警告:您对 SQL 注入持开放态度,并且应该使用参数化的预准备语句,而不是手动构建查询。它们由 PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,您仍然面临数据损坏的风险逃跑是不够的!
0赞 Anan 4/19/2022
@DarkBee & Dharman 我通过转义数据来做到这一点,比如 $email = mysqli_real_eascape_string($db_conn, $_POST['email']; 我让渗透测试人员测试我的其他 Web 应用程序,如果他可以使用这种转义方法使用 sql 注入破解我的网站,但他不能,我已经尝试过用它进行破解,但仍然无法破解,你能给我一些信息吗?

答:

0赞 mhhabibi 4/19/2022 #1

因为你把它放在循环中,它重复了三次,你可以这样做以避免重复

$prev_id = 0;
foreach($select as $select_data){
   $topic = $select_data['topic'];
   $sentence = $select_data['sentence'];
   $id = $select_data['id'];
   if($prev_id != $id)
      echo "<h2>$topic</h2>"; 
   echo "<p>$sentence</p>";  
   $prev_id = $id;
}

在此代码中,对于每个 ID Echo 主题,只需一次,您就可以获得所有内容;当您收到一封电子邮件时

echo "<h2>$select[0]['topic']</h2>";
foreach($select as $select_data){
   $sentence = $select_data['sentence'];
   $id = $select_data['id'];
   echo "<p>$sentence</p>";  
}

评论

0赞 Anan 4/19/2022
我已经尝试过了,但不幸的是它不起作用。无论如何,谢谢你的帮助。
1赞 Nick 4/19/2022 #2

获得所需结果的一种方法是获取主题列表及其最小值,然后将其发送到原始表,按主题的最小值排序,然后按行的值排序。例如:idJOINidid

SELECT c.*
FROM (
  SELECT MIN(id) AS id, topic
  FROM contents
  GROUP BY topic
) t
JOIN contents c ON c.topic = t.topic
ORDER BY t.id, c.id

查询输出(用于示例数据):

id  topic   sentence
1   Google  bla bla..1
4   Google  bla bla..4
5   Google  bla bla..5
2   YouTube bla bla..2
6   YouTube bla bla..6
3   Amazon  bla bla..3

现在您的输入数据已排序,您只能在标题发生变化时输出标题,例如

$last_topic = '';
foreach($select as $select_data){
    $topic = $select_data['topic'];
    $sentence = $select_data['sentence'];
    $id = $select_data['id'];
    if ($topic != $last_topic) echo "<h2>$topic</h2>"; 
    $last_topic = $topic;
    echo "<p>$sentence</p>";  
}

评论

0赞 Anan 4/19/2022
你节省了我的时间,给了我真正的解决方案。它的工作原理就像我想要的一样。非常感谢。