2012-04-18 4 views
2

Я делал биты здесь и там на каком-то коде, который по существу выводит данные из mysql и отображает через php. Результаты отображаются по 3 за раз на странице, и у меня никогда не было никаких проблем.php sql results with pagination

Я недавно добавил поле к элементам базы данных: «продано» и «на складе», и я пытаюсь (несчастно) получить два поиска - сначала я хочу отобразить элементы на складе, а затем те это распродано. К сожалению, код разбивки на страницы, который я использовал в течение многих лет, мне не нравится, когда я запускаю два php-запроса и просто добавляю 3 дополнительных элемента на страницу (где это применимо).

Полный код:

 <form name="form1" method="get" action="products.php"> 
      <?php 
     if(!empty($msg)) { 
     echo $msg[0]; 
     } 
     ?> 



      <input name="q" class="textInput2" input type="search" id="q" placeholder="search image name..." autosave="applestyle_srch" results="5" onKeyUp="applesearch.onChange('srch_fld','srch_clear')" />  


       <input name="doSearch" type="hidden" id="doSearch2" value="Search"> 


     <?php if ($get['doSearch'] == 'Search') { 
     // find out how many rows are in the table 
$sql = "SELECT COUNT(*) FROM products"; 
$result = mysql_query($sql) or trigger_error("SQL", E_USER_ERROR); 
$r = mysql_fetch_row($result); 
$numrows = $r[0]; 

// number of rows to show per page 
$rowsperpage = 3; 
// find out total pages 
$totalpages = ceil($numrows/$rowsperpage); 

// get the current page or set a default 
if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage'])) { 
    // cast var as int 
    $currentpage = (int) $_GET['currentpage']; 
} else { 
    // default page num 
    $currentpage = 1; 
} // end if 

// if current page is greater than total pages... 
if ($currentpage > $totalpages) { 
    // set current page to last page 
    $currentpage = $totalpages; 
} // end if 
// if current page is less than first page... 
if ($currentpage < 1) { 
    // set current page to first page 
    $currentpage = 1; 
} // end if 

// the offset of the list, based on current page 
$offset = ($currentpage - 1) * $rowsperpage; 


     if($get['q'] == '') { 
    $sql = "SELECT * FROM products WHERE status='sold' ORDER BY `price` ASC LIMIT $offset, $rowsperpage"; 
     } 
     else { 
     $sql = "select * from products where `title` like '%$_REQUEST[q]%' LIMIT $offset, $rowsperpage"; 
     } 

$result1 = mysql_query($sql) or trigger_error("SQL", E_USER_ERROR); 


     if($get['q'] == '') { 
    $sql = "SELECT * FROM products WHERE status='in stock' ORDER BY `price` ASC LIMIT $offset, $rowsperpage"; 
     } 
     else { 
     $sql = "select * from products where `title` like '%$_REQUEST[q]%' LIMIT $offset, $rowsperpage"; 
     } 

$result2 = mysql_query($sql) or trigger_error("SQL", E_USER_ERROR); 


     ?></form></div> 
<div id="pagination" style="float:right; display:inline; margin-right:10px;"> 
      page:<?php 

/****** build the pagination links ******/ 
// if not on page 1, don't show back links 
if ($currentpage > 1) { 
    // show << link to go back to page 1 
    echo " <a href='{$_SERVER['PHP_SELF']}?q=&doSearch=Search&currentpage=1'><<</a> "; 
    // get previous page num 
    $prevpage = $currentpage - 1; 
    // show < link to go back to 1 page 
    echo " <a href='{$_SERVER['PHP_SELF']}?q=&doSearch=Search&currentpage=$prevpage'><</a> "; 
} // end if 
     // range of num links to show 
$range = 3; 

// loop to show links to range of pages around current page 
for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++) { 
    // if it's a valid page number... 
    if (($x > 0) && ($x <= $totalpages)) { 
     // if we're on current page... 
     if ($x == $currentpage) { 
     // 'highlight' it but don't make a link 
     echo " [<b>$x</b>] "; 
     // if not current page... 
     } else { 
     // make it a link 
     echo " <a href='{$_SERVER['PHP_SELF']}?q=&doSearch=Search&currentpage=$x'>$x</a> "; 
     } // end else 
    } // end if 
} // end for 

// if not on last page, show forward and last page links   
if ($currentpage != $totalpages) { 
    // get next page 
    $nextpage = $currentpage + 1; 
    // echo forward link for next page 
    echo " <a href='{$_SERVER['PHP_SELF']}?q=&doSearch=Search&currentpage=$nextpage'>></a> "; 
    // echo forward link for lastpage 
    echo " <a href='{$_SERVER['PHP_SELF']}?q=&doSearch=Search&currentpage=$totalpages'>>></a> "; 
} // end if 
/****** end build pagination links ******/ 
?> 
      </div> 

    </div> 
    </div> 


