【问题标题】:Inserting data from multiple form fields which are the same从多个相同的表单域插入数据
【发布时间】:2012-05-14 17:31:12
【问题描述】:

对不起,如果标题有误导性,但我真的想不出更好的了。

首先,我有两张表,banlist 和 proof。对于我的问题,banlist 或多或少无关紧要,但证据是。

Table: proof

proofid - primary key
banid - foreign key (links to banlist)
proof - stores the link which acts as the proof
type - stores the type of the proof (image, demo, ...)

我还有一个表格,允许管理员提供有关禁令的详细信息,然后链接任何证明。由于禁令可能有多个证据,我将实现一个链接,该链接创建两个表单字段的新实例(可能通过 jQuery)。表格如下:

<p>Proof (if no proof is available, enter N/A):</p><input type="textfield" name="proof" style="border: solid 1px #<?php echo $pbg?>"/>

<select name="prooftype" style="border: 1px solid #<?php echo $ptbg ?>" />
    <option value="TZAC">TZAC</option>
    <option value="UAC">UAC</option>
    <option value="ESL Wire">ESL Wire</option>
    <option value="GV">GV</option>
    <option value="PB Bans">PB Bans</option>
    <option value="Demo">Demo</option>
    <option value="League">League</option>
    <option value="Image">Image</option>
    <option value="Stream">Stream</option>
    <option value="Other">Other</option>
</select>

问题或可能不是问题是我将如何将数据的多个实例插入证明表(并最终更新)。我只是看不出如果我有上述 4 个,我如何将所有 4 个具有不同值的插入到表中。

设置文本字段的 id 并选择为 id="proof1"/id="type1", id="proof2"/id="type2", id="proof3"/id 是否有意义="type3" 等等并将它们存储在一个数组中,然后循环遍历数组,使用当前选定的 textfield/select 中输入的数据查询表?

最后,由于管理员能够编辑禁令,我面临一个类似的问题,即禁令有 4 种类型的证明,我需要更新表格中所选禁令的证明。

我目前有这个查询:

$query2 = "UPDATE proof SET proof = '$proof', type = '$type' WHERE banid = $id";

但是,这将覆盖具有相同 banid 的所有行,而我只希望它更新特定于证明的行。通过存储proofid然后将UPDATE SQL命令修改为... WHERE proofid = $_POST['...'],可以在每个文本字段/选择框旁边创建一个隐藏字段吗?同样,我假设我需要某种类型的数组才能遍历每个实例。


此图像显示了表单的一部分,颜色表示表单域之间的链接。从中您可以看到,我需要获取 4 个证明示例中的每一个,然后插入它们或相应地更新它们。

如果部分内容不清楚,请致歉。您可能会说我个人正面临一堵砖墙,而且很可能只是我需要绕开它。补充一下,我可能已经回答了帖子中的问题,但我想对使用数组的任何改进提出想法和想法。

感谢您提供的任何帮助或指导,

乔恩。

【问题讨论】:

    标签: php jquery mysql html


    【解决方案1】:

    我认为您不需要多对多关系,除非您真的希望使用校样对数据进行完全规范化。您当前的结构应该足够了。

    由于您在后端使用 PHP,只需通过将 [] 附加到每个输入来将输入转换为数组,如下所示:

    <p>Proof (if no proof is available, enter N/A):</p><input type="textfield" name="proof[]" style="border: solid 1px #<?php echo $pbg?>"/>
    
    <select name="prooftype[]" style="border: 1px solid #<?php echo $ptbg ?>" />
    etc...
    

    名称后面的括号允许 PHP 以数组的形式接收输入,然后您可以在 PHP 端循环它:

    <?php
    // Assuming banid is a hidden field in the form
    $banid = mysql_real_escape_string($_POST['banid']);
    $proof = $_POST['proof'];
    $prooftype = $_POST['prooftype'];
    
    for ($i = 0; $i < count($proof); $i++) {
        $currentProof = mysql_real_escape_string($proof[$i]);
        $currentProofType = mysql_real_escape_string($prooftype[$i]);
        $sql = "INSERT INTO proof (banid, proof, prooftype) VALUES ($banid, '$currentProof', '$currentProofType');";
        etc...
    }
    

    为了解决您的 UPDATE 问题,我会保持简单,并在您的证明表中再添加一列,称为 proof_number。这将是 0 到 3 或 1 到 4 来标记记录的证明。这避免了您需要在 html 表单中添加证明 ID。然后在您的 UPDATE 中,您可以使用 for 循环中的数组索引来确定您要更新的证明。

    【讨论】:

    • 谢谢!我会看看这个,看看我在哪里。
    【解决方案2】:

    您需要插入第三张表以将禁止名单与证明相关联。在此 BanProofRelationship 表中插入关系条目,其中包含 banId 和 ProofId。这样,您可以根据需要将任意数量的外键存储到这些表中。您最终将获得多对多关系,当您需要添加条目时,您将插入它们。当您想删除条目时,您将删除它们。

    要添加条目,您可以使用

    INSERT BanProofRelationship ( banId, proofId ) values (1, 4);

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2023-03-13
      • 2021-08-24
      • 2015-05-15
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多