Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вывод опроса с БД
Форумы портала PHP.SU » » Работа с СУБД » Вывод опроса с БД

Страниц (1): [1]
 

1. naruto - 06 Февраля, 2012 - 20:03:57 - перейти к сообщению
Доброго времени суток! Вообще начал делать скрипт проведения опроса
Создал три таблицы и заполнил минимальными данными
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.  
  3. CREATE TABLE IF NOT EXISTS `answer` (
  4.   `id` int(11) NOT NULL AUTO_INCREMENT,
  5.   `name` varchar(255) DEFAULT NULL,
  6.   `question_id` int(11) DEFAULT NULL,
  7.   `vote_count` int(11) DEFAULT NULL,
  8.   PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=13 ;
  10.  
  11.  
  12. INSERT INTO `answer` (`id`, `name`, `question_id`, `vote_count`) VALUES
  13. (1, '5', 1, 1),
  14. (2, '7', 1, 0),
  15. (3, '9', 1, 0),
  16. (4, '12', 1, 0),
  17. (5, '11', 2, 0),
  18. (6, '22', 2, 0),
  19. (7, '25', 2, 1),
  20. (8, 'Алгебра', 3, 0),
  21. (9, 'Физика', 3, 1),
  22. (10, 'Литра', 3, 0),
  23. (11, 'История', 3, 1),
  24. (12, 'Технология', 3, 0);
  25.  
  26.  
  27. CREATE TABLE IF NOT EXISTS `poll` (
  28.   `id` int(11) NOT NULL AUTO_INCREMENT,
  29.   `name` varchar(255) DEFAULT NULL,
  30.   `status` enum('active','close','rough') DEFAULT 'close',
  31.   PRIMARY KEY (`id`)
  32. ) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;
  33.  
  34.  
  35. INSERT INTO `poll` (`id`, `name`, `status`) VALUES
  36. (1, 'Первый опрос', 'active');
  37.  
  38.  
  39. CREATE TABLE IF NOT EXISTS `question` (
  40.   `id` int(11) NOT NULL AUTO_INCREMENT,
  41.   `name` text,
  42.   `type` enum('radio','chek') DEFAULT 'radio',
  43.   `poll_id` int(11) DEFAULT NULL,
  44.   PRIMARY KEY (`id`)
  45. ) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;
  46.  
  47.  
  48. INSERT INTO `question` (`id`, `name`, `type`, `poll_id`) VALUES
  49. (1, 'Сумма числе 2+3', 'radio', 1),
  50. (2, 'Произведение чисел 5*5', 'radio', 1),
  51. (3, 'Какой у Вас любимый предмет?', 'chek', 1);
  52.  
  53.  


файл подключения к БД startup.php
PHP:
скопировать код в буфер обмена
  1.  
  2. function startup()
  3. {
  4.         // Настройки подключения к БД.
  5.         $hostname = 'localhost';
  6.         $username = 'root';
  7.         $password = '';
  8.         $dbName = 'poll';      
  9.        
  10.         // Подключение к БД.
  11.         mysql_connect($hostname, $username, $password) or die('No connect with data base');
  12.         mysql_select_db($dbName) or die('No data base');               
  13. }
  14.  


Файл модели model.php

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function poll_ans()
  4. {
  5.         // Запрос.
  6.         $query = "SELECT question.name AS question, answer.name AS answer
  7.         FROM question
  8.                         LEFT JOIN answer ON answer.question_id = question.id";
  9.         $result = mysql_query($query);
  10.                                                        
  11.         if (!$result)
  12.                 die(mysql_error());
  13.        
  14.         // Извлечение из БД.
  15.         $n = mysql_num_rows($result);
  16.         $poll= array();
  17.  
  18.         for ($i = 0; $i < $n; $i++)
  19.         {
  20.                 $row = mysql_fetch_assoc($result);             
  21.                 $poll[] = $row;
  22.         }
  23.        
  24.         return $poll;
  25. }
  26.  


Ну и собственно index.php
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4. include_once('startup.php');
  5. include_once('model.php');
  6. startup();
  7. $poll_ans = poll_ans();
  8.  
  9. ?>
  10.  
  11. <p>
  12. <? foreach ($poll_ans as $polls): ?>
  13.                 <?=$polls['question']?>
  14. <? foreach ($poll_ans as $polls): ?>
  15.                 <h3>
  16.                 <input type="radio" name="answer" value="a<?=$polls['question_id']?>"><?=$polls['answer']?><Br>
  17.                 </h3>
  18.                 <? endforeach ?>
  19. <? endforeach ?>
  20.  

Как правильно вывести опрос на страницу? тоесть чтобы в шапке имя опроса, затем вопрос-ответы, вопрос-ответы. Это же по идеи автоматически должно будет генерироваться запросом с БД при выборе нужного опроса(id), и выводится на страницу. Какой то бред foreach'ем попробовал сделать, короче каша в голове( помогите пожалуйста, как правильно делается
2. Panoptik - 06 Февраля, 2012 - 20:18:26 - перейти к сообщению
у вас вопросы все сразу выводятся или один какой-нибудь(текущий) ?
3. naruto - 06 Февраля, 2012 - 20:23:05 - перейти к сообщению
Panoptik пишет:
у вас вопросы все сразу выводятся или один какой-нибудь(текущий) ?

надо как - будет например в базе 10 опросов. Выводится список где нибудь названий всех опросов, и при нажатии на какой нибудь выведется опрос со всеми его вопросами и их ответами. Ну как Тест, один за другим вопросы с ответами, а в шапке название опроса. Пока я ввел ручками один опрос с тремя вопросами и с ответами на них. Еще как то в цикле который будет выводить все это надо учесть radio или chek выводит в ответах. Ну и по сути опрос может быть активный, архивный и черновик.
4. Panoptik - 06 Февраля, 2012 - 21:19:04 - перейти к сообщению
значит выводим список опросов
PHP:
скопировать код в буфер обмена
  1.  
  2. //достаем опросы
  3. //здесь опускается проверка опроса на наличие в нем вопросов...
  4. function get_poll() {
  5. $query = "SELECT `id`,`name` FROM `poll` WHERE `status` = 'active'";
  6. $result = mysql_query($query);
  7. if(mysql_num_rows($result)) {
  8.   while($row = mysql_fetch_row($result)) {
  9.     $res[] = $row;
  10.   }
  11. } else {
  12.   $res = false;
  13. }
  14. return $res;
  15. }
  16. //выводим опросы
  17. function print_polls($poll) {
  18.  if($poll === false) {
  19.     echo  "<p>У нас нет опросов</p>";
  20.  } else {
  21.    foreach($poll as $row) {
  22.      echo "<p><a href='?poll=".$row[0]."'>".$row[1]."</a></p>";
  23.    }
  24.  }
  25. }
  26. //выводим опрос
  27. function print_poll($poll) {
  28.   $query = "SELECT `id`,`name` FROM `poll` WHERE `id`=".$poll;
  29.   $result = mysql_query($query);
  30.   if(mysql_num_rows($result)) {
  31.     $row = mysql_fetch_row($result);
  32.     echo "<p>Опрос: ".$row[1]."</p>";
  33.     print_questions($row[0]);
  34.   } else {
  35.     echo "<p>А нет такого опроса!</p>";
  36.   }
  37. }
  38. //достаем вопросы опроса
  39. function get_questions($poll) {
  40. $query = "SELECT `id`,`name`,`type` FROM `question` WHERE `poll_id` = ".$poll;
  41. $result = mysql_query($query);
  42. if(mysql_num_rows($result)) {
  43.   while($row = mysql_fetch_row($result)) {
  44.     $res[] = $row;
  45.   }
  46. } else {
  47.   $res = false;  
  48. }
  49. //достаем ответы вопроса
  50. function get_answers($question) {
  51.   $query = "SELECT `id`,`name` FROM `answers` WHERE `question_id` = ".$question;
  52.   $result = mysql_query($query);
  53.   if(mysql_num_rows($result)) {
  54.     while($row = mysql_fetch_row($result)) {
  55.       $res[] = $row;
  56.     }
  57.   } else {
  58.     $res = false;
  59.   }
  60.   return false;
  61. }
  62. //выводим вопрос
  63. function print_questions($poll) {
  64.   $result = get_questions($poll);
  65.   if($result === false) {
  66.     echo "<p>Тут вопросов нет</p>";
  67.   } else {
  68.     foreach($result as $question) {
  69.       echo "<p>Вопрос: ".$question[1]."</p>";
  70.       print_answers($question[0],$question[2]);
  71.     }
  72.   }
  73. }
  74. //выводим ответы
  75. function print_answers($question,$type) {
  76.     $answers = get_answers($question);
  77.     if($answers === false) {
  78.       echo "<p>Ответов не видать</p>";
  79.     } else {
  80.       if($type == 'radio') {
  81.         foreach($answers as $answer) {
  82.           echo "<p><input type='radio' name='answer_".$question."' value='".$answer[0]."' />".$answer[1]."</p>";
  83.         }
  84.       }
  85.       if($type == 'chek') {
  86.         foreach($answers as $answer) {
  87.           echo "<p><input type='checkbox' name='answer_".$question."_".$answer[0]."' />".$answer[1]."</p>";
  88.         }
  89.       }
  90.     }
  91.    
  92. }
  93. //выводим ссылки на опросы
  94. get_poll();
  95. //проверяем нет ли у нас запроса на опрос
  96. if($poll_id=(int)$_GET['poll']) {
  97.   print_poll($poll_id);
  98. }
  99.  
  100.  
5. naruto - 07 Февраля, 2012 - 09:50:30 - перейти к сообщению
Спасибо большое, многое уяснилось, только не могу понять почему не выводит ответы?
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. include_once('startup.php');
  4. startup();
  5. //
  6. // Список всех статей
  7. //
  8. //достаем опросы
  9. //здесь опускается проверка опроса на наличие в нем вопросов...
  10. function get_poll() {
  11. $query = "SELECT `id`,`name` FROM `poll` WHERE `status` = 'active'";
  12. $result = mysql_query($query);
  13. if(mysql_num_rows($result)) {
  14.   while($row = mysql_fetch_row($result)) {
  15.     $res[] = $row;
  16.   }
  17. } else {
  18.   $res = false;
  19. }
  20. return $res;
  21. }
  22. //выводим опросы
  23. function print_polls($poll) {
  24.  if($poll === false) {
  25.     echo  "<p>У нас нет опросов</p>";
  26.  } else {
  27.    foreach($poll as $row) {
  28.      echo "<p><a href='?poll=".$row[0]."'>".$row[1]."</a></p>";
  29.    }
  30.  }
  31. }
  32. //выводим опрос
  33. function print_poll($poll) {
  34.   $query = "SELECT `id`,`name` FROM `poll` WHERE `id`=".$poll;
  35.   $result = mysql_query($query);
  36.   if(mysql_num_rows($result)) {
  37.     $row = mysql_fetch_row($result);
  38.     echo "<p>Опрос: ".$row[1]."</p>";
  39.     print_questions($row[0]);
  40.   } else {
  41.     echo "<p>А нет такого опроса!</p>";
  42.   }
  43. }
  44. //достаем вопросы опроса
  45. function get_questions($poll) {
  46. $query = "SELECT `id`,`name`,`type` FROM `question` WHERE `poll_id` = ".$poll;
  47. $result = mysql_query($query);
  48. if(mysql_num_rows($result)) {
  49.   while($row = mysql_fetch_row($result)) {
  50.     $res[] = $row;
  51.   }
  52. } else {
  53.   $res = false;  
  54. }
  55. return $res;
  56. }
  57.  
  58. //достаем ответы вопроса
  59. function get_answers($question) {
  60.   $query = "SELECT `id`,`name` FROM `answers` WHERE `question_id` = ".$question;
  61.   $result = mysql_query($query);
  62.   if(mysql_num_rows($result)) {
  63.     while($row = mysql_fetch_row($result)) {
  64.       $res[] = $row;
  65.     }
  66.   } else {
  67.     $res = false;
  68.   }
  69.   return $res;
  70. }
  71. //выводим вопрос
  72. function print_questions($poll) {
  73.   $result = get_questions($poll);
  74.   if($result === false) {
  75.     echo "<p>Тут вопросов нет</p>";
  76.   } else {
  77.     foreach($result as $question) {
  78.       echo "<p>Вопрос: ".$question[1]."</p>";
  79.       print_answers($question[0],$question[2]);
  80.     }
  81.   }
  82. }
  83. //выводим ответы
  84. function print_answers($question,$type) {
  85.     $answers = get_answers($question);
  86.     if($answers === false) {
  87.       echo "<p>Ответов не видать</p>";
  88.     } else {
  89.       if($type == 'radio') {
  90.         foreach($answers as $answer) {
  91.           echo "<p><input type='radio' name='answer_".$question."' value='".$answer[0]."' />".$answer[1]."</p>";
  92.         }
  93.       }
  94.       if($type == 'chek') {
  95.         foreach($answers as $answer) {
  96.           echo "<p><input type='checkbox' name='answer_".$question."_".$answer[0]."' />".$answer[1]."</p>";
  97.         }
  98.       }
  99.     }
  100.    
  101. }
  102. //выводим ссылки на опросы
  103. $poll = get_poll();
  104. print_polls($poll);
  105.  
  106. if($poll_id=(int)$_GET['poll']) {
  107.   print_poll($poll_id);
  108.  
  109. }
  110.  
  111.  
  112. ?>
  113.  
  114.  


Там в одном месте добавил забытую закрывающую скобку и return $res; Не пойму почему не дергает ответы
6. Panoptik - 07 Февраля, 2012 - 10:39:54 - перейти к сообщению
код писал прям на форуме, поэтому ошибки не исключены. логику примерную я выложил, остальное дело техники
7. naruto - 07 Февраля, 2012 - 11:39:23 - перейти к сообщению
Panoptik пишет:
код писал прям на форуме, поэтому ошибки не исключены. логику примерную я выложил, остальное дело техники

Спасибо Вам Огромное. Я в шоке как можно сразу написать сходу такое на форуме) видимо опыт. Ошибку нашел, вместо поля answer было answers)) Все прекрасно выводит! Если появятся вопросы в дальнейшей работе по этой задаче, стоит сюда писать или новую тему создавать?
8. naruto - 09 Февраля, 2012 - 09:50:19 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. include_once('startup.php');
  3. startup();
  4. //
  5. // Список всех статей
  6. //
  7. //достаем опросы
  8. //здесь опускается проверка опроса на наличие в нем вопросов...
  9. function get_poll() {
  10. $query = "SELECT `id`,`name` FROM `poll` WHERE `status` = 'active'";
  11. $result = mysql_query($query);
  12. if(mysql_num_rows($result)) {
  13.   while($row = mysql_fetch_row($result)) {
  14.     $res[] = $row;
  15.   }
  16. } else {
  17.   $res = false;
  18. }
  19. return $res;
  20. }
  21. //выводим опросы
  22. function print_polls($poll) {
  23.  if($poll === false) {
  24.     echo  "<p>У нас нет опросов</p>";
  25.  } else {
  26.    foreach($poll as $row) {
  27.      echo "<p><a href='?poll=".$row[0]."'>".$row[1]."</a></p>";
  28.    }
  29.  }
  30. }
  31. //выводим опрос
  32. function print_poll($poll) {
  33.   $query = "SELECT `id`,`name` FROM `poll` WHERE `id`=".$poll;
  34.   $result = mysql_query($query);
  35.   if(mysql_num_rows($result)) {
  36.     $row = mysql_fetch_row($result);
  37.     echo "<p>Опрос: ".$row[1]."</p>";
  38.                 echo "<form name='form1' method='post' action = 'form.php' >";
  39.                         print_questions($row[0]);
  40.                 echo "<input type='submit' value='Отослать форму'>";
  41.         echo "</form>";
  42.   } else {
  43.     echo "<p>А нет такого опроса!</p>";
  44.   }
  45. }
  46. //достаем вопросы опроса
  47. function get_questions($poll) {
  48. $query = "SELECT `id`,`name`,`type` FROM `question` WHERE `poll_id` = ".$poll;
  49. $result = mysql_query($query);
  50. if(mysql_num_rows($result)) {
  51.   while($row = mysql_fetch_row($result)) {
  52.     $res[] = $row;
  53.   }
  54. } else {
  55.   $res = false;  
  56. }
  57. return $res;
  58. }
  59.  
  60. //достаем ответы вопроса
  61. function get_answers($question) {
  62.   $query = "SELECT `id`,`name` FROM `answer` WHERE `question_id` = ".$question;
  63.   $result = mysql_query($query);
  64.   if(mysql_num_rows($result)) {
  65.     while($row = mysql_fetch_row($result)) {
  66.       $res[] = $row;
  67.     }
  68.   } else {
  69.     $res = false;
  70.   }
  71.   return $res;
  72. }
  73. //выводим вопрос
  74. function print_questions($poll) {
  75.   $result = get_questions($poll);
  76.   if($result === false) {
  77.     echo "<p>Тут вопросов нет</p>";
  78.   } else {
  79.     foreach($result as $question) {
  80.       echo "<p>Вопрос: ".$question[1]."</p>";
  81.       print_answers($question[0],$question[2]);
  82.     }
  83.   }
  84. }
  85. //выводим ответы
  86. function print_answers($question,$type) {
  87.     $answers = get_answers($question);
  88.     if($answers === false) {
  89.       echo "<p>Ответов не видать</p>";
  90.     } else {
  91.       if($type == 'radio') {
  92.         foreach($answers as $answer) {
  93.           echo "<p><input type='radio' name='answer_".$question."' value='".$answer[0]."' />".$answer[1]."</p>";
  94.         }
  95.       }
  96.       if($type == 'chek') {
  97.         foreach($answers as $answer) {
  98.           echo "<p><input type='checkbox' name='answer_".$question."_".$answer[0]."[]' />".$answer[1]."</p>";
  99.         }
  100.       }
  101.     }
  102.    
  103. }
  104. //выводим ссылки на опросы
  105. $poll = get_poll();
  106. print_polls($poll);
  107.  
  108. if($poll_id=(int)$_GET['poll']) {
  109.   print_poll($poll_id);
  110. }
  111.  
  112. include_once('form.php');
  113. ?>
  114.  


