函数的变量未定义
我将整个分页脚本放入函数中,以便可以多次使用它。代码很长,但只有一部分我遇到了麻烦。函数的变量未定义
我调用该函数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
要设置$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'];
编辑:你显然定义$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;
来访问在任何函数外部定义的函数。但是,你不鼓励这样做,除了(可以说)为应用程序范围的配置指令。
(注 - 这不一定是问题,但是......)
$start = empty($page) ? $start = 0 : $start = ($page - 1) * $limit;
应该
$start = empty($page) ? 0 : ($page - 1) * $limit;
谢谢你的注意!我立即改变了它:) – 2010-07-31 20:11:26
你的代码完美无缺!这将在我的PHP冒险中得心应手:)谢谢! – 2010-07-31 20:54:14