Консультация № 179588
25.07.2010, 16:17
43.06 руб.
0 9 1
Добрый день ув. эксперты.

Есть страница простого анкетирования, она состоит из таблиц:
1 - вариантов вопросов - anketa_voprosi
2 - вариантов ответов с привязкой по полю vopros_id к базе возможных вопросов - anketa_otveti
3 - ответов пользователей где указаны соотв. кто когда какой ответ выбрал - anketa_logs

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

У меня есть 2 мысли - 1ое это присвоить к каждому текстареа id равный id вопроса - тут все все получается (проверяю плагином к ФайрФоксу), но как передать обработчику формы все значения (я делаю это через ф-ю foreach ) и соотвествующий этому значению id всех заполненных текстареа-полей? - через javascript?
Либо 2ая мысль - это "пока есть заполненный текстареа создавать переменную и присваивать ей этот самый id" и потом его записывать в базу.
- но пока не могу додуматься как это все сделать:(

Тоесть еще и проверять надо - есть ли какие либо символы в текстареа(с этим я еще не разбирался но если есть решение то - буду благодарен).

Вот код вывода анкеты:
$query_voprosi=mysql_query("SELECT * FROM anketa_voprosi WHERE `actual`=1"); //выбираем все с базы наименований вопросов
while ($query_voprosi_arr=mysql_fetch_array($query_voprosi)){ //пока есть вопросы - выводим их
print '<b><font color=blue>'.$query_voprosi_arr[vopros].'</font></b>';
print '
';
$query_otveti=mysql_query("SELECT * FROM anketa_otveti WHERE anketa_otveti.vopros_id=$query_voprosi_arr[id] AND `actual`=1"); //пока есть вопросы ищем на них варианты ответов
while ($query_otveti_arr=mysql_fetch_array($query_otveti)){ //пока есть варианты ответов на вопросы - выводим их
print '<input type="checkbox" name="vibor[]" id="'.$query_otveti_arr[id].'" value="'.$query_otveti_arr[id].'">';
print '<font color=#000033>'.$query_otveti_arr[otvet].'</font>';;
print '
';
}
// + выводим к каждому воросу дополнительный текстареа
print '<font color="#008080">Дополнительно</font>:
';
print '<textarea id="'.$query_voprosi_arr[id].'" name="txtarea[]" cols=50 rows=3></textarea>'; // пока есть вопросы - выводим доп. поле текстареа для доп.ответа
$vopros_id = $query_voprosi_arr[id];


Это код обработчика: (часть кода пропущена)
if(isset($_POST['vibor']))
{
foreach($_POST['vibor'] as $vibor)
{

include "config.php";
mysql_query("INSERT INTO anketa_logs (`time`, `user_id`, `otvet_id`, `hr_pass`, `random`, `txtarea`, `active`) VALUES ('$time', '$user_id_arr[id]', '$vibor', '$_SESSION[random_code]', '$random', '0', '1')", $db_goodbye) or die ("Ошибка anketa_logs: " . mysql_error());

}
}

if(isset($_POST['txtarea']))
{
foreach($_POST['txtarea'] as $txtarea)
{

mysql_query("INSERT INTO anketa_logs (`time`, `user_id`, `vopros_id`, `hr_pass`, `random`, `txtarea`, `active`) VALUES ('$time', '$user_id_arr[id]', 'что здесь указать???, '$_SESSION[random_code]', '$random', '$txtarea', '1')", $db_goodbye) or die ("Ошибочка: " . mysql_error());


Надеюсь не запутал Вас :)
PS: и если есть какието замечания по самому коду - напишите пжл может как то можно оптимизировать.
Заранее Благодарен Вам!

Обсуждение

Неизвестный
26.07.2010, 14:19
общий
Вопрос слишком тяжелый или непонятный? :)
Неизвестный
26.07.2010, 18:04
общий
это ответ
Здравствуйте, skatet.

Вот моё решение. Я его не проверял но я надеюсь ход мыслей понятен! Просто обзываем textarea+id. А потом проверяем существует ли такая переменная, если да то записываем!

Приложение:
Изменения кода вывода анкеты:
print '<textarea id="'.$query_voprosi_arr[id].'" name="txtarea'.$query_voprosi_arr[id].'" cols=50 rows=3></textarea>'; // пока есть вопросы - выводим доп. поле текстареа для доп.ответа


Изменения кода обработчика:
$query_voprosi=mysql_query("SELECT * FROM anketa_voprosi WHERE `actual`=1"); //выбираем все с базы наименований вопросов
while ($query_voprosi_arr=mysql_fetch_array($query_voprosi)){ //пока есть вопросы
$name ="txtarea".$query_voprosi_arr[id];
if (isset($_POST[$name]))
mysql_query("INSERT INTO anketa_logs (`time`, `user_id`, `vopros_id`, `hr_pass`, `random`, `txtarea`, `active`) VALUES ('$time', '$user_id_arr[id]', '".$query_voprosi_arr[id]."', '$_SESSION[random_code]', '$random', '".$_POST[$name]."', '1')", $db_goodbye) or die ("Ошибочка: " . mysql_error());
}
5
Неизвестный
26.07.2010, 19:19
общий
Отлично друг - все получилось! большое спасибу! все довольно таки просто и работает!
PS: и почему я сам не додумался.. :))
Обязательно отблагодарю копеечкой завтра - просто на этом пк нет вебмани :)
Респект!
Неизвестный
26.07.2010, 19:24
общий
та не за что. сам через это проходил. кстати есть более оптимальный способ это сделать. если хочешь роскажу!
Неизвестный
26.07.2010, 20:12
общий
конечно друг!
зы: копеечку отправил кстати!
Неизвестный
26.07.2010, 21:28
общий
спасибо за деньги.
а вот и способ. здесь я использую регулярное выражение для проверки того какую переменную я взял и одновременно выделения с имени id

