| « Поставить закладку » « Сделать стартовой » | |||
|
|||
| Статьи:: Интернет технологии :: PHP :: Нашествие данных (приемы по обработке данных сразу оптом)
Нашествие данных (приемы по обработке данных сразу оптом)Вот решил выложить на пробу небольшой туториал с приемами по обработке данных сразу оптом. Очень интересно насколько актуален материал в условиях повсеместного распространения CMS и при огромном множестве других туториалов. И насколько программисты в теме насчет таких способов и как часто используют. Очень хотелось бы послушать ваши комментарии!! P.S. Заранее прошу прощения, если где-то форматирование будет сбиваться и станет некорректным! На всякий случай приложил еще файл со статьей Итак, вы переживаете настоящее нашествие данных! Их просто слишком много??!! Окидывая взглядом такое полчище невольно опускаются руки и возникают мысли , как же все это обрабатывать? Но, уже на второй взгляд, вы деловито выбираете то, что уж точно должно быть, то, что желательно, и то, что уж совсем опционально. Также вариант избавиться от чего-то лишнего, словом частично переосмыслить модель. Первый способ именно для "желательных" данных. Что же такое, на мой взгляд "желательные" данные? Это данные, с которыми я не планирую никакой логики, ну разве что, кроме проверки вхождений (есть в них какая-нибудь нужная мне информация) и никаких действий, только вывести и редактировать. Ни сравнений, ни ключей, ни главных “ролей” в моем коде. Представим самый неабстрактный и обыденный пример. Какой-нибудь сайт знакомств с множеством всякой всячины, типа автопортрета (любимые книги, фильмы, места, девизы...) Эти данные не являются обязательными, они также не участвуют в поиске анкет пользователей, и мне кажется, не несут какой-либо программной логики. Но они красят человека-пользователя, дают ему шанс выделиться, дополнить рассказ о себе мельчайшими деталями. А другим пользователям найти того единственного человека, отличающегося не только по нику, имени и фотографиям. Если эти данные нам не нужны, просто-напросто свалим их в кучу. Схема такова, данные предстают перед пользователями либо для редактирования, либо для просмотра, а нам они вовсе как бы не требуется, поэтому свалим их во что-нибудь более простое: строчку, массив, или сериализацию, приведем к такой форме, которую несложно хранить и извлекать. В моем примере я выбрал именно сериализацию, просто потому что, это стандартная функция PHP, она позволила свернуть мне мой массив данных в "a byte-stream representation of value that can be stored anywhere". Эмм, то, что легко и везде храниться. В моем примере сериализация сохраняется в поле в БД MySQL, хотя нет никаких препятствий для использования файлов. Еще один момент, на который хотелось бы особо обратить внимание, что все данные формы, доступны через массив $_POST, можно особо не заморачиваться - сразу сериализовать весь массив, сохранить его в БД, при необходимости совершить обратную процедуру, и последовательно, поэлементно выводить значения массива для редактирования или просмотра. Если вас чем-то не устраивает эта схема, учтите, что если вы назовете парочку ваших полей в HTML-форме name="dannie[]", то в PHP они будут объединены как массив (это позволит локализовать ваши "желательные" данные, особо не заморачиваясь). Что-то я многовато наговорил, но так уж получилось! Могу утешить, что код будет совсем простым))) Пример состоит из двух файлов : вывод для пользователя (a_form.php) и обработка изменений (a_edit.php) a_form.php
CODE
<? // Настройки БД require_once ("conf/connect.php"); // sql запрос для извлечения «желательных» данных пользователя под номером $_SESSION['id'] $query = "SELECT * FROM add_info where info_id ={$_SESSION['id']}"; $result = mysql_query($query); $row = mysql_fetch_array($result); // мы достали из БД сериализация данных, для того, чтобы превратить их в объект, требуется обратная операция $a=unserialize($row['info1']); // Вопросы для удобства я включил в скрипт как массив, хотя они могут находиться где вам угодно... Кстати знакомые вопросы, неправда ли)) и очень полезные)) $query_a[0]="Ваше образование, институт:" ; $query_a[1]="Что для вас наивысшее счастье?" ; $query_a[2]="Ваш любимый музыкальный исполнитель:" ; $query_a[3]="Какое качество вы особенно цените в человеке?" ; $query_a[4]="Какую цель ставите перед собой сейчас?" ; $query_a[5]="Работа, о которой вы мечтаете:" ; $query_a[6]="Где бы вы хотели жить?" ; $query_a[7]="Если бы у вас была масса свободного времени, чем бы вы занялись?" ; $query_a[8]="Любимое блюдо?" ; $query_a[9]="Ваш любимый исторический персонаж:" ; $query_a[10]="Место в городе, где вы любите бывать:" ; $query_a[11]="Есть ли у вас домашние животные?" ; $query_a[12]="Ваш любимый город:" ; $query_a[13]="Ваш любимый фильм:" ; $query_a[14]="Любимое блюдо?" ; $query_a[15]="Самое большое впечатление во время зарубежной поездки:" ; $query_a[16]="Книга, которую вы сейчас читаете:" ; $query_a[17]="Ваше любимое занятие?" ; $query_a[18]="Кем из известных вам людей вы бы хотели быть?" ; $query_a[19]="Ваш девиз:" ; ?> <form action="a_edit.php" method=POST> <? // мы автоматически генерируем форму для редактирования, используя массив вопросов, и массив $a после десериализации, который содержит пользовательские ответы for ($i=0;$i<count($query_a);$i++) // Хотелось бы воспользоваться foreach, но вывести два массива через один foreach без дополнительных преобразований у меня не получилось(( { echo "<b>{$query_a[$i]}</b><br>"; echo "<textarea name="s1[]" cols=40 rows=10>{$a[$i]}</textarea><br>"; } ?> // собственно и все мы отправляем данные второму скрипту, который их обрабатывает... здесь как раз используется фишка, что все данные будут в единственном массиве $s1, хотя в этом случае, наверное, проще было свернуть сразу массив $_POST <input type="submit"> </form> a_edit.php
CODE
<? require_once ("conf/connect.php"); // заменим пользовательские кавычки на " и постараемся сократить количество возможных сюрпризов к минимуму for ($i=0;$i<count($s1);$i++) $s1[$i] = htmlentities ($s1[$i], ENT_NOQUOTES); // здесь рекоммендую обратить внимание что можно воспользоваться foreach ($arr as &$value) Значок амперсанда означает, что &$value является ссылкой на элемент массива, то есть изменив его значение $value мы поменяем и сам элемент. В другом случае foreach здесь бесполезен // сворачиваем данные $s=Serialize($s1); // создаем запрос для изменения. Здесь следует учесть что поле должно уже существовать, иначе запрос ничего не выполнит. Стоит позаботиться об этом заранее, например при регистрации, или самом первом редактировании, когда массив после десериализации пуст $query ="UPDATE `add_info` SET `info1` = '{$s}' WHERE `info_id` ={$_SESSION['id']} LIMIT 1;"; mysql_query($s); ?> Вот и все, пожалуй, с первым способом! Рекомендую все же прочитать о функциях Serialize , все ж новое - это хорошо забытое старое! Второй способ. А второй способ удобен, когда данные нежелательно сваливать в кучу, на них основана логика, какие-то действия. Но их все же многовато, и хочется как-то автоматизировать процесс редактирования. Снова пример. Требуется простейший project manager для предприятия, изготовляющего стеклопакеты. Каждый заказ проходит через множество стадий сборки: раскрой, сборка, штапики, установка, доставка. Каждая стадия содержит по 3-4 даты и редактируется определенной группой пользователей, причем есть супервайзеры, которые могут редактировать все поля. Все заказы выводятся в календаре на месяц, по мере продвижения заказа меняется цвет, и устанавливаются галочки "выполнено". Опять исходим из того, что при редактировании не нужно никакой особой логики, разве только чтобы проследить, что каждая группа редактировала только назначенную ей стадию. Значит, нам опять требуются форма для редактирования с уже хранимыми данными и скрипт, который эти данные обрабатывает. Вывод формы для редактирования можно автоматизировать по-разному. Например, функция mysql_list_fields позволит нам без особых сложностей получить список полей в таблице, и присвоить их именам уже полям в HMTL-форме, добавить к этому массив значений этих полей для заказа - и получается почти автоматически сгенерированная форма. К этому следует добавить логику ролей, то есть, чтобы для редактирования доступны были только данные, присущие группе. Зачем мы извлекали список полей таблицы? Просто для того, чтобы, генерируя запрос с UPDATE, мы могли автоматически подставлять ключи массива $_POST, которые одновременно являются и названиями полей в БД. Наверное, все же с примером будет понятней. Допустим, у нас есть "UPDATE orders SET pole1 = '1' , pole2 = '2'" и так далее. Представьте, что таких полей множество и называться они могут совсем по-разному, а не так упорядоченно. Если же мы используем функцию mysql_list_fields, то UPDATE можно сконструировать совсем просто, проходя foreach по массиву $_POST и добавляя в строчку для запроса следующее: $what_to_update.="{$fname} = '{$update}' , "; ,где $fname - это ключи массива $_POST, а $update - его значения. Ну, единственное, если вас беспокоит, что поля в HTML-форме носят названия полей БД (видна структура таблицы), можете воспользоваться приемом описанном в предыдущем способе, назвать все поля как "update[]", и пользоваться им как массивом значений. Правда, вам все же придется воспользоваться функцией mysql_list_fields, чтобы получить названия полей и сгенерировать UPDATE, но уже в скрипте для обработки, который недостижим для пользователя. Также советую расположить данные одной стадии рядышком, тогда группе можно задавать диапазон полей для редактирования, что еще более упростит задачу. Теперь приведу краткие выдержки из кода для наибольшей ясности и особо ленивых. выдержка из order_form.php
CODE
<? // автоматическая генерация HTML-формы… В переменной $access содержатся номера полей для редактирования группой, если пользователь может редактировать поле то значение переменной появится в элементе type=”text”. Все поля собираются в массив update, который используется в дальнейшем для создания запроса с UPDATE for ($i=3;$i<=20;$i++) if (strpos($access,";".$i.";")) echo "<td><input type="text" size="9" value="{$row[$i]}" name="update[]"></td>"; else echo "<td>{$row[$i]}</td>"; ?> выдержка из order_edit.php
CODE
<? // для ясности я разбил формирования запроса с UPDATE по разным переменным query=""; //начало запроса (стандартно) $query_1="UPDATE orders SET "; // окончание запроса (стандартно) $query_2=" WHERE `orders`.`id` ={$id} LIMIT 1 ;"; $what_to_update=""; $fields = mysql_list_fields("baza1","orders",$link); // основной текст запроса ...в переменную $what_to_update добавляется названия поля, а затем измененное значение из массива $update, переданное пользователем for ($i = 0; $i <= 20; $i++) if (isset($update[$i])) // еще раз проверка чтобы пользователь не мог редактировать чужие поля if (strpos($access,";".$i.";")) { $fname=mysql_field_name($fields, $i); $what_to_update.="{$fname} = '{$update[$i]}' , "; } // отнимаем лишнюю запятую $what_to_update=substr($what_to_update,0,-2); // склеиваем запрос в одно целое и выполняем $query=$query_1.$what_to_update.$query_2; mysql_query($query); //echo $query; ?> Ну и напоследок краткий footer.php! Вполне вероятно вам придется столкнуться с ситуацией, когда вам нужно обработать данные с незнакомой формы, содержащей очень прилично JavaScript. Прежде чем с головой нырять в эти дебри, можете попробовать сначала action формы поменять на свой тестовый скрипт, а там вывести эти данные print_r($_POST). Функция print_r чрезвычайно удобна, она покажет вам весь в массив вместе с ключами и в вполне удобном виде. Тогда возможно и окажется, что этот незнакомый JavaScript все собирает в одну переменную res в каком-нибудь формате "ключ : значение". Извлечь данные в массив тогда можно функцией explode. Но, даже если создатели формы об этом не позаботились, не забывайте о чудесном foreach и $_POST, позволяющим вам извлекать ключи и значения, переданные пользователем. В любом случае желательно познакомиться через print_r($_POST) со всеми данными, чем выдирать их из кода формы по кусочкам. Также возможно, что $_POST будет содержать несколько вложенных массивов. Тогда вам может пригодиться такой код:
CODE
<?
Вот, пожалуй и все! Хочется вам пожелать, чтобы вы любили ваши данные и
программировали с удовольствием!$message=""; // $_POST содержит список массивов foreach ($_POST as $value) // $value является также массивом foreach ($value as $key => $value2) // получаем ключ и значение $message.="<b>{$key}</b> : {$value2} <br>"; ?> Автор: Кроваткин Рубрика: PHP
8 веских причин сделать сайт на PHP.
В наше время многие пользователи Интернета превращаются в его строителей. Насмотревшись на чужие сайты, простой интернетчик начинает задумываться и о собственном "офисе" в этом мегаполисе. Но как? В какой программе? На каком языке? Именно на последний вопрос даёт развёрнутый ответ эта статья. А поскольку Вы её читаете, то видимо тоже заинтересованы в создании своего сайта.
Подробнее... |
Рубрика: PHP
| Добавлено: 08.09.2008
Обзор Google Chrome : Впечатления очевидца.
Обзор Google Chrome : Впечатления очевидца. Полный обзор Google Chrome Beta с точки зрения придирчивого программиста. Google Chrome, Браузер, Beta Огнеслав
Подробнее... |
Рубрика: Вебмастеру
| Добавлено: 08.09.2008
Инструменты Internet Explorer 8 Beta 2 для разработчиков.
Подробнее... |
Рубрика: Вебмастеру
| Добавлено: 05.09.2008
Остальные статьи:
Google Developer Day 2008 в Москве
ТОП 10 самых раздражающих факторов для программиста
Windows Server 7, 8 и 9
jQuery для JavaScript-программистов
Инновационный веб-броузер Google Chrome стартует уже сегодня
Windows 7: подход к производительности системы
Trac + Subversion @ Ubuntu: Revisited
[g]Vim в режиме Python: Рекомпиляция в Windows
Java + JSON. Пути к дружбе
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2 |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|