[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создание опроса
Anton63
Задумка, в общем, такая:
Это чё то типо ТОР10. например 10 самых богатых людей, 10 самых быстрых машин и т.д. Есть форма для заполнения(Её заполнять могут только зарегистрированные пользователи, значит нужно прослеживать сессию пользователя и данные о нике пользователя берутся из таблицы users в БД).

Пример(форма):
Автор: Billo
Заголовок: Самые большие города мира
Ответ 1: Москва
Ответ 2: Лондон
Ответ 3: Нью-Йорк
Ответ 4: Самара
Ответ 5: Париж
"Отправить"


Так вот... после заполнения формы и нажатия на кнопку "Отправить" Этот опрос добавляется в БД со множеством подобных опросов(В каждом опросе 5 вариантов ответа)
Незарегистрированный пользователь может смотреть только результаты.

Результат:
Самые большие города мира
Автор: Billo; 26.05.2009
1. Москва
2. Лондон
3. Нью-Йорк
4. Самара
5. Париж


А администратор сайта видит это так(R- редактировать X-удалить):

Админка:
Самые большие города мира R X
Автор: Billo; 26.05.2009
1. Москва R
2. Лондон R
3. Нью-Йорк R
4. Самара R
5. Париж R

Значит для админа сайта тоже надо проследить сессию и выдать результат опроса с возможностью его редактирования.
Подскажите пожалуйста как структурировать БД для этой задачи.
В частности меня интересует какие таблицы нужно создать, как их связать и какие поля там должны быть... И как лучше хранить данные с ответами в таблице(Ответ 1, Ответ 2...Ответ 5)? При условии, что их потом надо будет редактировать... и оптимизировать под поиск по сайту...



Спустя 1 минута, 32 секунды (13.07.2009 - 08:23) Anton63 написал(а):
Кстати... на каждый опрос можно оставлять комментарии(Это может делать любой пользователь)...

Спустя 1 час, 56 минут, 24 секунды (13.07.2009 - 10:20) Anton63 написал(а):
Я думаю что то типо этого...

create table answers (
id int(10) unsigned NOT NULL auto_increment,
nick varchar(50) NOT NULL,
datetime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
head varchar(150),
answer1 varchar(50),
answer2 varchar(50),
answer3 varchar(50),
answer4 varchar(50),
answer5 varchar(50),
comment varchar(300)?
primary key (id)
);

id - счётчик, nick берётся из таблицы users, datetime - дата и время(вставляется автоматически при создании опроса), answer - это ответы, comment - это комментарии(они берутся из таблицы comments)...

Вот... значит нам нужны таблицы answers, users и comments... Только вопрос... как их связать...

Спустя 59 минут, 55 секунд (13.07.2009 - 11:20) FatCat написал(а):
Anton63
Под каждый новый опрос каждый раз новую таблицу вручную создавать?

ИМХО, лучше сразу сделать единую систему из связанных таблиц. В первой сохранять инфорацию о самом опросе, во второй информацию о результатах голосования.
Таблица мемберов статичная или заполняется из другой формы; информация из нее берется для таблицы результатов голосования.

Спустя 1 час, 8 минут, 5 секунд (13.07.2009 - 12:28) Anton63 написал(а):
Цитата (FatCat @ 13.07.2009 - 08:20)
Anton63
Под каждый новый опрос каждый раз новую таблицу вручную создавать?

ИМХО, лучше сразу сделать единую систему из связанных таблиц. В первой сохранять инфорацию о самом опросе, во второй информацию о результатах голосования.
Таблица мемберов статичная или заполняется из другой формы; информация из нее берется для таблицы результатов голосования.

Не, я не собираюсь для каждого опроса создавать новую таблицу... Я собираюсь таким образом создать таблицу для её дальнейшего заполнения... Таких таблиц я создам три...
Первая с вопросом и ответами...т.к. создатель опроса сам заполняет все 5 полей с ответами(все поля обязательны для заполнения).
create table answers (
id_ans int(10) unsigned NOT NULL auto_increment,
nick varchar(50) NOT NULL,
date date NOT NULL,
head varchar(150) NOT NULL,,
answer1 varchar(50) NOT NULL,,
answer2 varchar(50) NOT NULL,,
answer3 varchar(50) NOT NULL,,
answer4 varchar(50) NOT NULL,,
answer5 varchar(50) NOT NULL,,
primary key (id_ans)
);

Вторая таблица с комментариями... в этой таблице будут храниться комментарии ко всем опросам. Т.е. связываться таблицы будут через id_ans. При оставлении комментария будет присваиваться id_ans такой же как и в таблице answers. А при запросе комментариев к опросу будут выбираться все комментарии с одинаковым id_ans.
create table comments (
id_com int(10) unsigned NOT NULL auto_increment,
nick varchar(50) NOT NULL,
date date NOT NULL,
comment varchar(300) NOT NULL,
id_ans int(10),
primary key (id_com)
);


Как вам такой вариант???

И ещё вопрос... при авторизации пользователя для него создаётся сессия... и при создании опроса или комментария можно ли из этой сессии вытянуть его ник для полей nick в таблицах?

Третья таблица - это users... в ней будут храниться зарегистрированные пользователи... но это уже из другой оперы...

Спустя 28 минут, 6 секунд (13.07.2009 - 12:56) Anton63 написал(а):
FatCat спасибо.
Больше никто не поможет со структурой БД???

Спустя 11 минут, 14 секунд (13.07.2009 - 13:07) Raito-kun написал(а):
можно вытянуть ник. после начала сессии просто присвой
PHP
$_SESSION['username'] = $username;

$username вытащи из таблицы users, далее оперируй с $_SESSION['username']
Я незнаю зачем тебя интересуют ники проголосовавших. я бы делал 2 столбца - в первом просто статично для себя записал бы "Ответ1, Ответ2 и тд", и в каждом следующем столбце результаты каждого опроса в цифрах. при голосовании просто бы делал +1 к нужной ячейке. наглядно так

AnsNumber City Car
Answer1 1 21
Answer2 3 0
Answer3 12 4
Answer4 0 7
Answer5 5 3

И т.д. допустим еще один пользователь голосует за первый город. просто делаем выборку по номеру ответа(будет строка Answer1) и обновляем значение строки Сity увеличивая на еденицу (допустим $query['City']++). Но если тебе железно нужны ники голосовавших, то конечно такая система не катит.

Спустя 5 минут, 11 секунд (13.07.2009 - 13:12) Anton63 написал(а):
Это не совсем опрос... это больше похоже на TOP10 или TOP100
Пользователь создаёт опрос, например самые большие города мира... и сам же, по своему мнению забивает все 5 полей с ответами(например Москва, Лондон, Париж и т.д.)... никто другой больше ничего кроме комментариев там писать не может...
Как смог объяснил... smile.gif

Спустя 1 час, 56 минут, 6 секунд (13.07.2009 - 15:08) Alchemist написал(а):
для заявленой функциональности такая структура вполне подойдет. Вот когда потребуются дополнительные возможности (неограниченое кол-во "ответов", возможность добавлять/удалять/менять ответы местами, и т.д.) - вот тогда начнутся проблемы.

Спустя 17 часов, 14 минут, 13 секунд (14.07.2009 - 08:23) Anton63 написал(а):
Цитата (Alchemist @ 13.07.2009 - 12:08)
для заявленой функциональности такая структура вполне подойдет. Вот когда потребуются дополнительные возможности (неограниченое кол-во "ответов", возможность добавлять/удалять/менять ответы местами, и т.д.) - вот тогда начнутся проблемы.

Ок... тогда начинаю писать... а когда начнутся проблемы тогда и буду их решать...

Спустя 1 час, 44 минуты, 23 секунды (14.07.2009 - 10:07) Anton63 написал(а):
<?php
$date = date(Y);
echo "
<html>
<head>
</head>
<body>
<form method='POST' action='work_registration.php'>
<table>
<tr><td>Дата рождения:</td><td>
<select name='birthday'>
";
for($i=$date-60; $i<=$date; $i++wink.gif{
echo "<option value='.$i.'>";
}
echo "
</td></tr>
</table>
</form>
</body>
</html>
";
?>

Почему в не работает выпадающий список? В качестве результата, в выпадающем списке он мне выдаёт ";} echo "

Спустя 2 часа, 28 минут, 36 секунд (14.07.2009 - 12:36) glock18 написал(а):
Цитата (Anton63 @ 14.07.2009 - 05:23)
Ок... тогда начинаю писать... а когда начнутся проблемы тогда и буду их решать...

по-моему, не очень правильный подход. потому что придется решать, переделывая кучу того, что уже сделано.

так и не понял, в чем конкретно не работает (IE что ли?), но:

PHP
echo "<option value='.$i.'>";

это вообще говоря, я думаю, это не то, что вам надо. Кавычки смотрите - напутали, очевидно.

плюс - тег option по идее закрывать надо

PS: вывод
Цитата
;} echo

очевидно, не зависит от браузера. проблема скорее всего с вашими кавычками.

Спустя 4 часа, 34 минуты, 8 секунд (14.07.2009 - 17:10) HardWoman написал(а):
Вот это здорово - количество полей привязать к количеству элементов массива?

5 и ни вправо ни влево. Ужас.

Делайте как говоритglock18 и Alchemist




Спустя 15 часов, 35 минут, 51 секунда (15.07.2009 - 08:46) Anton63 написал(а):
Цитата (glock18 @ 14.07.2009 - 09:36)
так и не понял, в чем конкретно не работает (IE что ли?), но:

PHP
echo "<option value='.$i.'>";

это вообще говоря, я думаю, это не то, что вам надо. Кавычки смотрите - напутали, очевидно.

плюс - тег option по идее закрывать надо

PS: вывод
Цитата
;} echo

