ジメジメする梅雨のお悩み、一挙解決! >>

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

このQ&Aに関連する最新のQ&A

PHP 特徴」に関するQ&A: PHPの特徴は

A 回答 (2件)

atsuGTさんこんにちは。




受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。
    • good
    • 1

補足ですが、PHPの特徴として


添え字がなくても0から順番に数字が勝手につきます。

<?PHP

print <<<eof
<form method="POST" action="$PHP_SELF">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="text" name="foo[]">
<input type="submit" value="go">
</form>
eof;

$foo = $_POST["foo"];
print_r($foo);

?>
    • good
    • 2

このQ&Aに関連する人気のQ&A

PHP 特徴」に関するQ&A: 右脇腹が痛い

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBのFunctionで、配列を引数や返却値にできますか?

配列の要素をソートするFunction を作成しようとしているのですが、
ソート対象配列を引数にして、返却値がソートされた配列になるように
したいと思ったのですが、その方法がわかりません。
それとも、引数に配列を入れることは不可能なのでしょうか。

Aベストアンサー

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです。



Option Explicit

Sub Main()
  Dim i As Long
  Dim Values() As Long
  
  '配列を初期化する
  ReDim Values(255) As Long
  For i = 0 To 255
    Values(i) = Rnd * 256
  Next i
  
  '配列をソートする
  Call QuickSortLong(Values())
End Sub

Public Sub QuickSortLong(ByRef Values() As Long, Optional StPos As Long, Optional EdPos As Long)

  Dim Ct As Long    'カウンタ
  Dim LastPos As Long  '配列最終番号
  Dim Buffer As Long   'バッファ
  
  '引数省略時の初期値
  If IsMissing(StPos) Then
    StPos = LBound(Values, 1)
  End If
  If IsMissing(EdPos) Then
    StPos = UBound(Values, 1)
  End If

  '終了番号が開始番号以下のときは処理を行わない
  If StPos >= EdPos Then
    Exit Sub
  End If

  '最初の値をバッファに格納
  Buffer = Values(StPos)
  '各バッファの値をスワップする
  '真ん中にある配列の値を最初の配列に代入する
  Values(StPos) = Values((StPos + EdPos) / 2)
  'バッファに格納された値を真ん中の配列に代入する
  Values((StPos + EdPos) / 2) = Buffer

  LastPos = StPos

  For Ct = StPos + 1 To EdPos
    If Values(Ct) < Values(StPos) Then
      LastPos = LastPos + 1
      '各バッファの値をスワップ
      Buffer = Values(LastPos)
      Values(LastPos) = Values(Ct)
      Values(Ct) = Buffer
    End If
  Next Ct

  '各バッファの値をスワップ
  Buffer = Values(StPos)
  Values(StPos) = Values(LastPos)
  Values(LastPos) = Buffer
  
  '再起呼び出し
  Call QuickSortLong(Values, StPos, LastPos - 1)
  Call QuickSortLong(Values, LastPos + 1, EdPos)
End Sub

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです...続きを読む

QPHPで配列をPOSTデータで送った場合の取り出し方を教えてください。

PHPで配列をPOSTデータで送った場合の取り出し方を教えてください。

知恵袋でも質問したのですか、使い方をよくわかっておらず、補足が追加出来なくって、回答者の方に返事が出来なくなってしまいました。申し訳ありません。
プログラム初心者です。始めたばかりで、自分で考えて知っている範囲で組もうとしているのですが、

例えば

<form method="POST" action="○○○">
<input type="checkbox" name="color[]" value="赤" />赤<br />
<input type="checkbox" name="color[]" value="青" />青<br />
<input type="checkbox" name="color[]" value="緑" />緑<br />
<input type="submit" value="送信" />

とこのように書いてすべてにチェックを付けて送った配列のデータはどのように取り出したら良いのでしょうか?
foreachで下記のように、

$x = $_POST['color'];
foreach( $x as $value ){
echo "色 = ". $value."<br />\n";
}
exit;

$_POST['color']の配列を取り出そうすると

Invalid argument supplied for foreach()