foreach ($_POST as $key=>$value) {
if (preg_match_all('/txtarea([0-9]+)/', $key, $arr, PREG_PATTERN_ORDER))
if (!empty($value))
mysql_query("INSERT INTO anketa_logs (`time`, `user_id`, `vopros_id`, `hr_pass`, `random`, `txtarea`, `active`) VALUES ('$time', '$user_id_arr[id]', '".$arr[1][0]."', '$_SESSION[random_code]', '$random', '".$value."', '1')", $db_goodbye) or die ("Ошибочка: " . mysql_error());
}

вот это
preg_match_all('/txtarea([0-9]+)/', $key, $arr, PREG_PATTERN_ORDER)
проверяет имя переменной и записывает в массив $arr id
Неизвестный
26.07.2010, 21:39
общий
этот сбособ более хорош потому как:
1) не нужно делать лишний запрос к базе
2) если ты не будешь выводить все вопросы(допустим у тебя вопросы будут не на одной странице) то он не будет делать лишних проверок на существования переменных как в предыдущем случае(ну хотя это тоже можно обойти в предыдущем примере делая выборку для проверки такую же как и для выводов вопросов я имею введу вот это
$query_voprosi=mysql_query("SELECT * FROM anketa_voprosi WHERE `actual`=1");
для скрипта вывода вопросов и скрипта обработчика должен быть один и тот же запрос тогда этот недочет опускается)
но также есть один минус
он проходится по всему массиву $_POST
Неизвестный
26.07.2010, 23:43
общий
:) мощно, я обработаю ок с утра и отпишусь, сп. тебе за помощь.
Пс. Если есть желание и время могу тебе работенку подкинуть на рнр за вознаграждение конечно :)
Неизвестный
27.07.2010, 11:46
общий
всегда рад работенке. я сам фрилансер. так что пиши.
мои контакты
icq 391581583
skype SanyaLazarev
Форма ответа