0

奇妙な問題があります。複数のフォームに使用される 1 つの PHP スクリプトがあります。すべてのリクエストを受け取り、データベース内の適切なテーブルにデータを配置します。現状では、次のようになります。

    $fields = "";
$values = "";

foreach ($_REQUEST as $key=>$value)
{


        $key = str_replace(":","",$key);
        $fields .= "$key,";
        $values .= "'$value ',";
}


//remove the ending comma from $fields and $values
$fields = substr($fields, 0, -1);
$values = substr($values, 0, -1);

$sql = "INSERT INTO " . $survey . " ($fields) VALUES ($values)";
mysql_query($sql)
    or die(mysql_error());

そして、これはうまくいきます。問題は、チェックボックスのあるフォームがいくつかあることです (つまり、1 人が複数のオプションを選択できます)。get メソッドを使用すると、クエリ文字列は次のようになります。

www.somesite.php?V9=1&V9=2&V9=4

現在のスクリプトでは、最後の値であるため、4 だけが取得されます。

これが発生する理由は、チェックボックスの名前がフォームで定義されているためです。name="V9[]" ではなく name="V9" と表示されますが、フォームを変更できません。それらはソフトウェアによって生成され、どのユーザーも HTML フォームを作成し、それをスクリプトにポイントすると、それらの情報がテーブルに記録されるという考えです。したがって、HTML を変更することは私にとって選択肢ではありません。

そのため、キーが送信されたかどうかを検出し、送信された場合は値を追加する方法が必要です。私はこれを試しました:

    $fields = "";
$values = "";

foreach ($_REQUEST as $key=>$value)
{

        //check to see if the key has already been used for multi-choice questions
        $key_check = strpos($fields, "$key,");

        if($key_check !== false){
            $values = substr($values, 0, -2);
            $values .= "\;$value ',";
        }else{
            $key = str_replace(":","",$key);
            $fields .= "$key,";
            $values .= "'$value ',";
        }
}


//remove the ending comma from $fields and $values
$fields = substr($fields, 0, -1);
$values = substr($values, 0, -1);

$sql = "INSERT INTO " . $survey . " ($fields) VALUES ($values)";
mysql_query($sql)
    or die(mysql_error());

しかし、私は同じ結果を得ます。$key_check は決して有効ではないようです。どんな助けでも大歓迎です。ここの誰かが、同様のことを行う動作中の ASP バージョンを持っていますが、DB に保存するのではなく、データを電子メールで送信します。

4

3 に答える 3

1

$_GET を使用している場合は、これを試すことができます。

function convertInput($qs=""){
  $rtn = "";
  $holdingArray = array();
  if(trim($qs)!=""){
    $vars = explode("&", $qs);
    foreach($vars as $val){
      $kv = explode("=", $val);
      if(count($kv)==2){
        if(isset($holdingArray[$kv[0]])){
          $holdingArray[$kv[0]] .= "," . $kv[1];
        }else{
          $holdingArray[$kv[0]] = $kv[1];
        }
      }
    }
    $rtn = $holdingArray;
  }
  return $rtn;
}
print_r(convertInput($_SERVER["QUERY_STRING"]));
于 2012-05-04T13:44:46.163 に答える
0

PHP は、リクエスト文字列 (クエリ文字列または x-www-form-urlencoded) を $_GET、$_POST、および $_REQUEST 配列に解析します。これには、同じキーが複数回存在する場合、後のキー値が前の値を上書きするという規則が使用されます。したがって、PHP が期待するように追加するフォームのキー名を変更できない場合は[]、生のクエリ文字列にアクセスして手動で解析する必要があります。

キー名を繰り返さないで繰り返すと[]、クエリ文字列のキーがスカラーと配列のどちらを意味するのかが曖昧になることに注意してください。それを解決する方法を決定する必要があります。たとえば、配列値を持つサーバー定義のハードコードされた名前のリストを使用できます。

これは、クエリ文字列を値のリストに処理する方法です。

function paramlist($querystring, $raw=false) {
    $plist = array();
    $decoder = ($raw) ? 'rawurldecode' : 'urldecode';
    $pairs = explode('&', $querystring);
    foreach ($pairs as $pair) {
        $plist[] = array_map($decoder, explode('=', $pair, 2));
    }
    return $plist;
}

のようなクエリ文字列がある場合a=1&b=2&a=3、この関数は を返しarray(array('a','1'),array('b','2'),array('a','3'))ます。次に、必要なロジックを使用して、それを連想配列に変換できます。

ただし、最初にクエリまたはフォーム文字列を取得する必要があります。

if ($_SERVER['REQUEST_METHOD']==='POST'
    and $_SERVER['CONTENT_TYPE']==='application/x-www-form-urlencoded') {
   // form body
   $qs = trim(file_get_contents('php://input'));
} else {
   // url query string
   $qs = $_SERVER['QUERY_STRING'];
}

でエンコードされたフォームを送信するとmultipart/form-data、PHPは未加工のリクエストにアクセスできない(機能しphp://inputない) ため、この場合、フォーム変数を再処理する方法がないことに注意してください。ごめん!

于 2012-05-04T14:17:00.380 に答える
0

これを試して:

$keys = array();
$values = array();
foreach ($_POST as $key=>$value){ //So, it will loop through the form data
    if (!array_search($key, $keys)){ //Checking to see if the key has been used yet
        $keys[] = $key;
    } else {
        $values[$key][] = array($key=>$value);
    }
}

これはFORM SELECT、データがブラウザから保持され、論理的に削除されている場合、同じフォームから構築された選択の配列を構築する必要があります (配列としてアクセスすると、同じ関連付けられたキーの最後の要素のみが保持されますが、それ以外の場合はデータ手続き的に排除されるのではなく、持っている必要があります)。

これが機能するかどうかはわかりません。これは、ドキュメントやコードの専門知識からではなく、理論に基づいて構築されているためです。

于 2012-05-04T14:05:28.557 に答える