очевидно, не зависит от браузера. проблема скорее всего с вашими кавычками.

Да, Вы правы, дело не в браузере... просто с кавычками напутал...

Спустя 12 минут, 3 секунды (15.07.2009 - 08:58) Anton63 написал(а):
Файл index.html
PHP
session_start();
if(
$_SESSION['var'] = 1){
echo 
"Hello, ".$_SESSION['login'];
}
else{
echo 
"
<html>
<head>
<title>Главная страница</title>
</head>
<body>
<table border = 2>
<form method='POST' action='login.php'>
<tr><td>
<table>
<tr><td>Логин:</td><td><input type='text' name='login' size='15'></td></tr>
<tr><td>Пароль:</td><td><input type='password' name='pass' size='15'></td></tr>
</table>
</td></tr>
<tr><td align=center><input type='submit' name='ok' value='Вход'></td></tr>
</form>
</table>
</body>
</html>"
;
}


Файл login.php
PHP
$db=mysql_connect('localhost''root''');
mysql_select_db('top10'$db);

// Обезвреживаем переменные
$blogin htmlspecialchars($_POST[login]);
$bpass htmlspecialchars($_POST[pass]);

//проверяем есть ли пользователь с таким login'ом и pass'ом
$res=mysql_query("SELECT * FROM users WHERE login='$blogin' AND pass='$bpass'"$db);
if(
mysql_num_rows($res) != 1){    //такого пользователя нет
echo "Введены не верные логин или пароль";
}
else{    
//пользователь найден
session_start();
$_SESSION['login']=$blogin;    //устанавливаем login & pass
$_SESSION['pass']=$bpass;
$_SESSION['var']=1;
Header("Location: index.html");    // перенаправляем на index.html
mysql_close();
}


