2011-08-02 1 views
1

データの配列をPHPファイルに渡すJavascript関数があります。PHPでJavascriptから渡されたデータの配列を取得するにはどうすればよいですか?

function SaveFileToDisk(filename) 
{ 
    var ssForm = document.createElement("form"); 
    ssForm.method="post" ; 
    ssForm.action = "saveScenario.php" ; 
    ssForm.target = "hiddenSaveScenarioStatusFrame"; 

    for (var i = 0; i < ScriptSteps.length; i++) 
    { 
     var ssInput = document.createElement("input"); 
     ssInput.setAttribute("filename", filename); 
     ssInput.setAttribute("timestamp", ScriptSteps[i].timestamp); 
     ssInput.setAttribute("lhsName", ScriptSteps[i].lhsName); 
     ssInput.setAttribute("lhsPort", ScriptSteps[i].lhsPort); 
     ssInput.setAttribute("lhsBandwidth", ScriptSteps[i].lhsBandwidth); 
     ssInput.setAttribute("lhsDelayMin", ScriptSteps[i].lhsDelayMin); 
     ssInput.setAttribute("lhsDelayMax", ScriptSteps[i].lhsDelayMax); 
     ssInput.setAttribute("lhsDropLoss", ScriptSteps[i].lhsDropLoss); 
     ssInput.setAttribute("lhsFilters", ScriptSteps[i].lhsFilters); 
     ssInput.setAttribute("lhsDefaultFilter", ScriptSteps[i].lhsDefaultFilter); 
     ssInput.setAttribute("rhsName", ScriptSteps[i].rhsName); 
     ssInput.setAttribute("rhsPort", ScriptSteps[i].rhsPort); 
     ssInput.setAttribute("rhsBandwidth", ScriptSteps[i].rhsBandwidth); 
     ssInput.setAttribute("rhsDelayMin", ScriptSteps[i].rhsDelayMin); 
     ssInput.setAttribute("rhsDelayMax", ScriptSteps[i].rhsDelayMax); 
     ssInput.setAttribute("rhsDropLoss", ScriptSteps[i].rhsDropLoss); 
     ssInput.setAttribute("rhsFilters", ScriptSteps[i].rhsFilters); 
     ssInput.setAttribute("rhsDefaultFilter", ScriptSteps[i].rhsDefaultFilter); 
     ssForm.appendChild(ssInput) ; 
    } 
    document.body.appendChild(ssForm) ; 
    ssForm.submit() ; 
    document.body.removeChild(ssForm) ; 
} 

を次のように私にはjavascriptがその場でフォームを作成します。しかし、私は私のPHPスクリプトを書くとき、私は、$ _POST変数に配列を見つけることを期待して、私は上記を含む配列の各要素になるだろうと考えられていましたフィールドおよび対応するデータ。 PHPスクリプトで$ _POST配列のサイズを調べると、ゼロとして出力されます。私は何が間違っているのですか、私はこの種のことをするために間違った方法を使用しています。

私は実際にファイル名を一度に渡すだけですが、最も簡単な方法は配列のすべての要素を渡すことだと考えました。ファイル名が一度渡され、残りのフィールドが各「ステップ」に対して渡されるように、より良い方法がありますか? WebからJavascriptからPHPへのデータの配列を渡すアイデアがありました。私が試した方法の1つは非常に多くありますが、PHP側でデータを取得する方法は説明していません。事前に

おかげ

アンディ

答えて

1

は(それが何である、「lhsName」のように?それはHTMLではありません)実際には、あなたはただ1つinuptフィールドを作成しているし、それに気紛れな属性の束を割り当てます。結果のHTMLを見てください。変数ごとに1つの入力が必要です。

一方、全体的なアプローチは奇妙です。スクリプトを呼び出して、すべての変数をJSONエンコードされたデータとして投稿してみませんか?

は、入力要素のカスタム属性は$ _POSTに渡されていない

+0

私の配列は、「気紛れな属性」のセットを含む各オブジェクトは、オブジェクトの配列です。あなたのコメントから、私はこれを行うために間違った方法を選択した可能性があります。 PHPスクリプトへのデータのような大規模な配列を渡す方法についての提案を歓迎します。彼らはAJAX-例に満ちているよう –

+0

は、提供されたリンクを見てください「...方法についての提案を歓迎します」 – feeela

1

も参照してください。 "value"属性のみが渡されます。おそらく、あなたはたくさんの「隠された」要素が必要でしょう:< input type = "hidden" name = "..." value = "..."/>

0

私はPHPの人ではありませんが、スクリプト側からは確実に1つの入力を作成し、その入力に属性を割り当てます。入力のタイプも指定していませんが、少し驚いていますが、これは追加の問題を引き起こすものではありません。

フォームを送信すると、入力ごとに値が取得されます。あなたは20個の値を提出したい場合は、どちらかあなたのパラメータ/状態のコレクションをシリアル化することができますするかをフォームフィールドを必要とするか、パラメータごとにフォームフィールドを作成し、コレクションを提出しなければなりません。再び

、私はPHPの男じゃないながら、私は、サーバー側で、あなたが提出した各入力を得るだろうとかなり確信している - あなたがここに1つの入力を作成している場合ので、再び、私は期待したいですあなたはssInputに本当の値(値=「X」)を得ることはありませんので、あなたはそれで一つの値を使用してサーバー側の配列を取得している、その値は空の文字列またはNULL(再び、ないPHPの男)です。

ssInput.setAttribute("type", "hidden"); 

幸運:あなたが提出した変数に関して、サーバー側でも、単一のエントリを取得していない場合は、右のあなたのdocument.createElement("INPUT")線の下にあなたのjavascriptに次の行を追加してみてください!

B

1

http://www.w3.org/TR/html401/interact/forms.html#submit-formatは言う:

17.13.2成功コントロール

成功した制御が提出のための "有効" です。すべての成功したコントロールは、そのcontrol nameは、送信されたフォームデータセットの一部としてそのcurrent valueとペアになっています。

そして、コントロール名は、コントロールの「コントロール名が」そのname属性によって与えられ

として定義されます。

あなた input要素には name属性なし type(および値なし)を持っていません。
あなたが何か必要があると思います以上のような

for (var i = 0; i < ScriptSteps.length; i++) 
{ 
    var ssInput; 
    ssInput = document.createElement("input"); 
    ssInput.setAttribute("type", "hidden"); 
    ssInput.setAttribute("name", "x["+i+"][timestamp]"); 
    ssInput.value = ScriptSteps[i].timestamp; 
    ssForm.appendChild(ssInput) ; 

    ssInput.setAttribute("lhsName",); 
    ssInput = document.createElement("input"); 
    ssInput.setAttribute("type", "hidden"); 
    ssInput.setAttribute("name", "x["+i+"][lhsName]"); 
    ssInput.value = ScriptSteps[i].lhsName; 
    ssForm.appendChild(ssInput); 

しかし、あなたは必ずしもフォーム要素を作成し、サーバーにキー=値のペア(または他の文字列)を転送するために、そのフォームを提出する必要はありません。たとえば、次のようなものに興味があるかもしれません。代わりにjQuery.ajax配列が非常に大きくなる可能性があり、私はちょうどそのデータを渡すための最良の方法を探しています -

関連する問題