8
$p = (isset($_REQUEST["p"])?$_REQUEST["p"]:"");

これは、私が通常phpコードで使用する一般的な行です。私はいつも同じものを書くためのより良い(小さくて速い)方法があると思いますか?

4

8 に答える 8

19

独自の関数を作成します:

function getIfSet(&$value, $default = null)
{
    return isset($value) ? $value : $default;
}

$p = getIfSet($_REQUEST['p']);

他にクリーンなソリューションはありません。

于 2012-10-17T11:49:42.480 に答える
7

どれくらい短くしたいですか?

もちろん、リクエスト値にアクセスするたびにこれを使用している場合は、どこかに関数を作成してから使用する必要があります。

function reqVal( $val, $default = "", $no_sql = true )
{
    $var = isset( $_REQUEST[$val] ) ? $_REQUEST[$val] : $default;
    $var = $no_sql ? nosql( $var ) : $var;
    return $var;
}

function getVal( $val, $default = "", $no_sql = true )
{
    $var = isset( $_GET[$val] ) ? $_GET[$val] : $default;
    $var = $no_sql ? nosql( $var ) : $var;
    return $var;
}

function postVal( $val, $default = "", $no_sql = true )
{
    $var = isset( $_POST[$val] ) ? $_POST[$val] : $default;
    $var = $no_sql ? nosql( $var ) : $var;
    return $var;
}

ここで、SQL インジェクション チェックを追加します。

function nosql( $var )
{
    if ( is_array( $var ) ) {
        foreach ( $var as $key => $elem ) $var[$key] = nosql( $elem );
    } else if ( $var === null ) {
        return null;
    } else {
        if ( get_magic_quotes_gpc() ) $var = stripslashes( $var );
        $var = mysql_real_escape_string( $var );
    }
    return $var;
}

そして、次のように常に簡単にアクセスします。

$p = reqVal( 'p', 0 );
$p = getVal( 'p', 'something', false );
$p = postVal( 'p' ); // or just forget the 2nd and 3rd parameter
于 2012-10-17T11:49:31.730 に答える
5

編集: PHP 7 は null 合体演算子 ("??") を追加します

$p = $_REQUEST["p"] ?? '';

https://www.php.net/manual/en/migration70.new-features.php


オリジナル:

より短いものが必要で、空の(文字列)デフォルト値で満足している場合は、次のように機能します。

$p = @$_REQUEST['p'];

@ はエラー抑制演算子であり、値が設定されていない場合に式が警告を出さないようにします。

http://www.php.net/manual/en/language.operators.errorcontrol.php

于 2014-01-17T16:50:13.967 に答える
2

私は通常、PHP が緩やかに型付けされているという事実を利用して、単純に次のようにします。

$p = (string) $_REQUEST['p'];

このように、$_REQUEST['p']が設定されていなくても、空の文字列が に格納され$pます。E_NOTICE設定されていないキーにアクセスすると " " の行に沿ってトリガーされるため、これはエラー ハンドラーが通知を無視する場合にのみ機能することに注意してくださいundefined index

于 2012-10-17T11:50:42.030 に答える
0

既存のコードを関数でラップする答えは良いです-それらがたくさんある場合、それらは実際にコードを整理します。

ただし、より良い解決策は、開始する前に一連の期待値に基づいてリクエスト配列全体をサニタイズすることです。

例えば:

function sanitiseRequest() {
    $expected = array(
        'p' => '',
        'id' => 0,
        //etc
    );

    //throw away any input that wasn't expected...
    foreach($_REQUEST as $key=>$value) {
        if(!isset($expected[$key]) { unset $_REQUEST[$key]; }
    }
    //and for any expected values that weren't passed, set them to the defaults.
    foreach($expected as $key=>$defvalue) {
        if(!isset($_REQUEST[$key]) { $_REQUEST[$key] = $defvalue; }
    }
}

次に、コードの先頭にこの関数への呼び出しを追加するだけで、コード内の他の場所を気にする必要はありませんisset($_REQUEST[..])

この概念を拡張して、入力引数を強制的に正しいデータ型にすることも、その他の必要なデータ クレンジングを行うこともできます。これにより、受信データが期待どおりに入力されていることを完全に確信できます。

それが役立つことを願っています。

于 2012-10-17T12:08:40.327 に答える
0

これは非常に一般的であるため、PHP でネイティブに行う方法がないのではないかと思います。ほとんどの開発者は、配列から安全に読み取る独自の関数を作成します。

/**
 * Gets the value associated with the specified key from an array.
 * @param array $array The array to search for the key.
 * @param mixed $key The key of the value to get.
 * @param mixed $default The default value to return, if the
 *   specified key does not exist.
 * @return mixed Value that is associated with the specified
 *   key, or the default value, if no such key exists.
 */
function getValueFromArray($array, $key, $default = null)
{
  $containsKey = isset($array[$key]);
  if ($containsKey)
    return $array[$key];
  else
    return $default;
}

/**
 * Gets the value associated with the specified key from an array.
 * @param array $array The array to search for the key.
 * @param mixed $key The key of the value to get.
 * @param mixed $value Retrieves the found value, or is set to null
 *   if the key could not be found.
 * @return bool Returns true if the key could be found, otherwise false.
 */
public function tryGetValueFromArray($array, $key, &$value)
{
  $containsKey = isset($array[$key]);
  if ($containsKey)
    $value = $array[$key];
  else
    $value = null;
  return $containsKey;
}
于 2012-10-17T11:52:34.183 に答える
0

http://php.net/manual/en/function.isset.phpUser Contributed Notesセクションで、さまざまなソリューションの多くの例を見つけることができます。

これを試して:

function get_if_set( $varname, $parent=null ) { 
    if ( !is_array( $parent ) && !is_object($parent) ) { 
        $parent = $GLOBALS; 
    }
    return array_key_exists( $varname, $parent ) ? $parent[$varname] : null; 
} 
于 2012-10-17T12:01:43.530 に答える