php-関数からの変数は未定義です
ページネーションスクリプト全体を関数に配置して、より多くの回数使用できるようにします。コードは長いですが、問題が発生している部分が1つだけあります。
関数を呼び出した後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 = empty($page) ? $start = 0 : $start = ($page - 1) * $limit;
あるべきです
$start = empty($page) ? 0 : ($page - 1) * $limit;
答え :
解決策:
関数内に$start
と$limit
を設定していますが、そうではありませんこれらの変数を返します。関数内の変数には独自のローカルスコープがあるため、関数の外部からアクセスすることはできません。
関数の外部で必要な変数を返す必要があります。複数の変数が必要なため、連想配列でこれらを返すことができます。たとえば、これを関数の最後の行として配置する場合:
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
、 {-code- 12}
、 $_ENV
、 $_SERVER
。
スーパーグローバル配列$GLOBALS
を介して、または最初に global $var;
を追加することにより、関数の外部で定義された関数にアクセスすることもできます。関数の実装。ただし、(おそらく)アプリケーションスコープの構成ディレクティブを除いて、そうすることはお勧めしません。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。