Пытаюсь сделать авторизацию пользователя... Т.е. если пользователь авторизован и для него создана сессия со значением "$_SESSION['var']=1;", то выводится
PHP
echo "Hello, ".$_SESSION['login'];


Если нет, то выводится форма для авторизации. При заполнении формы пользователь проверяет введённые данные и если они верны, то создаётся сессия и в массив записываются его данные:
PHP
$_SESSION['login']=$blogin;
$_SESSION['pass']=$bpass;
$_SESSION['var']=1;
Header("Location: index.html");


После чего он попадает на главную страницу, где получает сообщение
PHP
echo "Hello, ".$_SESSION['login'];


Если в форму ввести неверные данные тогда выводится сообщение
PHP
echo "Введены не верные логин или пароль";

Если же введены верные данные, то при проверке
PHP
if($_SESSION['var'] = 1)

он всё равно выводит форму...
Гуру языка ПХП, подскажите, что я делаю не так...

Спустя 2 часа, 12 минут, 45 секунд (15.07.2009 - 11:10) Alchemist написал(а):
если кратко - почти все

Спустя 5 минут, 14 секунд (15.07.2009 - 11:16) Anton63 написал(а):
Цитата (Alchemist @ 15.07.2009 - 08:10)
если кратко - почти все

Тогда, что так???

Спустя 2 минуты, 56 секунд (15.07.2009 - 11:19) Anton63 написал(а):
PHP
if(!isset($_SESSION['var'])){
форма
}
else{
echo 
"Hello, "$_SESSION['login'];
}


Так?

Спустя 10 минут, 50 секунд (15.07.2009 - 11:29) Alchemist написал(а):
1) обычно .html файлы не обрабатываются пхп-обработчиком. Скорее всего и у тебя тоже.

2) "=" - это оператор присвоения. Оператор сравнения это - "=="

Спустя 31 минута, 21 секунда (15.07.2009 - 12:01) glock18 написал(а):
3) в этом контексте вместо
PHP
if(!isset($_SESSION['var'])){


или

PHP
if($_SESSION['var']){


лучше

PHP
if(!empty($_SESSION['var'])){

Спустя 21 час, 29 минут, 14 секунд (16.07.2009 - 09:30) Anton63 написал(а):
glock18, спасибо, с empty действительно лучше...

Пример:
Я нахожусь на файле boot.php в папке boot. Как мне перейти к файлу index.php, который находится папкой выше, при помощи header()?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.