</div></p> 


<div class="category-products"> 


    <form name "searchform" action="products.php" method="post"> 

    <?php while($rrows = mysql_fetch_array($result2)) 
{ 
    echo '<div><div id="searchimage"><a class="product-image" href="productspec.php?productcode=' . $rrows['productcode'] . '" title="' . $rrows['title'] . '">'; 
    echo '<img src="' . $rrows['photo'] . '" width="225" height="150" alt="" title="' . $rrows['title'] . '" /></a></div>'; 
    echo '<div id="searchdetails"> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr> 
    <td height="30"><h3 class="product-name"><a href="productspec.php?productcode=' . $rrows['productcode'] . '" title="' . $rrows['title'] . '">' . $rrows['title'] . '</a></h3>'; 
    echo '</td> 
    </tr> 
    <tr> 
    <td>' . $rrows['desc'] . ''; 
    echo '</td> 
    </tr> 
    <tr> 
    <td><h3 class="price">&pound;' . $rrows['price'] . '&nbsp;' . $rrows['pandp'] . '</h3>'; echo '</td> 
    </tr> 
</table></div>'; 
echo '</div>'; 
} 
?> 

<?php while($rrows = mysql_fetch_array($result1)) 
{ 
    echo '<div><div id="searchimage"><a class="product-image" href="productspec.php?productcode=' . $rrows['productcode'] . '" title="' . $rrows['title'] . '">'; 
    echo '<img src="' . $rrows['photo'] . '" width="225" height="150" alt="" title="' . $rrows['title'] . '" /><img src="soldout.png" id="soldout" /></a></div>'; 
    echo '<div id="searchdetails"> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr> 
    <td height="30"><h3 class="product-name"><a href="productspec.php?productcode=' . $rrows['productcode'] . '" title="' . $rrows['title'] . '">' . $rrows['title'] . '</a></h3>'; 
    echo '</td> 
    </tr> 
    <tr> 
    <td>' . $rrows['desc'] . ''; 
    echo '</td> 
    </tr> 
    <tr> 
    <td><h3 class="price">&pound;' . $rrows['price'] . '&nbsp;' . $rrows['pandp'] . '</h3>'; echo '</td> 
    </tr> 
</table></div>'; 
echo '</div>'; 
} 
?> 

    </form> <?php } ?> 

я в полной мере оценить, что код может быть чище - (я не внес изменения в процесс постраничной на протяжении нескольких лет, как он всегда работал) - но я предполагая, что должны быть более простым способом отображения всех элементов в таблице без необходимости запуска запросов $ result1 и $ result2.

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

JD

ответ

1

Вот функция, я сделал за борт я запрограммированным. Надеюсь, это поможет вам каким-то образом. Это немного грязно (для меня), так как я не обновляюсь некоторое время.

5 требуемых переменных, которые запрашивает эта функция, это количество строк, URL-адрес вашей страницы, чтобы ссылки работали хорошо, «сообщения на страницу», что в основном означает, сколько результатов вы хотите на странице (по умолчанию 20), имя ссылки, поэтому, если вы хотите, чтобы следующая страница появлялась на ссылке на страницу, и, наконец, если вы хотите изменить то, что $ _GET вы хотите изменить на страницу. Значение по умолчанию: $ _GET ['page'].

