在php函数中使用undefined变量

时间:2016-05-24 19:43:54

标签: php

我是PHP的新手并且处理可能有未定义变量的脚本,我有两种方法可以解决这个问题,我的问题是什么是最好的方法。

变量$_GET['page']有时可以定义,有时也可以定义。

我用isset()和if:

检查的第一种方式
if(isset($_GET['page'])){
    $sql.=limitrows($_GET['page'],10);
}else{
    $sql.=limitrows(1,10);
}

第二种方式我只是编写函数并使用@删除错误并处理函数内的isset()

 function limitrows($page=1, $rows=10){
       if (isset($page)==false or $page<=0 ){
         $page=1;
       }
  }

 $sql.=@limitrows($_GET['page'],10);

第二种方式使我的代码更清洁,我在函数内做了所有脏工作,但它显示错误,我必须@。 什么是最好的方法?

3 个答案:

答案 0 :(得分:3)

一种可能性是使用filter function来访问GET参数。

$page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT);

使用这种方法,$page始终设置,因此您不必担心未定义的索引警告。 (如果'page'不是$_GET中的密钥,filter_input将返回null。)

然后,当您需要稍后使用$page时,检查它会更简单:

function limitrows($page, $rows=10) {
    if (!$page) $page = 1;   // assuming you don't have a page 0, or
    // if ($page === null) $page = 1; // if you DO have a page 0
    // ... 
}

答案 1 :(得分:2)

另一种方法是使用array_key_exists来检查是否存在数组键。您可以使用if语句,或使用三元组缩短它。

// with if
$page = 1;
if (array_key_exists('page', $_GET) === true) {
    $page = $_GET['page'];
}

// with ternary
$page = array_key_exists('page', $_GET) === true ? $_GET['page'] : 1;

不要使用@错误抑制运算符。进入这是一个不好的做法,99.99%的时间你想在所有情况下看到所有错误。

编码中的“最佳方式”是意见,既定代码风格和行业最佳实践的组合。一般来说,应该为作业使用正确的函数(在这种情况下,array_key_existsfilter_input,如另一个答案所示),不使用正常代码流的错误处理,抑制或异常,以及明确/冗长,而不是尝试最短的代码。您可能能够将某些东西压缩成1行而不是3行,但到了什么目的?它所做的只是增加代码中任何给定部分的特定复杂性,使其他人(以及您自己!)在将来更难理解和维护。

就在哪里做什么而言,在函数外收集你的参数并验证函数内的参数。

文档/更多阅读

答案 2 :(得分:0)

使用三元运算符

$sql.=@limitrows(isset($_GET['page'])?$_Get['page']:1,10);

格式[逻辑]?[true]:[false]