为PHP Query启动读取

时间:2009-11-06 14:56:17

标签: php mysql join

我是PHP的新手,在我自己的CMS上工作。主要是给自己一个学习语言的项目。 CMS正在运行,但我只是追查其中的一些错误。所以这就是......

我正在尝试列出我为每个部分发布的所有文章。 它正确地执行了这一操作,但我在

行后面的代码语句中遇到了问题
    echo '</br></br><br>'.ucfirst($row['section']).' Articles: '; //['section'] is the name

现在如果我显示我的所有部分都是正确的,因为它按升序查询,但是如果我只使用一个部分它总是只显示第一部分的部分名称它永远不会选择它当前的部分显示文章。有没有一种方法可以让我获得第一个引导读取来获取部分名称,然后通过while ($stories = $result->fetch_assoc())循环的循环将其重置为0次,这样我就不会错过任何文章?

我已经重新设计它以使用连接,所以我可以获得带有节ID号本身的节的名称。我加入的sql语句正是我需要的。但是,在我列出部分名称然后列出文章计数(while ($stories = $result->fetch_assoc()))之后,我才开始调用join语句。

//query for getting the sections to the list each ones articles
$querySection = 'select * from sections order by section asc';
  $resultSection = $handle->query($querySection);

if ($resultSection->num_rows) 
  {

//hard coded to only show the scection ONE time... 
//SQL repeats the rows the number of sections there are. So lets cheat.
if(isset($sectionHolder) && $sectionHolder > 0)
 $counterHolder = 9998;
else
 $counterHolder = 0;

while ($row = $resultSection->fetch_assoc()) 
{ 

 if(isset($sectionHolder) && $sectionHolder > 0) 
  //we are looking at one specific section
  $query = 
  'select articles.*, sections.section
  from articles 
  INNER JOIN sections
  ON art_sec=sections.id
  where articles.art_sec = \''.$sectionHolder.'\' and articles.published IS NOT NULL 
  ORDER BY sections.section, articles.headline asc
  ';
 else //just looping through everything we have...
  $query = 'select * from articles where art_sec = \''.$row['id'].'\' and published IS NOT NULL order by art_sec asc';

 $result = $handle->query($query);


 if($result->num_rows > 0 && $counterHolder != 9999)//we have a defined section to go into
 {


echo '</br></br><br>'.ucfirst($row['section']).' Articles: ';
echo $result->num_rows;
echo '</br></p>';

 if ($result->num_rows) 
 {
  echo '<table width="90%">';
  echo '<tr><th>Headline</th>';
  echo '<th>Modified</th></tr>';
  while ($stories = $result->fetch_assoc()) 
  {
   echo '<tr><td width="75%">';
   echo $stories['headline'];
   echo $stories['sections.section'];
   echo '</td><td>';
   echo date('m-j-y, h:i', $stories['modified']);
   echo '</td><td>';

   //add to array
   $array[] = $stories['id']; // add every ID on this page to the array.
  } //end while of stories

 echo '</table></br></br></br></br>';
 $counterHolder += 1; //adds one to only come in once if the section is selected or all times if its all sections.
  } // end if results num rows
 }//end if results num rows >0 and counter != 9999
}//end while row-fetch
}//end if ResultSection-numrows

也许有人也可以尝试帮我找出一种方法来取出计数器的分隔符。我用其他方式搞砸了,但这是我能解决问题的唯一逻辑,它似乎不是一种非常有效的编码方式。 问题是,当我只查看一个部分并且它有5篇文章时,它会显示名称然后列出其5篇文章,5次,而不是仅进行一次。所以我有一个计数器只会进入循环内部一次,如果传入一个部分。

这是我在这里发表的第一篇文章,如果我发布的内容过多,需要将其分解,更多的是这样说(我认为更多比点点滴滴更好)。如果需要,我也可以发布整个代码页。

由于

2 个答案:

答案 0 :(得分:0)

您可以在初始SQL语句中放置where子句吗?

例如select * from sections where secionId = $sectionId order by section asc

我认为你点击了一个部分,这样你的应用就会带你到一个页面,显示你选择的部分及其文章?

答案 1 :(得分:0)

我认为您的问题在于您在打印输出时第一次迭代数据。这使得代码非常不灵活。资源有效,但不灵活。

以下是您可能会做的事情:

  1. 在您完成查询部分和文章后,制作一个可以容纳您的部分的数组。
  2. 在每个部分中添加一篇文章数组及相关文章
  3. 循环使用foreach的section数组,然后通过foreach
  4. 中的文章循环

    要完成第一项和第二项,请执行以下操作:

    $sections = array();
    $result = $handle->query($query);
    if($result)
     while ($storie = $result->fetch_assoc()) {
      $article = array();
      $article["stuff"] = $storie["stuff"];
      /* replace "stuff" with things you need from your query */
      $sections[$stories['section']][$stories['articleName'] = array('stuff'=>'some value');
     }
    
    foreach($sections as $sectionName=>$articles)
     foreach($articles as $articleName=>$article)
      // print your stuff here
      // at this point you have all your data organised and you
      //   could've gone though it easily before the 2 foreaches
      //   to search for other stuff you needed.