Непонятно как обращаться к элементам форму? например к чекбоксу answer_".$question."_".$answer[0]." если обращаться, то вне функции в этих переменных ничего нет же.., что то не догоняю
9. naruto - 11 Февраля, 2012 - 11:54:52 - перейти к сообщению
Вопрос с выводом решился) Но появился новый, с добавлением. Можно ли одним запросом добавить данные в три таблицы(опроса вопроса и ответов) ну и связать по id?
10. Panoptik - 11 Февраля, 2012 - 12:42:58 - перейти к сообщению
нет. вам каждый раз при добавлении нужно будет узнавать id последней записи. так что у вас будет 3 запроса на добавление и + запросы на узнавание последних id
11. naruto - 12 Февраля, 2012 - 08:57:16 - перейти к сообщению
Сделал форму добавления, все добавляется нормально. Но не получается сделать и непонятно как, чтобы например по кнопке или введя число выводилиось соответсвующее количество текстовых полей для вопроса и так же ответов для них. А пока просто добавляет опрос, к нему один вопрос у которого один ответ
PHP:
скопировать код в буфер обмена
  1.  
  2. <html>
  3. <head>
  4. <title>Добавить</title>
  5. <body>
  6. <form action ='new.php' method ='POST'>
  7. Название опроса
  8. <input type=text name=poll_name  value="<?=$poll_name?>"><br />Выберите тип опроса      <input type=radio name=status value ='active'> Активное         <input type=radio name=status value ='close'> Закрытое  <input type=radio name=status value ='rough'> Черновик <br />Название вопроса
  9.         <input type=text name=que_name value="<?=$que_name?>" > <br />Выберите тип вопроса      <input type=radio name=que_type value = 'radio'> С одним вариантом      <input type=radio name=que_type value = 'chek'> С несколькими вариантами <br />
  10. Варианты ответов
  11.         <input type=text name=ans_name value = "<?=$ans_name?>" >       <input type="submit" value="Добавить" />
  12. </form>
  13. </body>
  14. </head>
  15. </html>
  16. <?PHP
  17. include_once('startup.php');
  18. // Установка параметров, подключение к БД, запуск сессии.
  19. startup();
  20. // Функция Обработка отправки формы.
  21. function add_poll($poll_name, $poll_status, $que_name, $que_type, $ans_name) {
  22.  
  23.         // Подготовка.
  24.         $poll_name = trim($poll_name);
  25.         $que_name = trim($que_name);
  26.         $ans_name = trim($ans_name);
  27.        
  28.         // Запрос.
  29.         $query = "INSERT INTO `poll` (`name`, `status`) VALUES ('$poll_name', '$poll_status')";
  30.         $result = mysql_query($query);
  31.         if (!$result)
  32.                 die(mysql_error());
  33.         $id_p = mysql_insert_id();
  34.         $query = "INSERT INTO `question` (`name`, `type`, `poll_id`) VALUES ('$que_name', '$que_type', '$id_p')";
  35.                 $result = mysql_query($query);
  36.                 $id_q = mysql_insert_id();
  37.                 $query = "INSERT INTO `answer` (`name`, `question_id`, `vote_count`) VALUES ('$ans_name', '$id_q', '0') ";
  38.                 $result = mysql_query($query);
  39.         if (!$result)
  40.                 die(mysql_error());
  41.                
  42.         return true;
  43. }
  44.  
  45. add_poll($_POST['poll_name'], $_POST['status'], $_POST['que_name'], $_POST['que_type'], $_POST['ans_name']);
  46.  
  47. ?>
  48.  
  49.  

 

Powered by ExBB FM 1.0 RC1