для цикла с подсчетом из массива, выходной предел? PHP - PullRequest
1 голос
/ 10 мая 2010
print '<div id="wrap">';
print "<table width=\"100%\" border=\"0\" align=\"center\" cellpadding=\"3\" cellspacing=\"3\">";

 for($i=0; $i<count($news_comments); $i++)
{
 print '
  <tr>
     <td width="30%"><strong>'.$news_comments[$i]['comment_by'].'</strong></td>
      <td width="70%">'.$news_comments[$i]['comment_date'].'</td>
    </tr>
    <tr>
      <td></td>
      <td>'.$news_comments[$i]['comment'].'</td>
  </tr>
    '; 

 }

print '</table></div>';

$ news_comments - это 3-мерный массив из mysqli_fetch_assoc, возвращаемый из функции в другом месте, по какой-то причине цикл for возвращает сумму всех наборов массивов, таких как [0] [2] и т. Д., Пока не достигнет максимальной суммы из подсчитанного $ news_comments var, которая является возвращаемой функцией LIMIT 10. Моя проблема в том, что если я добавлю какой-либо текст / html / icons в цикл for, он напечатает его в этом случае 11 раз, даже если данные содержатся только в массивах 1 и 2. Как мне обойти это?

Мой функциональный запрос выглядит следующим образом:

function news_comments()
 {

   require_once  '../data/queries.php';
   // get newsID from the url
   $urlID = $_GET['news_id'];
   // run our query for newsID information
   $news_comments = selectQuery('*', 'news_comments', 'WHERE news_id='.$urlID.'', 'ORDER BY comment_date', 'DESC', '10'); // requires 6 params
   // check query for results
   if(!$news_comments)
   {
    // loop error session and initiate var
    foreach($_SESSION['errors'] as $error=>$err)
   {
    print  htmlentities($err) . 'for News Comments, be the first to leave a comment!';
   } 
   }
   else
   {

    print '<div id="wrap">';
    print "<table width=\"100%\" border=\"0\" align=\"center\" cellpadding=\"3\" cellspacing=\"3\">";
      for($i=0; $i<count($news_comments); $i++)
             {
      print '

      <tr>
          <td width="30%"><strong>'.$news_comments[$i]['comment_by'].'</strong></td>
         <td width="70%">'.$news_comments[$i]['comment_date'].'</td>
        </tr>
        <tr>
         <td></td>
         <td>'.$news_comments[$i]['comment'].'</td>
      </tr>



     '; 

    }


   print '</table></div>';

   }

 }// End function

Любая помощь очень ценится.

EDIT: Это мой selectQuery () для kemp и / или кого-то еще, кто может немного починить его, он все еще в значительной степени WIP, поэтому он не завершен.

$_SESSION['errors'] = array();

    function selectQuery($select, $tbl, $where, $order, $scroll, $limit)
    {
        global $mysqli;
        require_once  '../config/mysqli.php';
        $query = "SELECT $select FROM $tbl $where $order $scroll LIMIT $limit";

        if($result = mysqli_query($mysqli, $query))
        {
            $num = mysqli_num_rows($result);

            if(!$num > 0)
            {
                array_push($_SESSION['errors'], 'No Results found : ');
            }
            else
            {

                    for($i=0; $i<=$limit; $i++)
                    {


                    $data[$i] = mysqli_fetch_assoc($result);
                    }
                return  $data;
                mysqli_free_result($result);
            }
        }
        else
        {
            print('Error: ' . mysqli_error($mysqli));
        }

    }

Ответы [ 3 ]

0 голосов
/ 10 мая 2010

ОГРАНИЧЕНИЕ MySQL - только это; максимальный лимит. Это не обеспечивает количество возвращаемых результатов. Поведение функции selectQuery () неверно, если она возвращает массив с 10 элементами, независимо от количества найденных результатов. Я бы исправил это поведение, а не обходил его.

Если это невозможно по какой-либо причине, вы можете добавить условие в свой цикл for:

for($i=0; $i<count($news_comments); $i++) 
{
    if( ! empty($news_comments[$i])
    {
        print '<tr>...</tr>'; 
    }
}

Для справки, я с DarkerStar на foreach. В некоторых ситуациях требуется традиционный цикл for, но вы не один из них.

foreach($news_comment as $comment)
{
    echo $comment['comment'];
    echo $comment['comment_by'];
    echo $comment['comment_date'];
}
0 голосов
/ 10 мая 2010

Судя по вашим комментариям, я считаю, что проблема заключается в функции, которая создает массив $news_comments, т.е. она всегда создает массив с 11 значениями, и дело в том, что вы не видите их напечатанными, если t добавить внешний контент, потому что он просто печатает пустые строки / ячейки. Цикл не может быть выполнен разное количество раз, если вы измените только то, что он печатает внутри.

Вы должны опубликовать функцию selectQuery().

0 голосов
/ 10 мая 2010

Как я понял из вашего кода.

  1. $ news_comments должен быть результатом данных вашего запроса sql. Простое разъяснение предела 10 не заставляет результат быть 10 строками. количество возвращаемых строк зависит от ваших результатов sql.

  2. Вы используете для ($ i = 0; $ i

Если вы хотите просмотреть все $ news_comments, вы можете просто сделать

foreach ($news_comments as $i=>$news_comment) {
  printf($news_comment);
}

$ news_comment будет равно вашим $ news_comments [$ i]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...