2012-05-13 3 views
0

Извините, если заголовок вводит в заблуждение, но я действительно ничего не мог придумать.Вставка данных из нескольких полей формы, которые являются одинаковыми

Во-первых, у меня есть две таблицы, запрет и доказательство. Для моей проблемы 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 = "proof1"/id = "type1", id = "proof2"/id = "type2", id = "proof3"/id = "type3" и т. д. и сохранить их в массиве, а затем пропустить массив, запрашивающий таблицу, с данными, введенными в текущее выбранное текстовое поле/select?

Наконец, когда администратор может редактировать запреты, я сталкиваюсь с аналогичной проблемой, в которой говорят, что у запрета было четыре типа доказательств, мне нужно будет обновить доказательство в таблице для выбранного запрета.

я в настоящее время этот вопрос:

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

Однако, что перепишет все строки с тем же забаненного, в то время как я только хочу, чтобы обновить ряд специфических для данного доказательства. Создает ли скрытое поле рядом с каждым полем текстового поля/выбора, сохраняя пробную версию и затем модифицируя команду UPDATE SQL, чтобы она была ... WHERE proofid = $_POST['...']? Опять же, я бы предположил, что мне понадобится некоторый тип массива, чтобы перебирать каждый экземпляр.


Это изображение показывает часть формы, а цвета представляют собой связь между полями формы. Из него вы можете видеть, что мне нужно взять каждый из 4 примеров доказательства и либо вставить их, либо обновить их соответствующим образом.

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

Извинения, если детали misclear. Вы, вероятно, можете сказать, что я лично столкнулся с кирпичной стеной, и, скорее всего, мне просто нужно обнять голову. Просто чтобы добавить, я, возможно, ответил на вопросы в сообщении, но мне хотелось бы мысли и идеи о любых улучшениях использования массива.

Я признателен за любую помощь или направление вы можете дать,

Джон.

ответ

1

Я не думаю, что вы будете нуждаться в отношения многие ко многим, если вы действительно не хотите полной нормализации данных с prooftype. Ваша нынешняя структура должна быть достаточной.

Поскольку вы используете 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. Затем в вашем UPDATE вы можете просто использовать индекс массива в цикле for, чтобы определить, какое доказательство вы обновляете.

+0

Спасибо! Я расскажу об этом и посмотрю, где я получу. –

0

Вам необходимо вставить третий стол, чтобы связать запрет на запрет. Вставьте записи отношений в эту таблицу BanProofRelationship, которая содержит banId и ProofId. Таким образом, вы можете хранить как можно больше внешних ключей для этих таблиц. вы столкнетесь со многими и многими отношениями, и когда вам нужно будет добавить записи, вы ВСТАВЛЯте их. Если вы хотите удалить записи, вы УДАЛИТЬ их.

Чтобы добавить запись, вы будете использовать

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

Смежные вопросы