2016-02-29 63 views
1

需要對此進行說明..我將分頁添加到網站,並且需要Filter Input/Escape Output上的指針。正如你在下面看到的,新創建的page全局默認爲頁面1,當頁面第一次加載時,這是正確的行爲,使用速記三元運算符。什麼是創建過濾_GET變量的正確方法?

<snip> 
$itemsPerPage = 20; 
$numOfFilms = $totalRows->rows; 
$numOfPages = ceil($numOfFilms/$itemsPerPage); 

// Default 'page' to Page 1 
$filter ='page'; 
$get_pages = isset($_GET[$filter]) ? $_GET[$filter] : 1; <-- This line 
//var_dump($get_pages); <-- Testing 
</snip> 

$paginationOptions = [ 
    'options' => [ 
    'default' => 1, 
    'min_range' => 1, 
    'max_range' => $numOfPages 
     ] 
    ]; 

$pageNumberClean = trim($get_pages); 
$pageNumber = filter_var($pageNumberClean, FILTER_VALIDATE_INT, $paginationOptions); 
$range = $itemsPerPage * ($pageNumber - 1); 

知道我應該永遠不要相信用戶的輸入,反過來原因Netbeans的拋出一個警告:

不直接訪問超全局_GET數組。使用一些過濾的功能,而不是...


如果我換三元聲明兩側filter input警告消失,並且在語法上是正確的,但該頁面將無法運行,因爲過濾輸入變量page在_GET數組中不存在,所以:

什麼是公認的標準或正確的方法來創建_GET數組變量,而不直接訪問_GET數組?換句話說:我可以正確使用filter_input並創建變量,所以警告消失了嗎? 告訴我關閉警告不是我正在尋找的答案。還要注意我已經搜索了「如何初始化一個_GET變量」,並且大部分結果解釋了我已經知道的$_GET$_POST之間的區別。

感謝您的時間

+0

這個怎麼樣:只接受一個整數頁碼。 「$ get_pages =(isset($ _ GET [$ filter])&& is_int($ _ GET [$ filter]))?$ _GET [$ filter]:1;」 – Hiphop03199

+0

此外,在您的代碼中可能有錯誤 - get_pages前應該有'$'嗎? – Hiphop03199

+0

@ Hiphop03199是的,這就是我得到的複製/粘貼LOL ....固定 – eyoung100

回答

1

這裏是一個要滿足的NetBeans,因爲它使用的PHP的過濾功能中的一個解決方案。正如我在評論中提到的那樣,我會認爲「is_int()」是一個足夠安全的檢查以便在此處使用。

$filtered_page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT); 
$get_pages = (!empty($filtered_page)) ? $filtered_page : 1; 

根據以下位置的PHP文檔,這將從GET變量中刪除所有非整數字符。然後我們檢查以確保剩餘的字符串不爲空(空白,假或0)。

請注意:頁碼0會觸發空白,並返回1.請讓我知道這是否是一個問題。

https://secure.php.net/manual/en/function.empty.php https://secure.php.net/manual/en/function.filter-input.php https://secure.php.net/manual/en/filter.filters.sanitize.php

https://php.net/manual/en/function.is-int.php

額外注意:您也可以帶參數的過濾功能,包括默認值做到這一點。這樣你可以乾淨地用兩條線完成:

$filter_options = array('options'=>array('default'=>1, 'min_range'=>1, 'max_range'=>$numOfPages)); 

$get_pages = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, $filter_options); 
+0

我嘗試添加第三個條件,正如你上面所建議的那樣,並且工作正常。警告消失了,因爲中間狀態符合警告。現在我會嘗試這一個,因爲它看起來更優雅,即我沒有想到將過濾的輸入傳遞給'$ get_pages' – eyoung100

+0

根據文檔,filter_input返回「成功請求變量的值,FALSE if過濾器失敗,如果沒有設置variable_name變量,則爲NULL;如果使用標誌FILTER_NULL_ON_FAILURE,則在變量未設置時返回FALSE,如果過濾器失敗,則返回NULL。所以更好的實現將會針對失敗或者NULL來檢驗結果是否爲FALSE,以查看它是否不存在。否則,它將是基於篩選器選擇的「int」,並且零將是有效的。 – Octopus

+0

我很好,因爲它寫在上面,因爲我的輸出總是從第1頁開始,即格式錯誤的'?page = 0'應該返回第1頁。 – eyoung100

相關問題