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

直接の答え:

trimとを使用array_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 */
}

背景情報:

何かがtrueまたはfalsesetまたはnot setemptyまたはnot emptyであるかどうかを確認しようとしている場合、多くの暗黙の変換と仮定が行われています。

あなたの特定のケースでは:

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

次の仮定を行います。

$d['i']は配列であるため、またはtruefalse評価は天候に基づいて行われ!empty($d['i'])ます。つまり、少なくとも 1 つの値が含まれている必要があります。

たとえば、元の文字列値が$_GET['i']である','場合、爆発は 2 つの空の文字列を含む配列を生成します。2 つの空の文字列が含まれているため$d['i']、含まれている値自体が空と見なされていても、空ではないと見なされます。

同様に、からの元の文字列値が$_GET['i']である'0'場合、爆発は 1 つの文字列を含む配列を生成します。1 つの文字列が含まれているため$d['i']、空ではないと見なされます。含まれる値自体が空であると見なされたとしてもです。

たとえば、元の文字列値$_GET['i']' '(空白に注意してください) である場合、爆発は 1 つの空白を含む文字列を含む配列を生成します。文字列が含まれているため$d['i']、空ではないと見なされます。

于 2013-10-30T11:34:31.700 に答える