function pagelinks($numrows, $primaryurl, $ppp=20, $aname="", $getpage="default") 
    { 
    global $baseurl; //this is for something like http://somesite.com/ 

    //If the GET method is not defined, $_GET[page] is used. 
    if ($getpage == "default") 
    { 
    $page = intval($_GET['page']); 
    $getpage = "page"; 
    } 
    else 
    { 
    $page = intval($_GET[$getpage]); 
    } 
    $ppp = intval($ppp); 

    if ($aname != "") 
    { 
    $linkname = "#$aname"; 
    //$linkname2 = "<a name=\"next_page\"></a>"; 
    } 

    //If we don't define the posts/articles per page, we go to a postsperpage user default. 
    if ($ppp == 0) 
    { 
    $ppp = 20; 
    } 

    //If the page is negative, we define it 1. 
    if (intval($page) < 0) 
    { 
    $page = 1; 
    } 

    //If the GET page is higher than the highest possible, we make it the highest limiting page. 
    if (($numrows/$ppp + 1) < intval($page)) 
    { 
    $page = intval($numrows/$ppp + 1); 
    } 

    //If the url doesn't point to any page, we just set it to the first group of the query limit. 
    if (!$page) 
    { 
    $page = 1; 
    } 
    $min = (($page - 1) * $ppp); 
    $maxnum = floor($numrows/$ppp); 
    $pages = "<center><small>Pages:</small><br>"; 
    //If we are on the first page, don't link to any previous pages because there are none 
    //Else we link the arrow to the page one less than current. 
    if (($page - 1) <= 0) 
    { 
    $pages .= "<img src=\"$baseurl/boardfiles/images/previous_mono.gif\" border=\"0\" alt=\"\">"; 
    } 
    else 
    { 
    $pages .= "<a href=\"".$primaryurl."&amp;$getpage=".($page-1)."$linkname\"><img src=\"$baseurl/boardfiles/images/previous.gif\" border=\"0\" alt=\"<\"></a>"; 
    } 
    for ($i = 0; $i <= $maxnum; $i++) 
    { 
    $i2 = $i+1; 
    if ($i != $maxnum || ($numrows/$ppp) != (floor($numrows/$ppp)) || !$numrows) 
    { 
     //If the page number matches our page, it isn't linked. 
     //Else we keep linking all existing page numbers. 
    if ($page == $i2) 
     { 
     $pages .= " $i2"; 
     } 
    else 
     { 
     $pages .= " <a href=\"".$primaryurl."&amp;$getpage=".($i + 1)."$linkname\">".($i + 1)."</a>"; 
     } 
    } 
    else 
    { 
     $lastcutoff = 1; 
    } 
    } 
    //If we are on the last page, don't link to the next page because we are on the top one. 
    //Else we link the arrow to the page one more than current. 
    if ($page > $maxnum || ($lastcutoff && $page > $maxnum - 1)) 
    { 
    $pages .= " <img src=\"$baseurl/boardfiles/images/next_mono.gif\" border=\"0\" alt=\"\">"; 
    } 
    else 
    { 
    $pages .= " <a href=\"".$primaryurl."&amp;$getpage=".($page+1)."$linkname\"><img src=\"$baseurl/boardfiles/images/next.gif\" border=\"0\" alt=\">\"></a>"; 
    } 
    $pages .= "</center>"; 
    $return['pages'] = $pages; 
    $return['querylimit'] = " LIMIT $min, $ppp"; 
    $return['min'] = $min; //Used in users.php 
    return $return; 
    } 

Теперь вам нужно будет изменить код немного, чтобы удовлетворить его к вашим потребностям, но затем Вы должны будете поместить это в запросе. Вот несколько примеров использования:

#-- Page Stuff --# 
    $articlesperpage = 10; 
    $numrows = $misc['totalarticles']; 

    $p = pagelinks($numrows, "$baseurl/?p=news", $articlesperpage); 
    $pages = $p['pages']; 
    #-- Page Stuff --# 

    $allnews = sql_query("SELECT * FROM `news` ORDER BY `id` DESC$p[querylimit]"); 

Важно использовать Фр [querylimit], чтобы ограничить запрос и использовать $ страницы для ваших постраничной ссылок. Надеюсь, это полезно!




Edit: я недавно создал еще одну функцию постраничной вы можете захотеть вместо выше, так как это один использует отборный список опций, а не кучу ссылок. И я также исправил ошибку, которую я заметил час назад. Забавно, как я это поймал, когда я снова это переживал.

function pagination2($numrows, $primaryurl, $ppp=20) 
    { 
    global $baseurl; 

    $page = intval($_GET['page']); 
    $ppp = intval($ppp); 

    //If we don't define the posts/articles per page, we go to a postsperpage user default. 
    if ($ppp == 0) 
    { 
    $ppp = 20; 
    } 

    //If the page is negative, we define it 1. 
    if (intval($page) < 0) 
    { 
    $page = 1; 
    } 

    //If the GET page is higher than the highest possible, we make it the highest limiting page. 
    if (($numrows/$ppp) < intval($page)) 
    { 
    $page = intval($numrows/$ppp); 
    } 

    //If the url doesn't point to any page, we just set it to the first group of the query limit. 
    if (!$page) 
    { 
    $page = 1; 
    } 
    $min = (($page - 1) * $ppp); 
    $maxnum = floor($numrows/$ppp); 

    $pages = "<select onchange=\"window.location.href=this.value;\" style=\"font-size: 8pt;\">"; 

    for ($i = 0; $i <= $maxnum; $i++) 
    { 
    $i2 = $i + 1; 
    if ($i != $maxnum || ($numrows/$ppp) != (floor($numrows/$ppp)) || !$numrows) 
    { 
    if ($page == $i2) 
     { 
     $pages .= "<option value=\"$primaryurl&amp;page=$i2\" selected>Page $i2</option>"; 
     } 
    else 
     { 
     $pages .= "<option value=\"$primaryurl&amp;page=$i2\">Page $i2</option>"; 
     } 
    } 
    } 

    $pages .= "</select>"; 


    $return['pages'] = $pages; 
    $return['querylimit'] = " LIMIT $min, $ppp"; 
    $return['min'] = $min; //Used in users.php 
    return $return; 
    }