と表示されてしまいます。
var_dumpで配列を表示させると、

string(3) "Array"

と表示され確かに配列として届いていると思います。
確かにチェックはいれて送信もしています。
print "{$_POST['color']}"で表示してみると、"A"と"r"と"r"でした。

チェックボックスを10個に増やして、それぞれ$_POST['color'][0]~[9]まで
表示させてみたところ、はじめの5個はArrayも文字がいつつ表示され、残りは空白でした。

知恵袋のほうで、取り出し方が間違っているとの指摘をいただきましたが、どのように取り出したら良いのでしょうか。
どなたかお手数ですが、教えていただけないでしょうか。
よろしくお願いします。

PHPで配列をPOSTデータで送った場合の取り出し方を教えてください。

知恵袋でも質問したのですか、使い方をよくわかっておらず、補足が追加出来なくって、回答者の方に返事が出来なくなってしまいました。申し訳ありません。
プログラム初心者です。始めたばかりで、自分で考えて知っている範囲で組もうとしているのですが、

例えば

<form method="POST" action="○○○">
<input type="checkbox" name="color[]" value="赤" />赤<br />
<input type="checkbox" name="color[]" value="青" />青<br />
<input type...続きを読む

Aベストアンサー

ご質問のコードは、合ってる気がします。

その記述のほかに、何か別のロジックかましてないですか?
例えばですが、magic_quotes_gpcの対策コードですとか、文字コードを一括で変換するコードですとかそういうものです。

$_POST['color']に含まれるべき配列を、変な変換処理を行っているために、文字列「Array」に変換されてしまっているようです。

PHPは、
<?php
$arr = array('a', 'b', 'c');

//上記の配列を

echo $arr;

//とすると、出力結果は、「Array」と文字列が表示されます。


?>

一度、ご質問のコード以外の場所を確認してみてください。

QVB.NET: 型が配列のときの戻り値は?

仮に戻す値が無い場合は、私は Nothing かなと思います。
しかし、プログラマでもない素人。
VB.NET の学習も一カ月未満の超初学者。
もっとも、基本的なこととは思いますが答えが知りたいです。

「そうじゃない!ByRef を使う方が望ましい!」

という考え方もありかな!とも思っています。

Aベストアンサー

Functionの話ですね。
たった一つの答えというものはおそらく無くて、その戻り値を受け取る側でどうしているか、に影響されてくるのではないでしょうか。

例えば、そのメソッドの処理内でOKパターンではないと判別したとき、Nothingを返すことにより、待ち受ける側でNothingかどうかにより以後の処理を振り分けることが出来ます。
ただ、この場合は空の配列を返してもいいかもしれません。

もちろん、値を返さない場合があるという状況を作りたくないのであれば、FunctionではなくSubとして、ByRefの引数を使うという手もなくはないかも知れません。
この場合、事前に引数として用意しておかなければなりませんが。

大事なことかなと思うので2回言いますが、結局は「どうしたいか」が答えを決めると思います。

Qmultiple属性のPOSTを配列で受けとる順番

・「multiple属性のpost送信」を配列で受け取った場合、意図した通りの順番で配列に収められないような気もするのですが、受け取る順番は担保されないのでしょうか?

・何に依存しているのでしょうか? ブラウザとか?

Aベストアンサー

質問者さんはどういう順番を意図されているんでしょうか?

php側はブラウザから送られたままの順番で格納します。で、一般的には「option要素の記述順」で送るブラウザが多いと思います(手元のIEもFirefoxもそうなっていますね)。

QArrayListの初期値に二次元配列を設定したい(VB2005)

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として設定するにはどのようにすればよいか、ということが質問内容です。

試しに(b)の部分を以下のようにしてみましたが、「1次元配列の値を変換できない」とのエラーが出ました。
Dim aryhoge As New ArrayList(New TextBox() {hoge(0), hoge(1), hoge(2)})

どうぞよろしくお願い致します。

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として...続きを読む

Aベストアンサー

Dim aryhoge As New ArrayList(hoge)

QSQL文の実行結果を変数で受けて、それを連想配列に格納したいです。

SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。
(カラム名を連想配列のキーにします。)
また、値をHTMLエスケープ処理したいと考えています。
下記のソースを書いてみましたが、配列$all[]にうまく入りません。

$qresult = mysql_query($qstring);
$all = array();
while (list ($key, $val) = mysql_fetch_assoc($qresult)){
 $all[$key] = htmlentities($val, ENT_QUOTES,EUCJP);
}

また、3行目をeach(mysql_fetch_assoc($qresult))に変更してもみましたが、
「Variable passed to each() is not an array or object」エラーが出ます。
mysql_fetch_assocの戻り値は連想配列では無いのでしょうか。

$qresult = mysql_query($qstring);
$all = array();
while ($rec = mysql_fetch_assoc($result)){
 $all[] = $rec;
}

上記だと問題なく取得出来るのですが。。。
何が悪いのでしょうか。

SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。
(カラム名を連想配列のキーにします。)
また、値をHTMLエスケープ処理したいと考えています。
下記のソースを書いてみましたが、配列$all[]にうまく入りません。

$qresult = mysql_query($qstring);
$all = array();
while (list ($key, $val) = mysql_fetch_assoc($qresult)){
 $all[$key] = htmlentities($val, ENT_QUOTES,EUCJP);
}

また、3行目をeach(mysql_fetch_assoc($qresult))に変更してもみましたが、
「Variable passed to eac...続きを読む

Aベストアンサー

#1です。
>そのため、HTMLエスケープ処理したものを、連想配列の値として代入しておきたいのです。
前回書いたように、エスケープ処理した物を変数に格納するという考え方がおかしいです。HTMLエスケープ処理は、HTMLに出力する直前で行います。

お書きになった
$qresult = mysql_query($qstring);
$all = array();
while ($rec = mysql_fetch_assoc($result)){
 $all[] = $rec;
}
で、SQL結果を「連想配列の配列」として$allに格納した上で、


{section name=tloop loop=$all}
 {$all[tloop].id|escape:'htmlall'}
 {$all[tloop].key|escape:'htmlall'}
 {$all[tloop].name|escape:'htmlall'}
{/section}

と出力時にエスケープするのが、正しいと思います。

QVB6でやると構造体の配列になる変数をVB2008では何で作ればいいか

VB6でプログラムを作っていたときは
値のセットが配列になるとき
構造体を動的配列で宣言してデータを足して作りました。

VB2008で開発をすることになり
同じようなことをしたいのですが
もっと便利なやり方が登場したりするのでしょうか?
クラスで挑戦したのですが動的配列はできないようでした。

Aベストアンサー

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Structure

Public Class Program
  Public Shared Sub Main()
    Dim DataArray As MainGroup() = {}
    Array.Resize(DataArray, 3)

    With DataArray(0)
      .ID = 1
      Array.Resize(.SubGroups, 4)
      .SubGroups(0) = New SubGroup(101, 123, 456)
      .SubGroups(1) = New SubGroup(102, 234, 567)
      ' (略)
    End With

    With DataArray(1)
      ' (略)
    End With
  End Sub
End Class

■クラス+コレクション
Public Class MainGroup
  Public ID As Integer
  Public SubGroup As New System.Collections.Generic.List(Of SubGroup)
End Class

Public Class SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Class

Public Class Program
  Public Shared Sub Main()
    Dim DataList As New System.Collections.Generic.List(Of MainGroup)
    Dim NewMain As MainGroup

    NewMain = New MainGroup
    NewMain.ID = 1
    NewMain.SubGroup.Add(New SubGroup(101, 123, 456))
    NewMain.SubGroup.Add(New SubGroup(102, 234, 567))
    ' (略)
    DataList.Add(NewMain)
  End Sub
End Class

