【问题标题】:Array within Form collecting multiple values with the same name possible?表单中的数组可以收集多个具有相同名称的值吗?
【发布时间】:2010-05-17 23:12:57
【问题描述】:

下午好,

我将首先从我想要完成的目标开始,然后给出我需要做的一个非常基本的示例。

目标

我决定放弃并使用数组结构来处理相同类型和规则的所有输入,而不是收集多个变量并分别用键命名它们。一旦我有了变量,我将针对它们进行验证,如果“ok”将它们存储在 MySQL 表中。该表将保存消费者信息,并且需要存储多行相同类型的信息。

第一关

我将省略这个问题的验证部分,因为我觉得我需要先了解基础知识。

<form action="?" method="POST" name="Form">
Member 1 First Name:<input type="text" name="MemberFirstName[]" /><br />
Member 1 Last Name: <input type="text" name="MemberLastName[]" /><br />
Member 1 Email: <input type="text" name="MemberEmail[]" /><br />

Member 2 First Name:<input type="text" name="MemberFirstName[]" /><br />
Member 2 Last Name: <input type="text" name="MemberLastName[]" /><br />
Member 2 Email: <input type="text" name="MemberEmail[]" /><br />

Member 3 First Name:<input type="text" name="MemberFirstName[]" /><br />
Member 3 Last Name: <input type="text" name="MemberLastName[]" /><br />
Member 3 Email: <input type="text" name="MemberEmail[]" /><br />

<input type="submit" name="submit" value="Continue" />          
</form>

我希望为名字(必填字段)提供的每个输入都会为该特定条目生成一个唯一键,并且不会覆盖输入的任何数据。因为我在页面之间携带信息(结帐表单),所以我将 POST 变量转换为 SESSION 变量,然后最终存储在 mysql 数据库中。我的希望是:

<?php

$conn = mysql_connect("localhost", "username", "password");
mysql_select_db("DBname",$conn);

$sql = "INSERT INTO tablename VALUES ('$_SESSION[Member1FirstName]', '$_SESSION[Member1LastName]', '$_SESSION[Member1Email]', '$_SESSION[Member2FirstName]', '$_SESSION[Member2LastName]', '$_SESSION[Member2Email]', '$_SESSION[Member1FirstName]', '$_SESSION[Member3LastName]', '$_SESSION[Member3Email]')";


$result = mysql_query($sql, $conn) or die(mysql_error());
Header ("Location: completed.php");
?>

Member1、Member2 和 Member3 值将出现在表中各自的行中。我知道我的代码是错误的,但我正在尝试实现我试图实现的整体业务目标,并尝试学习如何以正确的方式编写代码。

我对编程非常非常陌生,因此非常感谢任何“婴儿建议”。

【问题讨论】:

  • 你的问题到底是什么?
  • 我只是不明白为什么需要数组 - 这是完全可能的,但您应该在不同的情况下使用,例如产品的颜色范围或类似的东西。在您的情况下,一个简单的 memberfirstname1, memberfirstname2 可以完成这项工作,并保持代码简单,就像您所说的那样开始。
  • @Felix King - 如何创建这样的值数组。收集这些数据时我不懂数组
  • @Ronaldo Junior - 原因是因为我实际上有 20 个不同成员的 12 个字段,传递 200 多个会话变量是矫枉过正的,而且还会导致我创建大量代码和验证。我希望能够创建 1 个单一表单布局,并根据第 1 页所需的登记人数,让表单自动创建可用于人口的其他字段
  • @JM4:这已经是将表单元素指定为数组的一部分的方法。 $_POST['MemberFirstName'] 应该给你一个数组。你还没试过吗?

标签: php mysql session arrays


【解决方案1】:

根据您的列名,如下

INSERT INTO tablename 
VALUES ('$_SESSION[Member1FirstName]', '$_SESSION[Member1LastName]', '$_SESSION[Member1Email]'),
       ('$_SESSION[Member2FirstName]', '$_SESSION[Member2LastName]', '$_SESSION[Member2Email]'), 
       ('$_SESSION[Member1FirstName]', '$_SESSION[Member3LastName]', '$_SESSION[Member3Email]')"

适用于 mysql,请参阅 INSERT

但是,如果您不清理输入,这将导致很多麻烦。

编辑: 清理是指sql injection 攻击,其中直接传递给数据库的字符串可能包含允许攻击者更改数据库密码或更新或销毁数据的结构。

编辑2: 至于php语法,我觉得this question有合理的答案可以借鉴。

【讨论】:

  • 我的总体目标是使用数组找出如何循环“插入”语句。如果我使用上面的方法(我已经这样做了,我有超过 20 个成员的 12 个输入),这需要很多代码。你能解释一下“清理输入”吗?
  • @JM4 - 我扩展了关于消毒/注射问题的答案。至于在 PHP 中循环数组,这似乎是什么问题? foreach 和其他方法供您使用。
  • 我认为我在上面给出的示例中循环时陷入的区域是我不知道正在输入多少成员,所以我不确定在哪里运行循环。注册者可以选择一次注册 1 到最多 20 个成员,因此“INSERT INTO tablename”中的唯一保证是“$_SESSION['Member1FirstName'] 值。我估计我需要将其完全更改为:INSERT INTO tablename VALUES ('MemberFirstName[0]', 'MemberLastName[0]... 等等,键的变化由输入的登记人数决定跨度>
  • @JMR - 添加了一个关于通过 php 将多行插入 mysql 的问题的链接
【解决方案2】:

如果您需要关联特定数量的集合中的字段并且仍然希望它们在一个数组中,那么您应该在名称中放置一个索引。空索引仅在您不知道最终数组将包含多少元素时才有用。

Member 1 First Name:<input type="text" name="MemberFirstName[1]" /><br />
Member 1 Last Name: <input type="text" name="MemberLastName[1]" /><br />
Member 1 Email: <input type="text" name="MemberEmail[1]" /><br />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多