2010-07-31 159 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