|
|
|
|
|
для: Valick
(12.06.2009 в 16:13)
| | Хеопс пришлет, если, попробую :) | |
|
|
|
|
|
|
|
для: Trianon
(12.06.2009 в 16:04)
| | Если говорить о практическом применении, а не как пример, то для статистики самый правильный выбор это база данных. Проблема у автора темы в том, что он не может представить свой набор данных в виде массива, таблицы, хотя они явно табличную структуру имеют.
А ведь он решил использвовать в конечном итоге базу! Могу себе представить, какую струкутуру она будет иметь, если не представлять себе, казалось бы, естественное. Ну не вам рассказывать, что в этом случае получится, да и получится ли вообще.
Работа с базой так или иначе тесно связана с массивом. Вот пусть и учится товарищ, а вопросы совместного доступа и многое другое, что ему еще придется изучить, это уже другая тема, о которой придется еще не одну страницу в разделе написать. | |
|
|
|
|
|
|
|
для: sim5
(12.06.2009 в 15:22)
| | Попробуйте "Нижегородское бочковое" мне понравилось) | |
|
|
|
|
|
|
|
для: sim5
(12.06.2009 в 15:55)
| | Ничего хорошего с ними не будет происходить.
Каждый в свой сессионный файл получит по копии этого массива и начнет с этой копией работать.
У каждого будет свой собственный набор счетчиков.
В конце прочесса опроса копии начнут скидываться в общий файл, каждый раз перекрывая предыдущее содержимое заново.
В итоге учтены окажутся предпочтения последнего заканчивающего опрос. Но никак не всех остальных, кто проходил его в это же время.
И дело тут не в шлифовке. А в нарушении базового принципа. В сессии нельзя держать общие данные - т.е. имеющие отношение к кому-либо, кроме клиента этой сессии. | |
|
|
|
|
|
|
|
для: Trianon
(12.06.2009 в 15:48)
| | Ничего не будет происходить, ибо чтобы все было, значит надо все еще "отшлифовать", а все писать просто сил нет ) | |
|
|
|
|
|
|
|
для: sim5
(12.06.2009 в 15:22)
| | Ну нельзя же так...
Что будет происходить со счетчиками при одновременной работе со скриптом нескольких пользователей? Я даже не про файловые блокировки, фиг с ними, пусть даже file_get_contents и file_put_contents считаются атомарными... | |
|
|
|
|
|
|
|
для: *m*
(12.06.2009 в 15:06)
| | Я автор комментариев на этой странице. Пиво, ныне продаваемое не пью - это не пиво ;-) | |
|
|
|
|
|
|
|
для: sim5
(12.06.2009 в 00:20)
| | а вы случайно не автор книг?))
очень крутой пример, + пояснения, спасибо что тратите свое время на такие подробные описания. ваш пример мне очень пригодиться, я по нему буду учиться понимать, насколько все можно сделать проще и правельнее. на самом деле опыт, которой мы получаем бесценен, его не купить за деньги, и те советы и решения, которые вы подсказываете на этом форуме, я думаю многим помогают. респект вам!) куда выслать пиво?)))) | |
|
|
|
|
|
|
|
для: *m*
(11.06.2009 в 20:50)
| | Заключение (доктора): у пациента несварение желудка, легкий насморк. Способ лечения: мазь "Вишневского" по чайной ложке после еды, компресс на голову в виде учебника РНР.
Это шутка :) А если серьезно. Вы просили пример, даю.
Чтобы понять, как работает механизм сессий, как записать в нее, и считать из нее переменную, совсем не обязательно задумывать проект какой либо, достаточно это изучить на простейших примерах. И так можно изучать все функции, конструкции, выражения языка.
За всю эту долгую дискуссию, я так ни разу и не услышал от вас генерального - что вы пытаетесь сделать и как. Если вы решили изучить некий РНР-механизм (той же сессии), то читайте выше, но коли вы пишите сценарий, то будьте добры думать о логике его работы. Где она у вас?
Конечно, вы можете записывать в базу все, но разве в этом соль? Вы посмотрите, как вы изначально собираете данные - а ведь на протяжении всей беседы не раз звучало слово массив. И где у вас его работа наблюдается? Вы даже не попытались этого сделать.
Надо ведь не просто изучать функции и конструкции языка, а еще уметь применять их с выгодой, понимать, где они могут принести пользу. Это как выучить семь нот, но не понимать, для чего они нужны. Если вы изначально не захотели сделать свою простейшую задачу как логический автомат, то и к базе вы будет обращаться так же, как вы сейчас поступаете с сессией.
Допустим, что я захотел узнать интересы людей: любимая музыка, блюдо, машины, и т.п.. Для простоты, я буду предлагать им по три варианта на каждый вопрос. Естественно, что человеку может нравиться как одно из трех предлагаемых направлений в музыке, так и все три. И так по всем вопросам. И это я держу в уме. Взяв листок с ручкой, я написал вопросы, и варианты ответов на них.
Где и как мы будем хранить количество ответов на варианты? Какие могут быть вопросы – конечно же, напротив вариантов ответов. Уже вырисовывается некая таблица.
Да еще вопросы могут оказаться неактуальными, значит, нужно будет как-то их удалять, или править. Да и хорошо бы иметь возможность добавлять новые.
А как будем задавать вопросы? Если вопросов мало, то можно все напечатать на одном листике. А если много, значит, потребуется несколько листов.
А что нам показывать человеку после его ответов? Будем показывать то, что он отметил и общую статистику интересов, имеющуюся на этот момент. А при выводе информации об интересах, не выводить же нам опять вопрос, значит нужно описание для данного вопроса, которое мы будем показывать человеку при выводе результатов. Значит, в свою таблицу я добавляю еще один столбец, и напротив каждого вопроса пишу описание его.
Но «бумажный» не интересен, поэтому будем «компьютезировать» свою задачу, и выставим ее в интернете. Но как? После долгих расспросов сведущих людей, от слесаря своего ЖЭКа узнал «волшебное» слово – HTML. Почитав об этом чуде, научился писать странички для Интернета, готовить формы…. Но, оказывается HTML не всемогущ. И только сантехник моего ЖЭКа подсказал правильное направление – «Тебе нужно ПиЭйчПи», заливая марочным Портвейном это сладкое слово. Сладким словом оказался PHP, или попросту «пых» - язык программирования серверных приложений.
Как и любой уважающий себя, язык, РНР представился о своих возможностях: какими выражениями может излагаться, чего он понимает, и что может предложить. Узнал от него, что строка это оказывается тип, а типы еще те бывают…. А вот тип массив заинтересовал, уж больно сильно он напоминал таблицу на бумаге с приготовленными вопросами. И оказывается, что у «пыха» столько предложений для того чтобы разбираться с этим типом. Решено, преобразуем свою таблицу в массив. Потренировавшись с массивами, поняв, что к чему, составляем массив для опроса:
<?
$array = array(
array("quest" => "Какую музыку вы любите?", "like" => "Любимая музыка", "var" => array(1 => array("Поп",0),array("Рок",0),array("Джаз",0))),
array("quest" => "Ваше любимое блюдо?", "like" => "Любимое блюдо", "var" => array(1 => array("Борщ",0),array("Суп",0),array("Щи",0)))
);
?>
|
Мы люди сведущие, и знаем, что компьютер все хранит в файлах, и мы свои вопросы будем хранить в них же. А коли РНР «язык», значит, он должен уметь сохранить наши вопросы в файле. И правда, нашли подходящее - file_put_contents(). Но как бы нам сохранить массив так, чтобы это был просто текст, а когда нам нужен он, то опять был массивом. Есть и такое – serialize(). И так, выполнив:
<?
file_put_contents("questions", serialize($array));
?>
|
мы приготовили файл с вопросами, и заодно создали архив для хранения накапливаемой информации. Ну а, далее руководствуясь тем, что мы хотим сделать, выбираем то, что нам предлагает РНР.
<?
//стартуем/продолжаем сессию
session_start();
//если файл с вопросами еще не загружался в наш сценарий,
//загружаем его, преобразуя опять в массив
//загружать файл будем в сессию,
//используя ее как временное хранилище наших данных
if(!$_SESSION['questions']) $_SESSION['questions'] = unserialize(file_get_contents("questions"));
//мы бы не стали показывать все листики с вопросами,
//а показывали по одному, столько раз, сколько листиков имеем,
//поэтому и на компьютере мы будем показывать по одному вопросу,
//и столько раз, сколько у нас вопросов (элементов в массиве)
$n = count($_SESSION['questions']); //число вопросов в опросе
//а это счетчик показов вопросов, и чтобы он не перзаписывался
//при каждом обращении к странице, храним его в сессии
if(!isset($_SESSION['forms'])) $_SESSION['forms'] = $n+1;
//проверяем – пришла ли форма с выбором от пользователя
if($_POST['send']) {
$k = $n - $_SESSION['forms']; //получаем текущий вопрос (индекс массива)
//полученный массив значений формы обходим в цикле
//суммируя ячейки вариантов ответа (индекс 1), ключа «var»,
//индекс которых совпадает со значением принятым от формы,
//так мы будем накапливать статистику по вопросу,
//сохраняя ее, в последствии, в файл
foreach($_POST['q'] as $val) $_SESSION['questions'][$k]['var'][$val][1]++;
//для каждого опрашиваемого, информация о его выборе важна только ему,
//а значит это временная информация, и мы ее будем хранить в другом массиве,
//не сохраняя в общей статистике,
//а так, как мы определим (потом) наши элементы в форме как массив,
//то $_SESSION['vars'] будет хранить в себе массив выбора,
//а индекс $k будет определять, для какого он вопроса
$_SESSION['vars'][$k] = $_POST['q'];
}
//инкрементируем счетчик вывода вопросов
$_SESSION['forms']--;
//если еще есть вопросы, выводим их
if($_SESSION['forms']) {
//получаем текущий элемент массива вопросов
$el = $_SESSION['questions'][$n - $_SESSION['forms']];
//выводим вопрос и форму
echo "<p>" . $el['quest'] . "</p><form action=\"interrogation.php\" method=\"post\">";
//мы держали в уме, что варианты, это не выбор одного из трех,
//поэтому выводим чекбоксы в форму как массив элементов,
//значениям которых будем указывать индексы массивов ключа var
foreach($el['var'] as $key => $val) echo $key . ". " . $val[0] . "<input type=\"checkbox\" name=\"q[]\" value=\"" .$key. "\"><br>";
echo "<br><input type=\"submit\" name=\"send\" value=\"Отправить\"></form>";
} else {
//если на все вопросы получены ответы,
//сохраняем результат в файл
file_put_contents("questions", serialize($_SESSION['questions']));
//и выводим информацию о сделанном выборе,
//используя временный массив $_SESSION['vars']
//как ключи доступа к массиву вопросов
echo "<p><b>Ваши предпочтения</b></p>";
foreach($_SESSION['vars'] as $key => $var) {
//выводим описание вопроса
echo "<p>" . $_SESSION['questions'][$key]['like'] . ":<br>";
//выводим выбранные опрашиваемым варианты
foreach($var as $val) echo " " . $_SESSION['questions'][$key]['var'][$val][0] . "<br>";
}
//показываем общую (накопленную) статистику
echo "<p><b>Общая статистика</b></p>";
foreach($_SESSION['questions'] as $var) {
//выводим описание вопроса
echo "<p>" . $var['like'] . ":<br>";
//выводим накопленную статистику по вопросу
foreach($var['var'] as $val) echo " " . $val[0] . " - " . $val[1] . "<br>";
}
//завершаем работу сценария
exit;
}
?>
|
Использование массива оказалось оправданным. Все работает как цифровой автомат, и если добавить еще вопросов, или убирать некоторые, то в самом сценарии ничего править не придется. А для редактирования самих вопросов можно написать сценарий управления.
В общем, получилось так, как и задумывалось. | |
|
|
|
|
|
|
|
для: sim5
(11.06.2009 в 20:39)
| | все заработало, спс.
ну я вобщем буду переделывать, сделаю таблицу и по принципу, получили ответ на первый вопрос, записали в базу, на второй записали и так далее..
спасибо за помощь и участие в разборе, очень сложно самому учиться. | |
|
|
| |
|