2013-08-01 8 views
0

У меня есть таблица, динамически созданная из моей базы данных с PHP (что само по себе было победой). Пользователь может вносить изменения в столько полей и записей, сколько она хочетНесколько записей, связанных в одной строке запроса

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

категория = Телефон & error_level = 1 & service_name = API & состояние = Критические замечания & = None & категория = Телефон & error_level = 1 & service_name = Входящее + Вызывает & статуса = Критические & заметок = None & категория = Телефон & error_level = 2 & service_name = Outbound + Вызывает & статуса = Незначительный + Issue & ноты = None & категорий = Потребительские & error_level = 1 & service_name = www.website1.com & статус = Критические замечания & = None & категория = Потребитель & error_level = ...

Однако, я понятия не имею, как поступить; т. е. я не знаю, что делать с этой строкой запроса. Теперь он содержит все значения из всех строк. Как разбить это на записи и как я могу их обновить в базе данных?

Я подумал о том, чтобы разделить их на строки с регулярным выражением, а затем перебирать список ... но это кажется мне взломанным. Есть предположения?

+0

Разделить на '&'. Затем петля над парами. Разделите их каждый на '=' и поместите их в карту. Почему это хаки? – Ian

+0

Просто потому, что я все еще участвую, и я не хочу делать что-то чрезмерное, когда лучшее решение уже существует. – thumbtackthief

+0

(т. Е. Использовать регулярное выражение, когда есть функция разрыва, о которой я не знал) – thumbtackthief

ответ

3

Вы не можете иметь одно и то же имя параметра несколько раз, если хотите получить все значения. В этом случае вы получите только одно значение.

Что вам, скорее всего, нужно сделать, это использовать нотацию доступа к массиву в именах полей ввода.

Я предполагаю, что у вас есть какой-то целочисленный идентификатор для каждой строки, так что вы знаете идентификатор строки в базе данных и можете связать это обратно. Если это так, вы можете иметь вас вход, как это:

(Примечание: для простоты я показываю входы в таблицу, так как вы упомянули, у вас есть таблица)

<tr> 
    <td><input name="some_column_name[1]" ... /></td> 
    <td><input name="another_column_name[1]" ... /></td> 
    <td><input name="third_column_name[1]" ... /></td> 
</tr> 
<tr> 
    <td><input name="some_column_name[2]" ... /></td> 
    <td><input name="another_column_name[2]" ... /></td> 
    <td><input name="third_column_name[2]" ... /></td> 
</tr> 

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

Теперь, когда вы POST этих данных, PHP будет собирать массивы в $_POST так: выход

var_dump($_POST['some_column_name']); 
var_dump($_POST['another_column_name']); 
var_dump($_POST['third_column_name']); 

бы:

Array([1] => 'some value', [2] => 'some other value'); 
Array([1] => 'some value 2', [2] => 'some other value 2'); 
Array([1] => 'some value 3', [2] => 'some other value 3'); 

Если вы хотите, чтобы все посланное значения в один многомерном массив, вы можете даже подумать о том, чтобы сделать что-то вроде этого:

<tr> 
    <td><input name="table_data[1][some_column_name]" ... /></td> 
    <td><input name="table_data[1][another_column_name]" ... /></td> 
    <td><input name="table_data[1][third_column_name]" ... /></td> 
</tr> 
<tr> 
    <td><input name="table_data[2][some_column_name]" ... /></td> 
    <td><input name="table_data[2][another_column_name]" ... /></td> 
    <td><input name="table_data[2][third_column_name]" ... /></td> 
</tr> 

который, когда POSTed, даст вам массив, такой как

Array 
([1] => Array(
    ['some_column_name'] => 'value', 
    ['another_column_name'] => 'value', 
    ['third_column_name'] => 'value' 
    ), 
[2] => Array(
    ['some_column_name'] => 'value', 
    ['another_column_name'] => 'value', 
    ['third_column_name'] => 'value' 
    ) 
) 

Возможно, вам будет легче работать.

+0

+1, это отличный ответ. – Matt

0

ознакомьтесь с массивами и JSON.

JSON поможет вам сериализовать массив с javascript на PHP. В PHP вы можете выполнять итерацию через массив (PHP), а затем обрабатывать записи массива и вставлять/обновлять свою базу данных по своему усмотрению.

Вы не должны делать это вручную до конца, как вы уже начали, но оставьте это до сборки функций JavaScript и PHP.

1

Разверните строку данных, используя «&» в качестве разделителя. Прокрутите результирующий массив и взорвите каждый элемент, используя «=» в качестве разделителя.

Но вы не можете отправить такую ​​строку, не кодируя ее, иначе PHP разделит ее на символы «&», прежде чем вы сможете создать беспорядок, возможно. Или вы можете получить исходные данные и попробовать его с помощью этой строки.

Возможно, было бы проще просто отправить всю форму.

+0

Взорвать звуки многообещающие (я только что узнал, что он существует). Я собираюсь расследовать, но сначала: Я думал, что это _was_ данные исходных данных. Я получил его из $ (form) .serialize(). Я по ошибке? – thumbtackthief

+0

Есть несколько способов получить данные post в PHP. Обычно вы будете использовать массив $ _POST. Это работает с формами и данными AJAX post, которые отформатированы как ваша строка. Если вы отправляете его как значение формы, тогда это будет что-то вроде 'val = blah .....', где blah - это строка, которую вы указали выше. И тогда вы найдете его в $ _POST ['val']. Или вы можете получить его как один большой кусок в 'php: // input' и проанализировать его, как я предложил. –

+0

Вы отправляете это по AJAX? Это упрощает ситуацию. Но сначала позаботьтесь о других проблемах, упомянутых другими. –

0

Прямо сейчас это выглядит примерно так

category=Phone 
error_level=1 
service_name=API 
status=Critical 
notes=None 

category=Phone 
error_level=1 
service_name=Inbound+Calls 
status=Critical 
notes=None 

category=Phone 
error_level=2 
service_name=Outbound+Calls 
status=Minor+issue 
notes=None 

category=Consumer 
error_level=1 
service_name=www.website1.com 
status=Critical 
notes=None 

В настоящее время не существует никакого способа отличить одну запись от другой, так что вы не в состоянии выполнить, если заявление, чтобы проверить, если эта запись была обновлено. Если бы вы могли добавить другое поле ввода (даже если оно было скрыто), которое включало уникальный идентификатор строки, вы могли бы запустить оператор If, чтобы проверить, изменились ли записи, а затем запустите в нем команду обновления MySQL.

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

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