0

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

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

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 " 等等并将这些存储在一个数组中,然后循环遍历数组,使用当前选定的文本字段/选择中输入的数据查询表?

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

我目前有这个查询:

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

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


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

http://i45.tinypic.com/adkfti.png

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

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

乔恩。

4

2 回答 2

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 循环中的数组索引来确定您正在更新哪个证明。

于 2012-05-14T09:31:12.017 回答
0

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

要添加条目,您可以使用

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

于 2012-05-13T21:59:35.063 回答