【问题标题】:How to combine multiple returned SQL rows into one string如何将多个返回的 SQL 行组合成一个字符串
【发布时间】:2019-08-21 05:49:15
【问题描述】:

我有一个系统,用户可以在其中提交一篇文章(基本上是任何长度的文本),当它被提交到数据库时,它被分解成段落并放入它自己的paragraphs 表中。第二个表是articles 表,其中包含article_id (primary key)title (title of article)idUsers (id of user that submitted article)。 我能够成功地将数据提交到表格中,但是当我查询以尝试获取段落时,使用:

$q = "SELECT articles.article_id, articles.title, paragraphs.paragraph, articles.date, articles.idUsers FROM articles JOIN paragraphs ON articles.article_id = paragraphs.article_id WHERE idUsers = '$idUsers' AND articles.article_id = '$article_id'";
$r = mysqli_query($conn, $q);

返回多行,每行提供相同的信息(段落列除外,它具有唯一的段落文本。但标题和日期被返回两次)。这是我所期望的,但我不想把所有东西都退回两次。例如,如果文章中有两段,一段说"random text 1",另一段说"random text 2",它们都会被返回,这很好,但是article_idarticle_titlearticles.date,等,也将与唯一的段落文本一起在每一行中返回。这意味着当我回显所有这些值时,所有内容都会回显两次。当我将这些值放在<div></div> 中时,就像这样,

echo '<div class="get-article-container">';
echo '<div id="articleTitle">'.$row['title'].'</div>';
echo '<div id="articleContents">'.$row['paragraph'].'</div>';
echo '<input type="hidden" value="'.$row['article_id'].'" class="article_id_value">';
echo '</div>';

它创建两个divs 而不是一个,因为要返回多行。我想结合$row['paragraph'] 值将文章中的所有文本放在一个 div 中,但它应该在一个 div 中,而不是两个。有什么建议吗?

【问题讨论】:

  • 你有所有这些echo 行在一个循环中?
  • 你能发布现有的和预期的输出吗?

标签: javascript php jquery sql ajax


【解决方案1】:

您可以通过格式化之前的值然后回显它们来做到这一点 即使您跳过空检查,它也会返回与 title 相同的结果,并且 article id 在所有返回的行中都是相同的。

foreach($r as $row){
  (!$title)?$title=$row['title']:$title;
  $paragraph .= '<p>'.$row['paragraph'].'</p>';
  (!$articleId )?$articleId =$row['article_id']:$articleId ;
  $articleId = $row['article_id'];
}

echo '<div class="get-article-container">';
echo '<div id="articleTitle">'.$title.'</div>';
echo '<div id="articleContents">'.$paragraph .'</div>';
echo '<input type="hidden" value="'.$articleId .'" class="article_id_value">';
echo '</div>';

【讨论】:

  • 这有效,但它也给了我这个错误:注意:未定义变量:第 15 行 C:\xampp\htdocs\Real Website\includes\articles\get_articles.php 中的标题。它还说用于下一行的可变段落。有什么想法吗?
  • @CarsonD 您只需在循环之前将变量初始化为空。 $title = ""; $段落 = ""; $articleId = "";
【解决方案2】:

我认为您需要将查询结果 reduce() 为对象列表,例如:

result {
    article_title,
    article_id,
    paragraphs[]
}

然后你可以用每篇文章的段落列表来回显articleContents

【讨论】:

    【解决方案3】:

    我建议你分两步完成。

    1. 获取articles.article_id、articles.title、articles.date、articles.idUsers
    2. 获取paragraphs.paragraph

    所以对于第 1 点,

    SELECT articles.article_id, articles.title, articles.date, articles.idUsers 
      FROM articles 
      JOIN paragraphs 
        ON articles.article_id = paragraphs.article_id 
     WHERE idUsers = '$idUsers' 
       AND articles.article_id = '$article_id'";
    

    对于第 2 点,

    SELECT  paragraphs.paragraph 
      FROM articles 
      JOIN paragraphs 
        ON articles.article_id = paragraphs.article_id 
     WHERE idUsers = '$idUsers' 
         AND articles.article_id = '$article_id'";
    

    希望这能解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多