2012-10-17 9 views
5
$p = (isset($_REQUEST["p"])?$_REQUEST["p"]:""); 

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

+0

インライン条件は可能な限り短くします。もちろん、関数を定義することができます。問題はあなたのコードではなく、リクエストパラメータが実際に設定されているかどうかを知ることではありません。あなたの場合のベストでクリーンな方法は、必要な変数を、存在をチェックする関数を使ってそれにマッピングすることによって、必要な変数を初期化することでしょう。 – matthias

+1

これはあなたを助けるかもしれないhttp://stackoverflow.com/a/12798041/1226894 – Baba

+1

これを短くすることはできません。なぜそれを短くしたいのですか?十分に短くない? –

答えて

14

独自の関数を作成してください:

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

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

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

+1

なぜdownvote ?? – Aelios

+0

はい、私はいつもそのための関数を作ることができますが、これは私のステートメントと同じです。 +1答えが – Champ

+0

ちょうどより安全な関数 – Aelios

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 incjectionチェックを追加

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 
+0

私はこれが最良の解決策だと思っていますが、Aeliosの答えと同じように 'default value'パラメータを追加することで可能でしょう。 – enenen

+0

だから鉱山が最高です:D – Aelios

+0

答えを編集し、はい、@Aeliosはそれが重要だったら最初に行いました;) – Peon

2

私は通常のPHPが緩く型付けされたという事実を利用して簡単に実行します。

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

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

+0

そして、正しい空文字列と要求変数エラー? – Aelios

+0

「リクエスト変数エラー」とはどういう意味ですか? Champの自前のバージョンはどのように違いを知っていますか? –

+0

チャンプはありません、私は – Aelios

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; 
} 
+2

私はオブジェクト指向プログラミングのすべてですが、OPが短くて速い方法を求めているとしたら、関数や特にクラスは行く方法ではありません。 –

+0

@EliasVanOotegem - それはビューポイントに依存します。あなたが書かなければならないコードは本当に短いです。 'getValueFromArray($ _REQUEST、 'p')'を呼び出すだけです。私が知る限り、ネイティブ機能はありません。 – martinstoeckli

+0

確かに、関数がいっぱいに書き出されると、少数の文字を書く必要がありますが、関数呼び出しはより高価で、遅くなります(OPが現在使用しているようにインラインの三項に比べて)。彼はより小さいより速い選択肢の後ろにいるので、関数はより短いコードを提供しますが、遅くなります。ただスピードフロントの副作用 –

0

あなたはここにhttp://php.net/manual/en/function.isset.phpユーザー投稿による注記セクション内のさまざまなソリューションの多くの例を見つけることができます。

これを試してみてください:関数内で既存のコードをラップ

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; 
} 
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[..])をすることを心配する必要はありません。

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

希望に役立ちます。

3

あなたは短い何かをしたい、と空の(文字列)デフォルト値は、次の作品に満足している場合:

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

@は、エラー抑制演算子であり、場合に警告を与えてからの発現を維持します値は設定されません。

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

+0

これは素晴らしいことです。共有してリンクしてくれてありがとう! –

0

この1つは私のためによく働きます。 名前を2回書く必要はありません。 既に設定されている場合、varは変更されません。したがって、register_globalsを使って古いアプリケーションを素早くn回変換するのは安全です。

function getIfSet($key, $default = null) 
{ 
    global $$key; 

    if(!isset($$key)){ 
     if(isset($_REQUEST[$key])){ 
      $$key=$_REQUEST[$key]; 
     }else{ 
      if(!is_null($default)){ 
       $$key = $default; 
      } 
     } 
    } 
} 
function getIfSetArray($list){ 
    foreach($list as $item){ 
     getIfSet($item); 
    } 
} 

getIfSet('varname'); 
getIfSetArray(['varname_1','varname_2']); 

echo $varname; 
echo $varname_1; 
関連する問題