PHP - 使用isset里面的函数不工作..?

时间:2010-06-14 15:06:30

标签: php function

我有一个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然后添加我的其他要求.. ??

5 个答案:

答案 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'])) {
...
}