2010-07-31 262 views
0

我將整個分頁腳本放入函數中,以便可以多次使用它。代碼很長,但只有一部分我遇到了麻煩。函數的變量未定義

我調用該函數paginate($connection, "categories");後,我用

$sql = "SELECT * FROM categories ORDER BY cat_name LIMIT $start, $limit"; 

etc.. 

,我得到這些錯誤。

注意:未定義的變量:開始 注意:未定義的變量:限制你 在您的SQL語法錯誤; 檢查對應 你的MySQL服務器版本的 正確的語法使用近「」在1號線

它不承認我有我上面的查詢調用該函數的變量的手冊。我從來沒有把這麼多的代碼放在函數中,所以我不知道我該怎麼做。我試着返回那些未定義的變量(在函數中),但沒有奏效。我也試圖避免使用全局變量 - 我聽說它們已經被棄用了。

下面是實際功能

function paginate($connection, $tableName) { 

//Pagination 
$targetpage = "http://localhost/website/all_categories.php";  
$limit = 4; //sets how many rows to display on each page 

//count rows 
$sql = "SELECT COUNT(*) as num FROM $tableName"; 
$total_pages = $connection->query($sql) or die(mysqli_error($connection)); 
$row = $total_pages->fetch_assoc(); 
$total_pages = $row['num']; 

//if there's no page number, set it to the first page 
$stages = 3; 
$page = isset($_GET['page']) ? $_GET['page'] : 0; 
$start = empty($page) ? $start = 0 : $start = ($page - 1) * $limit; 

// Initial page num setup 
    if ($page == 0){$page = 1;} 
    $prev = $page - 1; 
    $next = $page + 1;       
    $lastpage = ceil($total_pages/$limit);  
    $LastPagem1 = $lastpage - 1;      


    $paginate = ''; 
    if($lastpage > 1) 
    { 

     $paginate .= "<div class='paginate'>"; 
     // Previous 
     if ($page > 1){ 
      $paginate.= "<a href='$targetpage?page=$prev'>previous</a>"; 
     }else{ 
      $paginate.= "<span class='disabled'>previous</span>"; } 



     // Pages  
     if ($lastpage < 7 + ($stages * 2)) // Not enough pages to breaking it up 
     { 
      for ($counter = 1; $counter <= $lastpage; $counter++) 
      { 
       if ($counter == $page){ 
        $paginate.= "<span class='current'>$counter</span>"; 
       }else{ 
        $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";}      
      } 
     } 
     elseif($lastpage > 5 + ($stages * 2)) // Enough pages to hide a few? 
     { 
      // Beginning only hide later pages 
      if($page < 1 + ($stages * 2))  
      { 
       for ($counter = 1; $counter < 4 + ($stages * 2); $counter++) 
       { 
        if ($counter == $page){ 
         $paginate.= "<span class='current'>$counter</span>"; 
        }else{ 
         $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";}      
       } 
       $paginate.= "..."; 
       $paginate.= "<a href='$targetpage?page=$LastPagem1'>$LastPagem1</a>"; 
       $paginate.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>";  
      } 
      // Middle hide some front and some back 
      elseif($lastpage - ($stages * 2) > $page && $page > ($stages * 2)) 
      { 
       $paginate.= "<a href='$targetpage?page=1'>1</a>"; 
       $paginate.= "<a href='$targetpage?page=2'>2</a>"; 
       $paginate.= "..."; 
       for ($counter = $page - $stages; $counter <= $page + $stages; $counter++) 
       { 
        if ($counter == $page){ 
         $paginate.= "<span class='current'>$counter</span>"; 
        }else{ 
         $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";}      
       } 
       $paginate.= "..."; 
       $paginate.= "<a href='$targetpage?page=$LastPagem1'>$LastPagem1</a>"; 
       $paginate.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>";  
      } 
      // End only hide early pages 
      else 
      { 
       $paginate.= "<a href='$targetpage?page=1'>1</a>"; 
       $paginate.= "<a href='$targetpage?page=2'>2</a>"; 
       $paginate.= "..."; 
       for ($counter = $lastpage - (2 + ($stages * 2)); $counter <= $lastpage; $counter++) 
       { 
        if ($counter == $page){ 
         $paginate.= "<span class='current'>$counter</span>"; 
        }else{ 
         $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";}      
       } 
      } 
     } 

       // Next 
     if ($page < $counter - 1){ 
      $paginate.= "<a href='$targetpage?page=$next'>next</a>"; 
     }else{ 
      $paginate.= "<span class='disabled'>next</span>"; 
      } 

     $paginate.= "</div>";  


} 
echo $total_pages.' Results'; 
// pagination 
echo $paginate; 


}//end function 

回答

0

要設置$start$limit裏面的功能,但你是不是返回這些變量。函數內部的變量有自己的本地scope,所以不能從函數外部訪問。

你需要你需要的功能之外。由於您需要多個變量,因此您可以在關聯數組中返回這些變量。例如,如果你把這個作爲你的函數的最後一行:

return array('start' => $start, 'limit' => $limit); 

...你可以這樣調用該函數:

$result = paginate($connection, "categories"); 

...和使用這樣的結果:

$sql = 'SELECT * FROM categories ORDER BY cat_name LIMIT ' . 
    $result['start'] . ', ' . $result['limit']; 
+0

你的代碼完美無缺!這將在我的PHP冒險中得心應手:)謝謝! – 2010-07-31 20:54:14

0

編輯:你顯然定義$start自己的函數中。如果它是在你的SQL語句之前定義的,那顯然是可以訪問的。不過,如果你不通過$start$end,我認爲你的分頁功能會非常有用。您還可以使用此語法定義的默認值:

function paginate($connection, $tableName, $start=0, $end="ALL") { 

如下

功能有自己的範圍;你應該通過函數外面定義的變量:

function paginate($connection, $tableName, $start, $end) { 

唯一的例外是超全局$GLOBALS$_GET$_POST$_COOKIE$_REQUEST$_SESSION$_FILES$_ENV$_SERVER

您還可以通過超全局數組$GLOBALS或在功能實現開始時添加global $var;來訪問在任何函數外部定義的函數。但是,你不鼓勵這樣做,除了(可以說)爲應用程序範圍的配置指令。

+0

請參閱http://docs.php.net/language.variables.scope – VolkerK 2010-07-31 20:05:20

+0

謝謝!你說服我只使用全局$ var。它使一切都更簡單:) – 2010-07-31 20:53:21

+0

@Cyber​​嗯,我希望我沒有。否則,當你有錯誤時,你會詛咒我,因爲某個全局正在被改變,你不知道在哪裏。只需傳遞額外的參數。 – Artefacto 2010-07-31 20:57:33

1

(注 - 這不一定是問題,但是......)

$start = empty($page) ? $start = 0 : $start = ($page - 1) * $limit; 

應該

$start = empty($page) ? 0 : ($page - 1) * $limit; 
+0

謝謝你的注意!我立即改變了它:) – 2010-07-31 20:11:26