2

我有一个通过查询字符串接收变量的 PHP 脚本。

一开始我使用explode 将某些字符串放入一个数组中,因为它们包含我需要使用的几个值。举个例子:

index.php?a=2,2&b=foo&i=&s=bar

$d['i'] = explode(',',$_GET['i']); 
$d['s'] = $_GET['s'];       
$d['a'] = explode(',',$_GET['a']);
$d['b'] = explode(',',$_GET['b']);

我需要检查是否设置了某些变量,因为它们是强制性的,即必须设置“i”和“s”并包含一些数据。

当这些未设置或为空时,我想重定向到错误页面。但是,它并不总是有效,我不知道为什么。当我说“不总是”时,这就是我的意思。它似乎随机接受和拒绝空变量,我不知道为什么。

这是我现在拥有的 PHP 代码:

    if(!$d['i'] || !$d['s']) {
        header('Location: error.php?e=2');
    }

首先我只有上述内容,但是当变量设置但为空时,它仍然通过。

我当时尝试的是使用:

    if(strlen($d['i']) < 1 || strlen($d['s']) < 1) {
        header('Location: error.php?e=2');
    }

但出于某种奇怪的原因,它仍然接受空字符串。我也试过这个,但没有成功:

    if(empty($d['i']) < 1 || empty($d['s']) < 1) {
        header('Location: error.php?e=2');
    }

关于我在这里做错了什么的任何线索?

4

3 回答 3

0

感谢您的良好提示和提示!这是我现在解决的方法:

index.php?a=2,2&b=foo&i=&s=bar

if(empty(trim($_GET['i'])) || empty(trim($_GET['s'])) {
    header('Location: error.php?e=2');
}

$d['i'] = explode(',',trim($_GET['i'])); 
$d['s'] = trim($_GET['s']);       
$d['a'] = explode(',',trim($_GET['a']));
$d['b'] = explode(',',trim($_GET['b']));

也许不是最好的解决方案,但它有效!

于 2013-10-30T15:21:48.957 回答
0

直接回答:

使用trimandarray_filter确保数组具有值。

/* get the string value of i */
$i = $_GET['i'];

/* explode it into an array of values */
$i = explode(',', $i);

/* use array_map to apply trim to each value contained by i */
$i = array_map('trim', $i);

/* OR */

/* use array_map to apply intval / floatval to each value contained by i */
$i = array_map('intval', $i);

/* use array_filter to remove all empty entries */
/* this includes integer 0 (zero) values, empty strings, nulls etc. */
$i = array_filter($i);

/* OR */

/* use array_filter to remove all empty entries */
/* specify a function which validates if a value */
/* should be considered empty, perhaps you don't */
/* want integer 0 (zero) values to be filtered */
function my_filter($value) {
    return($value === '');
}

$i = array_filter($i, 'my_filter');

/* after trimming and filtering the array */
/* you can use PHP's `empty($i)` or `count($i) < 1` */
if(empty($i)) {
    /* do redirect */
}

背景资料:

当您尝试检查某事物是否为trueor falsesetor 或or时not set,会进行许多隐式转换和假设。emptynot empty

在您的特定情况下:

if($d['i'] || $d['s']) {}

做出以下假设:

因为$d['i']是一个数组,所以一个trueorfalse评估是基于天气进行的!empty($d['i']),这意味着它必须包含至少一个值。

例如,如果原始字符串值来自$_GET['i']is ',',则爆炸将生成一个包含两个空字符串的数组。因为$d['i']包含两个空字符串,所以它被认为不是空的——即使它包含的值本身被认为是空的。

如果类似地,原始字符串值 from$_GET['i']'0',则explode 将生成一个包含一个字符串的数组。因为$d['i']包含一个字符串,所以它被认为不是空的——即使它包含的值本身被认为是空的。

例如,如果来自的原始字符串值$_GET['i']' '(注意空格),那么explode 将生成一个数组,其中包含一个包含一个空格的字符串。因为$d['i']包含字符串,所以它被认为不是空的。

于 2013-10-30T11:34:31.700 回答
0

爆炸后,变量将是一个数组而不是字符串,因此您需要使用计数进行检查。

if(!isset($d['i'][0]) || !isset($d['s'])) {
    header('Location: error.php?e=2');
}

或者

if(count($d['i']) < 1 || strlen($d['s']) < 1) {
    header('Location: error.php?e=2');
}
于 2013-10-30T11:26:19.573 回答