配列+クラスはNULL参照を発生させる可能性がある点で相性がよくありません。コレクション+構造体は、#2で挙げたようにデータ書き換えの手間がかかり、やはり相性はよくありません。
配列は要素数の変動に対してパフォーマンスが悪く、細かく増減させるには不向きです。コレクションは増減することを前提としている点や、削除した箇所を詰めたり途中に挿入したりが容易な点で優れています。
クラス or 構造体、配列 or コレクション をどう組み合わせるかはこれらのほか、ユーザビリティ・保守性・整合性・パフォーマンスなどと共に天秤にかけることになるでしょう。状況にあわせてうまく使い分けてください。


> addでどんどん追加して全体をループさせずに小項目IDを取得する方法

小項目IDがユニークであれば、リストコレクションではなく辞書コレクションを使うことでIDからクラスを取得できるようになります。クラスが保持しているデータをキーに使う場合は、コレクションを継承したクラスを作り、AddをShadowsで置き換えたほうがコーディングミスを防ぐことが出来ます。

■クラス+コレクションクラス
Public Class Group
  Public MainID As Integer
  Public SubID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
End Class

Public Class GroupCollection : Inherits System.Collections.Generic.Dictionary(Of Integer, Group)
  Public Shadows Sub Add(ByVal Item As Group)
    MyBase.Add(Item.SubID, Item)
  End Sub
End Class

Public Class Program
  Public Shared Sub Main()
    Dim DataDict As New GroupCollection
    Dim NewGroup As New Group
    NewGroup.MainID = 1
    NewGroup.SubID = 101
    NewGroup.Value1 = 123
    NewGroup.Value2 = 234

    DataDict.Add(NewGroup)

    Console.WriteLine(DataDict.Item(101).Value2) ' 出力 234
  End Sub
End Class

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, B...続きを読む

Qformで送信したPOSTデータの削除について

いつもお世話になっております。
PHPでカートを作っております。カートに入れるボタンを押した際に、どのボタンを押したかを識別する為に、POSTで識別データを送信しております。
このPOSTデータが含まれている場合にカートに入れる動作が実行される様に設定しておりますが、POSTで送信すると、ブラウザの更新ボタンを押すたびにカートに同じ商品が追加されていってしまいます。
ですので、カートに入れる動作が終了した時点で、このPOSTのデータを無効にしたいのですが、PHPのunset関数を実行しても、ブラウザの更新を押した時点で、再度POSTを送信してしまうので、やはり重複登録されてしまいます。
このPOSTのデータを無効にする方法があれば、是非お教え頂けると助かります。

Aベストアンサー

まずその前に
すでにカートに入っている商品をもう一度カートに入れようとした場合の正しい動きを決めてください
どんなショッピングカートを作っているのかわかりませんが、
この世の中にある通販サイトではそのような動きを正しい仕様として決めています
あなたが頭ごなしに「すでにカートに入っている商品をもう一度カートに入れようとした場合、数が追加される」ということを悪いことのように思っているようですが。仕様としてそのような挙動が正しいもので有れば「仕様を満たしている」と言えます

リロード時の再POSTですが。
リロードした場合はブラウザは再度同じデータを送りつけます、これはブラウザの仕様であり、PHPが悪いわけでもなければunsetで済ませられる問題でもありません。
PHPに限らず、ほかの言語でもPOSTされます。
ですから、更新(リロード)できないような対策が必要です

簡単な方法としては、クッキーやセッションでリロード対策ですね。
例えば
if(商品番号をKeyとするクッキーが無い){
 $obj->商品を追加("商品番号");
}
みたいな感じの処理を入れておけばよいかと思います


または、POSTされたときに、同一商品がすでにカートに入っているときは警告なりエラーを出してカートに追加するかしないかを選択してもらうようにするとか。

if( $obj->商品がカートに入っているか("商品番号") ){
 $カートObj->getメッセージobj()->追加しますかメッセージを表示("商品番号",個数);
}else{
 $カートObj->商品をカートに入れる("商品番号",個数);
}
って感じです


リロード対策に関してはさまざまな方法がありますので調べてみてください
何れにせよ、リロードさせない対策&リロードされた場合の挙動
をしっかりを決めて実装してください

