我有一个PHP脚本,加载后首先检查它是否是通过POST加载的,如果没有,如果GET ['id']是一个数字。
现在我知道我可以这样做:
if(isset($_GET['id']) AND isNum($_GET['id'])) { ... }
function isNum($data) {
$data = sanitize($data);
if ( ctype_digit($data) ) {
return true;
} else {
return false;
}
}
但我想这样做:
if(isNum($_GET['id'])) { ... }
function isNum($data) {
if ( isset($data) ) {
$data = sanitize($data);
if ( ctype_digit($data) ) {
return true;
} else {
return false;
}
} else {
return false;
}
}
当我这样尝试时,如果没有设置$ _GET ['id'],我会收到一个未定义索引的警告:id ...就像我把$ _GET ['id']放进去一样在我的函数调用中,它会发出警告......即使我的函数会检查是否设置了var ...
有没有其他方法可以做我想做的事情,或者我被迫总是检查isset然后添加我的其他要求.. ??
答案 0 :(得分:3)
我总是包含一些其他语言提供的便利功能:get。
function get($needle, $haystack, $return=null) {
return array_key_exists($needle, $haystack) ? $haystack[$needle] : $return;
}
现在你可以致电:
if(isNum(get('id', $_GET))) {
// do something here
}
答案 1 :(得分:3)
您可以更改isNum
以参考
<?php
if(isNum($_GET['id'])) { ... }
function isNum(&$data) {
if (isset($data) ) {
$data = sanitize($data);
return ctype_digit($data);
} else {
return false;
}
}
但是,$_GET['id']
将在调用时隐式创建并初始化为NULL
。
如果您对此解决方案不满意,或者使用此解决方案的黑客性质,请使用其他答案。
答案 2 :(得分:0)
您在最初传递时引用了未定义的索引。你可以这样做:
$key = 'id';
function foo($id ) {
if ( isset( $_GET[$id] ) ) {
}
}
或者你可以在函数调用之前执行isset。
if ( isset($_GET['id']) && isNum($_GET['id'])) { }
另一种选择,使用临时变量:
$foo = isset( $_GET['id'] ) ? $_GET['id'] : null;
if ( $foo ) { functionCall($foo); }
如果错误报告级别与您无关,您也可以降低错误报告级别。
答案 3 :(得分:0)
以下是使用自定义类执行此操作的优雅方法:
首先,定义一个SmartArray类:
class SmartArray extends ArrayObject {
public static function convert(&$array) {
$array = new self($array);
}
public function offsetGet($index) {
return $this->offsetExists($index)? parent::offsetGet($index):NULL;
}
}
然后简单地致电:
SmartArray::convert($_GET);
现在,如果$ _GET没有密钥'id',您的if(isNum($_GET['id'])) { ... }
将不再抱怨:)
答案 4 :(得分:-2)
这就是你想要的,检查以确保在调用isNum
之前设置了id:
if(isset($_GET['id']) && isNum($_GET['id'])) {
...
}