0

適切なタイトルが何であるかわからないため、タイトルは非常に一般的です。状況を説明しましょう:

と という名前の 2 つのテキストボックスLastName0FirstName0というボタンがあるとしますaddMore。をクリックaddMoreすると、JavaScript によって別の 2 つのテキスト ボックスが作成されます。これらのテキストボックスには と という名前が付けられLastName1ますFirstName1addMoreボタンをもう一度クリックすると、別の 2 つのテキスト ボックス ボタンが作成されLastName2FirstName2それぞれ名前が付けられます。addMoreこれは、ボタンがクリックされている限り続きます。また、という名前のボタンdeleteThisがテキストボックスの横に作成されます。クリックすると、作成されたテキストボックスが削除されるだけです。

という変数も初期化しましたcounteraddMoreボタンがクリックされるたびに が 1 ずつ増加し、ボタンがクリックcounterされるたびに が 1ずつ減少します。 の値は非表示の入力型に格納されます。deleteThiscountercounter

ユーザーがフォームを送信すると、の値を取得しcounter、For ループを作成して、フォーム内のテキスト ボックスのすべての値を取得します。サンプルコードは次のとおりです。

//Suppose that the user decides to add 2 more textboxes. Now we have the following:
     // LastName0   FirstName0
     // LastName1   FirstName1
// LastName2    FirstName2

$ctr = $_POST['counter']; //the counter == 3
for ($x = 0; $x < $ctr; $ctr++)
{
    $lastname = $_POST["LastName$x"];
    $firstname = $_POST["FirstName$x"];

    //This will get the values of LastName0,1,2 and FirstName0,1,2

    //code to save to database…
}

上記のコードでは、 の値がcounter3 の場合、テキスト ボックスLastName0,1,2との値FirstName0,1,2が保存されます。問題は次のとおりです。ユーザーが and を削除するLastName1FirstName1、For ループが適切に反復できなくなります。

$ctr = $_POST['counter']; //the counter == 2
for ($x = 0; $x < $ctr; $ctr++)
{
    //Only LastName0 and FirstName0 will be saved.

    $lastname = $_POST["LastName$x"];
    $firstname = $_POST["FirstName$x"];

    //code to save to database…
}

この問題を解決するために「押してはじける」概念を使用するように誰かに言われましたが、ここでそれを適用する方法についてはよくわかりません。誰かがそれを適用する方法を教えてくれれば、それは素晴らしいことです。

4

6 に答える 6

2
  1. 名前を配列として入力テキストボックスを追加します。つまり、<input type="text" name="FirstName[]" />
  2. PHP では、それらを配列として取得できます。つまり、

     foreach($_POST["FirstName"] as $k=>$val){
        echo $val; // give you first name
        echo $_POST["LastName"][$k]; // will give you last ame
     }
    

この場合、HTML で 1 セットのフィールドが削除されても、php コードには影響しません。

于 2013-03-22T11:40:41.883 に答える
1

1 つの解決策は、次のように isset 関数を使用することです。

$ctr = $_POST['counter']; 
for ($x = 0; $x < $ctr; $ctr++)
{

isset($_POST["LastName$x"])?$lastname = $_POST["LastName$x"]:;
isset($_POST["FirstName$x"])?$firstname = $_POST["FirstName$x"]:;

}
于 2013-03-22T11:38:18.017 に答える
1

可能であれば、LastNameN と FirstNameN の名前を使用する代わりに、LastName[N] と FirstName[N] を使用してみてください。この方法では、結果は配列になり、foreach で反復処理できます。つまり、カウンターと値のインデックスは重要ではありません。

foreach ($_POST["LastName"] as $i=>$lastname) {
    if (!isset($_POST["FirstName"][$i])) {
        // This should only happen if someone messes with the client side before posting
        throw new Exception("Last name input does not have a related First name input");
    }   

    $firstname = $_POST["FirstName"][$i];
}

そうでない場合は、別の方法で $counter を使用する必要がある場合があります

$current = 0;
while ($counter) { // Stop only when i found all
    if (isset($_POST["LastName$current"]) {
        $counter--;  // Found one
        $lastname =   $_POST["LastName$current"];
        $firstname = $_POST["FirstName$current"];
    }   
    $current++;
}
于 2013-03-22T11:38:42.333 に答える
1

これを解決するより良い方法は、Firstname と Lastname に配列を使用することです。それらを Lastname0 と Firstname0、次に Lastname1 と Firstname1 と呼ぶ代わりに、それらをすべて Lastname[] と Firstname[] と呼びます。削除機能のために Lastname0 と Firstname0 などの ID を与えますが、名前は配列として保持します。

フォームが送信されたら、次を使用します。

foreach($_POST['Lastname'] as $i => $lastname) {
    $firstname = $_POST['Firstname'][$i]

    //... code to save into the database here
}

ただし、IE では空のフィールドがある場合は送信されないことに注意してください。そのため、Lastname0 に値があり、Firstname0 に値がない場合、実際には $_POST['Firstname'][0] に Firstname1 の値が含まれます (値があると仮定します)。これを回避するには、JavaScript を使用して、フォームを送信するときにフィールドが空かどうかを確認し、空である場合は EMPTY という単語を入力します。

于 2013-03-22T11:42:11.463 に答える
1

不要な場合はカウンターを使用しないでください
。より簡単な方法は、アドモアをクリックしたときに配列名を追加することです。
テキストボックスに first_name[] のような名前を付けます

そのようなフォームを作成すると、foreach を使用して PHP コードを$_POST['first_name']
試しvar_dump($_POST)て、どのように動作するかを確認できます。

于 2013-03-22T11:46:16.723 に答える
0

forループ内で、試してみてください...

if ((isset($_POST["LastName$x"])) && (isset($_POST["FirstName$x"]))){
    $lastname = $_POST["LastName$x"];
    $firstname = $_POST["FirstName$x"];

     //code to save to database…

}

これにより、変数を操作する前に変数が存在するかどうかがチェックされます。

于 2013-03-22T11:39:18.723 に答える