2010-08-09 44 views
10

這裏是不是空的是一個PHP代碼

​​

現在,如果ID設置(例如:index.php的ID = 12),然後該操作被執行,但如果沒有設置id(例如:index.php?id =),這會顯示一個錯誤,如何解決這個問題?

如何確定ID是一個整數,它不是空的,然後執行特定操作....

編輯

謝謝大家對你的答案,但我仍然收到這個錯誤...

if(isset($_GET['id'])) { // I implemented all these codes but still.... 
    $user= User::find_by_id($_GET['id']); 
    // Database Classes Fetches user info from database 
} 
else { 
    redirect('index.php'); //redirect function 
} 

如果id是1或大於1,那麼腳本執行完美。 (的index.php?ID = 1)

但我的id設置ID爲提我得到一個錯誤i..e的index.php?ID =

代碼應該自動重定向用戶的index.php頁面而不是顯示錯誤.....

錯誤:數據庫查詢失敗:您的SQL語法錯誤;檢查對應於你的MySQL服務器版本在線路附近使用「限制1」 1

+0

當查詢字符串中沒有設置id var時會發生什麼? – kevtrout 2010-08-09 21:07:01

+0

按整數,你的意思是PHP的數據類型,還是你的意思是任何數字序列? – Gordon 2010-08-09 21:19:04

+0

如果您查看代碼,它不是數據類型,因爲@_GET allways返回一個字符串。 – ThoKra 2010-08-09 21:23:19

回答

25

您應該同時檢查組狀態和內容:

if (isset($_GET['id']) && !empty($_GET['id'])) 
    // .... 

請注意,您應該而不是直接使用該值並使用它。你應該確保它只包含你期望的值。要檢查一個整數,甚至更好地從上一個整數上班,做這樣的事情:

$id = (isset($_GET['id']) && is_numeric($_GET['id'])) ? intval($_GET['id']) : 0; 

if ($id != 0) 
    // id is an int != 0 
else 
    redirect('index.php'); 
+1

is_int永遠不會是真的,從php.net:'注意:要測試一個變量是數字還是數字字符串(例如表單輸入,總是一個字符串),你必須使用is_numeric()。 ' – ThoKra 2010-08-09 21:00:11

+0

但是,如果我保持網址爲(index.php?id =)它顯示錯誤.....,它應該重定向到index.php – 2010-08-09 21:01:09

+0

@Terw:糟糕,這就是發生了什麼,當我嘗試記住某些功能我不經常使用..謝謝! – poke 2010-08-10 09:29:02

0
if (!empty($_GET['id']) && filter_var($_GET['id'], FILTER_VALIDATE_INT)) 

if (!empty($_GET['id']) && ctype_digit($_GET['id'])) 
+2

請注意,整數「0」和字符串「0」被PHP視爲「空」。 – 2010-08-09 20:52:59

+0

@丹尼爾:是的,我記得雖然在寫答案,但我敢打賭,他指的是一些主鍵肯定是正整數 – zerkms 2010-08-09 20:55:06

+0

這是完全可能的主鍵可能是零或負。 – timdev 2010-08-09 21:18:22

2

是什麼錯誤告訴你正確的語法手冊?

但是,如果它的設置,這將檢查,如果它是一個整數

if(isset($_GET['id']) && ctype_digit($_GET['id']) && intval($_GET['id']) > 0) 

is_numeric @ php.net

或檢查出ctype_digit

+1

讓我們假設?id = 1.5 – zerkms 2010-08-09 20:54:22

+1

'is_numeric'真的不會削減它。 – 2010-08-09 20:56:13

+0

鏈接到ctype_digit函數,只是檢查是否有整數,更新示例使用此 – ThoKra 2010-08-09 20:58:50

0

How to determine id is an integer and it's not empty and then perform the specific action....

if (!empty($_GET['id']) && (intval($_GET['id']) == $_GET['id'])) { 
    //do something 
} else { 
    redirect('index.php'); //redirect is a function 
} 

上面可能不是最好的解決辦法,但它應該工作你需要什麼。它不會讓id爲0,並且會要求它是一個整數。

+0

不會像你在php.net上看到的那樣,@_GEt永遠不會返回整數(如果你沒有指定它自己),它會返回一個字符串。 – ThoKra 2010-08-09 21:05:24

+0

謝謝你指出。我糾正了代碼,以便它能夠滿足他的需求。 – Joseph 2010-08-09 21:15:03

+0

可悲的是,它不適合我需要....它應該很簡單,如果 id =(空格)或id = 0它應該自動將用戶重定向到索引。php頁面沒有更進一步..但它不工作... :( – 2010-08-09 21:28:33

0

嗯......如果你將其設置爲一個整數類型的變量,那麼你也可以這樣做:

if($_GET['id'] && gettype($_GET['id']) == 'integer'){ 
    #do something 
}else{ 
    #do something else 
} 
+0

這不會起作用,因爲'gettype'會一直報告一個字符串類型,因爲GET參數通常不是鍵入的。另外調用'$ _GET ['id']'會在未設置時引發索引警告。 – poke 2010-08-10 16:22:43

0
if(isset($_GET['id']) && ctype_digit($_GET['id']) && is_numeric($_GET['id']) && $_GET['id']>0) { 
    $user= User::find_by_id($_GET['id']); 
    } 
else { 
    redirect('index.php'); //redirect function 
    } 

試試這個,這個代碼完全丸您的要求。

0

看來你只是有一個問題,當你想檢查它的設置時,是否拋出一個true。那是因爲它已設置,但未設置爲您想要使用的值。

我假設用戶ID必須是> 0,因此只是這樣做

if (isset($_GET['id']) && $_GET['id'] > 0) { 
    $user= User::find_by_id($_GET['id']); 
} else { 
    redirect('index.php'); 
} 

而且你prolly最好的清潔ID處理這麼

$userID = isset($_GET['id']) && $_GET['id'] > 0 ? (int) $_GET['id'] : 0; 

if ($userID) { 
    $user= User::find_by_id($userID); 
} else { 
    redirect('index.php'); 
} 

前Theres很多的方法來做到這一點,我個人更喜歡這一點。它使你的代碼看起來更乾淨。

0

你將不得不爲每個可能的情況檢查多次:如果id未設置或爲空,該怎麼辦?如果設置了id,但它不是數字?如果在GET請求中根本不存在'id'鍵怎麼辦?

我有類似的情況。我用GET發送了兩個變量,一個數字:'id',另一個字符串是一個名字:'state'...我通過檢查所有可能的條件來解決它。

相關問題