2011-11-03 3 views
0

목표는 검색 결과에 페이지 매김을하는 것이지만 검색 할 때 결과가 두 페이지 이상인 경우 두 번째 페이지를 클릭하면 아무 것도 나타나지 않습니다. 나는 POST 때문에 그 이유가 있다고 생각하지만, 나는 정말로 확신하지 못한다. 내가 어디로 잘못 가고 있니?페이지 매김 결과는 첫 번째 페이지 너머에 표시되지 않습니다.

<?php 
include "functions.php"; 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 
$search_output = ""; 
$nr = ""; 
if(isset($_POST['searchquery']) && $_POST['searchquery'] != ""){ 

    $searchquery = preg_replace('#[^a-zA-Z 0-9?!]#i', '', $_POST['searchquery']); 

    $sqlCommand2 = " 
    (SELECT id AS id, username AS name, firstname AS admin 
    FROM myMembers 
    WHERE firstname LIKE '%$searchquery%' OR lastname LIKE '%$searchquery%' OR username LIKE '%$searchquery%') 
    UNION (SELECT id AS id, team_name AS name, churchname AS admin 
    FROM myTeams 
    WHERE team_name LIKE '%$searchquery%' OR churchname LIKE '%$searchquery%' OR admin_name LIKE '%$searchquery%') ORDER BY id"; 

    $query = mysql_query($sqlCommand2) or die(mysql_error()); 
    $nr = mysql_num_rows($query); 
    if($nr > 0){ 
     $nr = mysql_num_rows($query); // Get total of Num rows from the database query 
     if (isset($_GET['pn'])) { // Get pn from URL vars if it is present 
      $pn = preg_replace('#[^0-9]#i', '', $_GET['pn']); // filter everything but numbers for security(new) 
     } else { // If the pn URL variable is not present force it to be value of page number 1 
      $pn = 1; 
     } 
     //This is where we set how many database items to show on each page 
     $itemsPerPage = 10; 
     // Get the value of the last page in the pagination result set 
     $lastPage = ceil($nr/$itemsPerPage); 
     // Be sure URL variable $pn(page number) is no lower than page 1 and no higher than $lastpage 
     if ($pn < 1) { // If it is less than 1 
      $pn = 1; // force if to be 1 
     } else if ($pn > $lastPage) { // if it is greater than $lastpage 
      $pn = $lastPage; // force it to be $lastpage's value 
     } 
     // This creates the numbers to click in between the next and back buttons 
     $centerPages = ""; // Initialize this variable 
     $sub1 = $pn - 1; 
     $sub2 = $pn - 2; 
     $add1 = $pn + 1; 
     $add2 = $pn + 2; 
     if ($pn == 1) { 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '" style="color:black">' . $add1 . '</a> &nbsp;'; 
     } else if ($pn == $lastPage) { 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '" style="color:black">' . $sub1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
     } else if ($pn > 2 && $pn < ($lastPage - 1)) { 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub2 . '" style="color:black">' . $sub2 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '" style="color:black">' . $sub1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '" style="color:black">' . $add1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add2 . '" style="color:black">' . $add2 . '</a> &nbsp;'; 
     } else if ($pn > 1 && $pn < $lastPage) { 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '" style="color:black">' . $sub1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '" style="color:black">' . $add1 . '</a> &nbsp;'; 
     } 
     // This line sets the "LIMIT" range... the 2 values we place to choose a range of rows from database in our query 
     $limit = 'LIMIT ' .($pn - 1) * $itemsPerPage .',' .$itemsPerPage; 
     // Now we are going to run the same query as above but this time add $limit onto the end of the SQL syntax 
     // $sql2 is what we will use to fuel our while loop statement below 
     $sql2 = mysql_query(" 
      (SELECT id AS id, username AS name, firstname AS admin 
      FROM myMembers 
      WHERE firstname LIKE '%$searchquery%' OR lastname LIKE '%$searchquery%' OR username LIKE '%$searchquery%') 
      UNION (SELECT id AS id, team_name AS name, churchname AS admin 
      FROM myTeams 
      WHERE team_name LIKE '%$searchquery%' OR churchname LIKE '%$searchquery%' OR admin_name LIKE '%$searchquery%') ORDER BY id $limit"); 

     $paginationDisplay = ""; // Initialize the pagination output variable 
     // This code runs only if the last page variable is not equal to 1, if it is only 1 page we require no paginated links to display 
     if ($lastPage != "1"){ 
      // This shows the user what page they are on, and the total number of pages 
      $paginationDisplay .= 'Page <strong>' . $pn . '</strong> of ' . $lastPage. '<img src="images/clearImage.gif" width="48" height="1" alt="Spacer" />'; 
      // If we are not on page 1 we can place the Back button 
      if ($pn != 1) { 
       $previous = $pn - 1; 
       $paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $previous . '" style="color:black"> Back</a> '; 
      } 
      // Lay in the clickable numbers display here between the Back and Next links 
      $paginationDisplay .= '<span class="paginationNumbers">' . $centerPages . '</span>'; 
      // If we are not on the very last page we can place the Next button 
      if ($pn != $lastPage) { 
       $nextPage = $pn + 1; 
       $paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $nextPage . '" style="color:black"> Next</a> '; 
      } 
     } 

////////////Display output///////////////////////////////////////////////////////// 
    while($row = mysql_fetch_array($sql2)){ 
     $id = $row["id"]; 
     $name = $row['name']; 
     $real = $row['admin']; 
      $sql_if1 = mysql_query("SELECT id, username, firstname FROM myMembers"); 
      while($row2 = mysql_fetch_array($sql_if1)){ 
       $if1id = $row2['id']; 
       $if1user = $row2['username']; 
       $if1first = $row2['firstname']; 
       $userpic1 = '<div style="width:50px; height:50px; overflow:hidden; float:left; margin-right:20px;">' . check_pic("members", $if1id, "50", "profile") . '</div>'; 
       if($id == $if1id && $name == $if1user){ 
        $search_output .= '<div style="height:60px; padding:7px 5px 0px 5px;">' . $userpic1 . 'Username - <a href="profile.php?id='.$if1id.'" style="color:black;">' . $if1user . '<br />First Name - '.$if1first.'</a></div><hr />'; 
       } 
      } 
      $sql_if2 = mysql_query("SELECT id, team_name, admin_name, churchname FROM myTeams"); 
      while($row3 = mysql_fetch_array($sql_if2)){ 
       $if2id = $row3['id']; 
       $if2user = $row3['team_name']; 
       $if2first = $row3['admin_name']; 
       $if2church = $row3['churchname']; 
       $userpic2 = '<div style="width:50px; height:50px; overflow:hidden; float:left; margin-right:20px;">' . check_pic("teams", $if2id, "50", "team") . '</div>'; 
       if($id == $if2id && $name == $if2user){ 
        $search_output .= '<div style="height:60px; padding:7px 5px 0px 5px;">' . $userpic2 . '<a href="team.php?id='.$if2id.'" style="color:black;">Team Name - ' . $if2user . '<br />Team Admin - '.$if2first.'</a></div><hr />'; 
       } 
      } 
    } // close while 
    } else { 
    $search_output = "<hr />0 results for <strong>$searchquery</strong><hr />$sqlCommand2"; 
    } 
} 
?> 

답변

1

'searchquery'가 설정되어 있으면 스크립트가 출력만을 생성하는 것처럼 보입니다.

빌드하는 링크는 'pn ='질문에만 답합니다.

아마 추가

$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '&searchquery=' . $_POST["searchquery"] .'" style="color:black">' . $add1 . '</a> &nbsp;' 

을 당신의 연결에에 :

if($pn==1) { 

절을 참조하십시오.

매우 긴 스크립트이지만 더 많은 문제가있을 수 있습니다.

+0

이것은 실제로 제가 일을하고, 몇 가지 다른 것들과 함께, 내가 POST 대신 GET을 사용하여 결국, 논리 주셔서 감사합니다! 그것은 대단히 감사합니다. –

2

작은 것들.

if(isset($_POST['searchquery']) && $_POST['searchquery'] != "") 는 내부 $nr = mysql_num_rows($query);필요하지 않습니다 if(!empty($_POST['searchquery']))

로 대체 할 수있는 '경우 ($ NR> 0)';

$ sql_if1과 $ sql_if2에는 where 절이 없다는 것을 알고 있습니까? protip, 행을 재연화할 수있는 내부적 인 방법으로 메인 페치 루프를 벗어나면 좋겠지 만 또 다른 이야기입니다 ...

이제는 개념적 수준에서 좀 더 나은 쿼리를 수행하는 것이 좋습니다. 한 번만 간단한 옵션은 결과를 $ _SESSION에 저장하는 것입니다.

if (empty($_GET['pn'])) { 
    ... //db query stuff 
    $query = mysql_query($sqlCommand2) or die(mysql_error()); 
    $results = $query->to_array; // to sure if it exists, use pdo anyway ^^ 
    $_SESSION['usersChurchResults'] = $results; 
} 
else { 
    $results = $_SESSION['usersChurchResults'] 
} 

$nr = count($results); 
... 

그러면 페이지 번호 매기기가 쉽습니다.

마지막으로, 예, $ _POST 때문입니다. "2 페이지"를 클릭하면 양식이 제출되지 않았으므로 $ _GET 매개 변수 (페이지 번호)가 표시되지만 $ _POST는 표시되지 않습니다. 그래서 기본적으로 sql2를 실행하기 전에 if (! empty ($ _ POST)) 블록을 종료하고 "012"구성 함수에서 $ pn에 액세스 할 수 있도록 if (isset($_GET['pn'])) 블록을 선언해야합니다.

전체 코드를 원 하시거나 괜찮습니까?

편집는 :

여전히
<?php 
include "functions.php"; 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 
$search_output = ""; 
$nr = ""; 

if (isset($_GET['pn'])) { // Get pn from URL vars if it is present 
    $pn = preg_replace('#[^0-9]#i', '', $_GET['pn']); // filter everything but numbers for security(new) 
} else { // If the pn URL variable is not present force it to be value of page number 1 
    $pn = 1; 
} 

if(! empty($_POST['searchquery'])) { 

    $searchquery = preg_replace('#[^a-zA-Z 0-9?!]#i', '', $_POST['searchquery']); 

    // TODO: use pdo, plizzz 
    $_SESSION['membersTeamsSearchquery'] = $searchquery; 
    $sqlCommand2 = " 
    (SELECT id AS id, username AS name, firstname AS admin 
    FROM myMembers 
    WHERE firstname LIKE '%$searchquery%' OR lastname LIKE '%$searchquery%' OR username LIKE '%$searchquery%') 
    UNION (SELECT id AS id, team_name AS name, churchname AS admin 
    FROM myTeams 
    WHERE team_name LIKE '%$searchquery%' OR churchname LIKE '%$searchquery%' OR admin_name LIKE '%$searchquery%') ORDER BY id"; 

    $query = mysql_query($sqlCommand2) or die(mysql_error()); 
    $nr = mysql_num_rows($query); 
    if($nr > 0){ 
     $nr = mysql_num_rows($query); // Get total of Num rows from the database query 

     //This is where we set how many database items to show on each page 
     $itemsPerPage = 10; 
     // Get the value of the last page in the pagination result set 
     $lastPage = ceil($nr/$itemsPerPage); 
     // Be sure URL variable $pn(page number) is no lower than page 1 and no higher than $lastpage 
     if ($pn < 1) { // If it is less than 1 
      $pn = 1; // force if to be 1 
     } else if ($pn > $lastPage) { // if it is greater than $lastpage 
      $pn = $lastPage; // force it to be $lastpage's value 
     } 
     // This creates the numbers to click in between the next and back buttons 
     $centerPages = ""; // Initialize this variable 
     $sub1 = $pn - 1; 
     $sub2 = $pn - 2; 
     $add1 = $pn + 1; 
     $add2 = $pn + 2; 
     if ($pn == 1) { 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '" style="color:black">' . $add1 . '</a> &nbsp;'; 
     } else if ($pn == $lastPage) { 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '" style="color:black">' . $sub1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
     } else if ($pn > 2 && $pn < ($lastPage - 1)) { 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub2 . '" style="color:black">' . $sub2 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '" style="color:black">' . $sub1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '" style="color:black">' . $add1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add2 . '" style="color:black">' . $add2 . '</a> &nbsp;'; 
     } else if ($pn > 1 && $pn < $lastPage) { 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '" style="color:black">' . $sub1 . '</a> &nbsp;'; 
      $centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;'; 
      $centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '" style="color:black">' . $add1 . '</a> &nbsp;'; 
     } 
    } 
} // end POST 
// TODO: output/echo pagination display and centerPages, maybe?????????????????????????????????????????????? 
if($nr > 0){ /* output pagination */ } 

//// get output data //// and several more/

if($nr > 0 || empty($_POST['searchquery'])){ // "|| $np > 1" won't work if you click on page 2, and then page 1 again 
    // This line sets the "LIMIT" range... the 2 values we place to choose a range of rows from database in our query 
    $limit = 'LIMIT ' .($pn - 1) * $itemsPerPage .',' .$itemsPerPage; 
    // Now we are going to run the same query as above but this time add $limit onto the end of the SQL syntax 
    // $sql2 is what we will use to fuel our while loop statement below 
    $searchquery = $_SESSION['membersTeamsSearchquery']; 
    $sql2 = mysql_query(" 
     (SELECT 'member' AS type, id AS id, username AS name, firstname AS admin 
     FROM myMembers 
     WHERE firstname LIKE '%$searchquery%' OR lastname LIKE '%$searchquery%' OR username LIKE '%$searchquery%') 
     UNION (SELECT 'team' AS type, id AS id, team_name AS name, churchname AS admin 
     FROM myTeams 
     WHERE team_name LIKE '%$searchquery%' OR churchname LIKE '%$searchquery%' OR admin_name LIKE '%$searchquery%') ORDER BY id $limit"); 

    $paginationDisplay = ""; // Initialize the pagination output variable 
    // This code runs only if the last page variable is not equal to 1, if it is only 1 page we require no paginated links to display 
    if ($lastPage != "1"){ 
     // This shows the user what page they are on, and the total number of pages 
     $paginationDisplay .= 'Page <strong>' . $pn . '</strong> of ' . $lastPage. '<img src="images/clearImage.gif" width="48" height="1" alt="Spacer" />'; 
     // If we are not on page 1 we can place the Back button 
     if ($pn != 1) { 
      $previous = $pn - 1; 
      $paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $previous . '" style="color:black"> Back</a> '; 
     } 
     // Lay in the clickable numbers display here between the Back and Next links 
     $paginationDisplay .= '<span class="paginationNumbers">' . $centerPages . '</span>'; 
     // If we are not on the very last page we can place the Next button 
     if ($pn != $lastPage) { 
      $nextPage = $pn + 1; 
      $paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $nextPage . '" style="color:black"> Next</a> '; 
     } 
    } 

    ////////////Display output///////////////////////////////////////////////////////// 
    // TODO: don't use row2 rowX, or play saint row, use $row_myMembers... 
    // TODO: get the firstname, userpic, etc in in "sql2" query. 
    // TODO: will only work if IDs in members and teams are different, AFTER the addition of my where clause. 
    while($row = mysql_fetch_assoc($sql2)){ 
     $id = $row["id"]; 
     $name = $row['name']; 
      //$sql_if1 = mysql_query("SELECT id, username, firstname FROM myMembers"); 
     $real = $row['admin']; 
      if ($row['type'] == 'member') { 
       $sql_if1 = mysql_query("SELECT id, username, firstname FROM myMembers WHERE id=".$id); // if ID is an integer 
       while($row2 = mysql_fetch_array($sql_if1)){ 
        $if1id = $row2['id']; 
        $if1user = $row2['username']; 
        $if1first = $row2['firstname']; 
        $userpic1 = '<div style="width:50px; height:50px; overflow:hidden; float:left; margin-right:20px;">' . check_pic("members", $if1id, "50", "profile") . '</div>'; 
        if($id == $if1id && $name == $if1user){ 
         $search_output .= '<div style="height:60px; padding:7px 5px 0px 5px;">' . $userpic1 . 'Username - <a href="profile.php?id='.$if1id.'" style="color:black;">' . $if1user . '<br />First Name - '.$if1first.'</a></div><hr />'; 
        } 
       } 
      } 
      else // if team 
      { 
       $sql_if2 = mysql_query("SELECT id, team_name, admin_name, churchname FROM myTeams WHERE id='".$id."'"); // if ID is a string 
       while($row3 = mysql_fetch_array($sql_if2)){ 
        $if2id = $row3['id']; 
        $if2user = $row3['team_name']; 
        $if2first = $row3['admin_name']; 
        $if2church = $row3['churchname']; 
        $userpic2 = '<div style="width:50px; height:50px; overflow:hidden; float:left; margin-right:20px;">' . check_pic("teams", $if2id, "50", "team") . '</div>'; 
        if($id == $if2id && $name == $if2user){ 
         $search_output .= '<div style="height:60px; padding:7px 5px 0px 5px;">' . $userpic2 . '<a href="team.php?id='.$if2id.'" style="color:black;">Team Name - ' . $if2user . '<br />Team Admin - '.$if2first.'</a></div><hr />'; 
        } 
       } 
      } 
    } // close while 
} else { 
    $search_output = "<hr />0 results for <strong>$searchquery</strong><hr />$sqlCommand2"; 
} // OPEN BEER \o/ 
?> 

많이해야하지만, 그것은 작동한다 나는 거기 때문에 여기 있습니다.

+0

와우, 정말 좋습니다. 나는 당신의 말을 이해한다고 생각하지만, 나는이 물건에 새로운 사람입니다. 더 나은 일이 있다면 여기에서 알아낼 수는 있지만, 시간이 좀 걸릴 수 있습니다. 마음을 돌리지 않으면 전체 코드가 휠 재가공을 줄이기를 바랍니다. 정말 고맙습니다! 내 명성에 15을 올리 자마자 나는 당신의 게시물에 투표 할 것입니다. –

+0

lol ok. 기본 양식을 작성하고 주요 버그를 수정합니다. 그것은 효과가 있지만 개선의 여지가 있습니다. 걱정하지 마세요, 빨리 올거야;) – roselan

+0

괜찮습니다. 그러나 여전히 POST가 없기 때문에 $ sql2에서 $ searchquery에 대한 정의되지 않은 변수가 계속 나타납니다. 이 문제를 어떻게 해결할 수 있습니까? –

관련 문제