0

标题如此笼统,主要是因为我不知道什么应该是合适的标题。让我简单解释一下情况:

假设我有两个名为LastName0FirstName0的文本框和一个名为addMore. 当我单击 时addMore,将通过 JavaScript 创建另外两个文本框。这些文本框将被命名为LastName1FirstName1。当我再次单击该addMore按钮时,将分别创建并命名另外两个文本框LastName2按钮FirstName2。只要单击该addMore按钮,此操作就会继续。deleteThis此外,将在文本框旁边创建一个名为的按钮。这只是在单击时删除创建的文本框。

我还初始化了一个名为counter. 每次addMore单击按钮时,counter增加 1,每次deleteThis单击按钮时,counter减少 1。 的值counter存储在隐藏输入类型中。

当用户提交表单时,我获取 的值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…
}

在上面的代码中,如果 的值counter等于 3,则文本框的值LastName0,1,2FirstName0,1,2将被保存。现在问题来了:如果用户决定删除LastName1and FirstName1,则 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…
}

有人告诉我使用“push and pop”的概念来解决这个问题,但我不确定如何在这里应用它。因此,如果有人能告诉我如何应用它,那就太好了。

4

6 回答 6

2
  1. 添加名称为数组的输入文本框,即<input type="text" name="FirstName[]" />
  2. 在 php 中,您可以将它们作为数组获取。IE,

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

在这种情况下,即使在 HTML 中删除了一组字段,也不会影响 php 代码。

于 2013-03-22T11:40:41.883 回答
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

如果可能,请尝试使用 LastName[N] 和 FirstName[N],而不是使用 LastNameN 和 FirstNameN 名称,这样结果是一个数组,您可以使用 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

如果不需要,不要使用计数器
一个更简单的方法是在单击 admore 时添加数组名称。
在文本框中给一个名字,比如 first_name[]

$_POST['first_name']
如果你创建这样的表单,你可以通过在你的 php 代码中尝试使用 foreachvar_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 回答