質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

PHPで複数のGET or POST値をそれぞれのパラメタ名を変数名にして格納する綺麗なやり方をご存知ありませんか?

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 2,589

score 26

はじめまして、
phpでフォームから取得する値についてなのですが、
まずはこんなコードで変数に格納してみました。

//空判定のインデックス
$errorm = 's-non-used';


//検索ボックスから値取得
//product,event,desire,number,trouble,start

$query = preg_split('/=[a-zA-Z0-9%]*&/', $_SERVER['QUERY_STRING'].'&');

foreach ($query as $value){

        if($_GET["$value"] !== ''){

            $$value = $_GET["$value"];

        } else {

            $$value = $errorm;

        }
}
しかし、$_SERVER['QUERY_STRING'].'&'の.'&'であるとか、
正規表現は速度が遅いだとかもう少し綺麗にできたらいいのですが
私では力不足でできません。

どなたかもっと綺麗で高速なソースコードのわかる方、お願い致します。
複数のGET値をそれぞれのパラメタ名を変数名にして
全部格納できるソースコードでお願い致します。


ちなみにベストアンサーを付けるときは
  • GETもPOSTもできる
  • 空の値にインデックスを付けられる
などが揃ってれば、あとは速さと見た目が綺麗なソースコードで判断します。

実行速度を簡単に測る環境が手元に無いもので申し訳ないのですが、

index.php?a=a&b=b&c=c&d=d&・・・&z=z
を便宜的に${a0}~${a999},${z0}~${z999}に
千回繰り返し格納した時間も併記していただけると助かります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

それは、php.iniで、register_globals を on にしたのと同じ効果ですね。下記参照。
http://jp2.php.net/manual/ja/ini.core.php#ini.register-globals
http://jp2.php.net/manual/ja/security.globals.php

攻撃者が、任意の名前の変数に任意の値を設定できるというリスクを抱えていることを認識されていますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/15 03:14

    知らずに危険なコードを書いていたみたいで、指摘していただけて助かりました。
    自分のコードを修正するとともに、同じことを思って検索した方がリスクに気付けるよう
    最初の条件と違いますがotn様をベストアンサーとさせていただきます。

    絶対あったら便利なのにと思ってたらそういう歴史があったのですね、
    言われて初めてリスクに気づきました、本当にありがとうございます。

    キャンセル

0

// http://example.com?q=search&r=firefox

$method = ('GET' === filter_input(INPUT_SERVER, 'REQUEST_METHOD')) ? INPUT_GET : INPUT_POST;
$params = filter_input_array($method);
var_dump($params);
/*
  array (size=2)
  'q' => string 'search' (length=6)
  'r' => string 'firefox' (length=7)
 */

// 可読性を損ない、保守性が悪いので extract は個人的には絶対利用しない。
extract($params);
var_dump($q);
/*
 * string 'search' (length=6)
 */
var_dump($r);
/*
 * string 'firefox' (length=7)
 */

千回繰り返し格納した時間も併記していただけると助かります。 
ご自身で検証してください。
そもそも Query String には長さの制限もあるので意味をなさないし、速度を気にするならPHPは使わない。


extract より

警告 extract() をユーザー入力 ($_GET や $_FILES など) のような信頼できないデータについて使用しないでください。 もし行う場合、例えば register_globals を信頼しているような古いコードを一時的に実行したい場合、 EXTR_SKIP のような flags の値が上書きされていないことを確認してください。そして php.ini の variables_order で定義されたものと同じ順で展開すべきであることに留意してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

↓こんな感じでいかがでしょうか?
<?php
//空判定のインデックス
$errorm = 's-non-used';

function getParam($key, $errorm) {
    if(isset($_GET[$key])) return $_GET[$key];
    if(isset($_POST[$key])) return $_POST[$key];
    return $errorm;
}

$a=getParam("a", $errorm); // 変数使用時に都度パラメータ取得

var_dump($a);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/15 03:10

    以下のような場合に、意図した動きになりません。

    <?php

    function getParam($key, $errorm = 's-non-used')
    {
    if (isset($_GET[$key])) {
    return $_GET[$key];
    }
    if (isset($_POST[$key])) {
    return $_POST[$key];
    }
    return $errorm;
    }

    $a = getParam("q", $errorm);
    ?>
    <!DOCTYPE HTML>
    <html lang="ja-JP">
    <head>
    <meta charset="UTF-8">
    <title></title>
    </head>
    <body>
    <form action="?q=getparam" method="post">
    <input type="text" name="q" />
    <button>submit</button>
    </form>
    <pre>
    <?php
    if (isset($a)) {
    var_dump($a);
    }
    ?>
    </pre>
    </body>
    </html>

    キャンセル

  • 2015/10/15 03:16

    ・GETとPOSTを同時に使用する
    ・GETとPOSTの同フォーム名で異なる値を使用する
    という点に難がありますね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • PHPで複数のGET or POST値をそれぞれのパラメタ名を変数名にして格納する綺麗なやり方をご存知ありませんか?