まずその前に
すでにカートに入っている商品をもう一度カートに入れようとした場合の正しい動きを決めてください
どんなショッピングカートを作っているのかわかりませんが、
この世の中にある通販サイトではそのような動きを正しい仕様として決めています
あなたが頭ごなしに「すでにカートに入っている商品をもう一度カートに入れようとした場合、数が追加される」ということを悪いことのように思っているようですが。仕様としてそのような挙動が正しいもので有れば「仕様を満たしている」と言えます

リ...続きを読む

QVBスクリプトの配列数字をJAVAスクリプトで使うには

表題があまり良くないですが
VBSでページを作っています

その中で
ページ閲覧者がテキストボックスに値を記入したときに
JAVAスクリプトのonchangeでJAVAスクリプトへ飛んで

VBスクリプトで定義した配列の値を代入したいのですが
うまくいきません
飛んでいった先のコードが
<script type="text/javascript">
<!--
//値の代入
function hoge(FRM){
FRM.hoge1.value=ここにVBスクリプトの配列
}
// -->
</script>
これだけのことなのですが
配列を直接数字で書くと
FRM.hoge1.value=<%=atai(1)%>
hoge1にはきちんと値が入力されます

しかし この1と言う数字の所に
FRM.hoge2.value の値をいれてやろうとすると
イメージとしては
FRM.hoge1.value=<%=atai(FRM.hoge2.value )%>
なんですが、これではエラーがでます(当然ですよね)
色々"" でくくったり & や + ()などの
組み合わせでやってもうまくいきません

どなたか正しい構文か方法を教えてください
よろしくお願いします


 

表題があまり良くないですが
VBSでページを作っています

その中で
ページ閲覧者がテキストボックスに値を記入したときに
JAVAスクリプトのonchangeでJAVAスクリプトへ飛んで

VBスクリプトで定義した配列の値を代入したいのですが
うまくいきません
飛んでいった先のコードが
<script type="text/javascript">
<!--
//値の代入
function hoge(FRM){
FRM.hoge1.value=ここにVBスクリプトの配列
}
// -->
</script>
これだけのことなのですが
配列を直接数字で書くと
FRM.hoge1.v...続きを読む

Aベストアンサー

何かを勘違いされていると思います。

umadura4747さんが言われている、VBScriptの配列と言うのは、サーバー上での変数を指し、JavaScriptの値と言うのは、クライアント上の変数を指しています。
つまり、次元が違うため実行できないのです。

解決方法としては、

1. VBScriptという配列がサーバー上でしか定義できない場合
 以下のようなJavaScriptのソースを生成するために、ASPコードを追加してあげる。

 var a = new Array("a", "b", "c");

2. クライアント側でも配列が定義できる場合
 先ほどと同じコードをあらかじめJavascriptで定義しておく

ASPとは、サーバー上で動的にHTMLソースを生成することを目的としています。
まずは、やりたいことをHTMLソースで記述し、それを生成するためには、どういったASPコードを書くかを考えてください。

Qsession,タスク作成,formでPOST後戻る、データ復帰、再入力不可

phpでフォームをつくり二重登録防止のためこちら(http://code.nanigac.com/source/view/178)のサイトを参考にセッションを追加しました。
が、フォームで誤入力の後戻ると入力したデータが消えるので
session.cache_limiterをnoneにしたり、METAに入っているキャッシュ関連のものを消してデータが消えないようになりましたが、
今度は再入力後登録しようとすると上記の機能によりエラーが出されてしまいます。

戻るボタンで前のページに戻り、[F5]キーでリフレッシュすれば
データも消えず、登録も出来ましたが、それもどうかと思うので
戻るボタンで戻っただけで再登録できるようにしたいのですが、
どなたかやり方を教えてください。

Aベストアンサー

参考にされたスクリプトは、どちらかといえば、CSRF対策のコードで、二重登録防止の方法ではなさそうです。

そして、誤入力があった場合に戻る、というのがいまいち良くわかりません。
誤入力、というのは、検証用の関数かなんかでPHPスクリプトが入力不備と判断した場合、という意味でしょうか。
フォームと一口に言っても、実装方法はいろいろあるので、どのような画面遷移なのかを教えてください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報