[PHP][MySQL] Ankieta z wykorzystaniem php i mysql

0

Witam

Potrzebuje na zaliczenie zrobić ankietę, która będzie zapisywała wyniki w bazie danych MySQL. Proszę Was o pomoc (wystarczy mi mały przykład, tak żeby zobaczył o co chodzi, resztę sam dorobię i zmodyfikuje).

Największe problemy ma z wysłaniem jej do bazy danych MySQL (na serwerze lub w pliku).
Tzn. po stronie klienta ankieta (jedno pytanie i wpisana odpowiedz) w pliku .html lub .php (tak żeby przeglądarka to czytała), wysyła dane do bazy danych MySQL (na serwerze lub w pliku) i tam są magazynowane wyniki.

Baza danych może być w pliku lub na jakimś serwerze (abym tylko miał kod źródłowy). Ankiecie tylko jedno pytanie i możliwość wpisania odpowiedzi (jak już to zobaczę to będę wiedział jak dorobić resztę i to modyfikować).

Proszę o wyrozumiałość, jestem początkującym informatykiem i potrzebuje tego na szybkości.

0

Znalazłem to co potrzebuje http://4programmers.net/PHP/Sonda_na_bazie_danych , ale nie mogę tego uruchomić, nie wiem co źle robię. Pewnie jest to banalne, ale nie dla laika.

Wykorzystuje bazę danych 5.1.42, skonfigurowana jako Developer Machine (tzn. łącze się z nią podając tylko hasło "123456", uruchomiając z "C:\Program Files\MySQL\MySQL Server 5.1\bin").

Pierwszy krok:

Tworzę bazę danych.

create database sonda;
use sonda;

CREATE TABLE poll_questions (
  id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  date_add datetime NOT NULL,
  date_begin datetime NOT NULL,
  date_end datetime NOT NULL,
  stop int NOT NULL DEFAULT 0
);

CREATE TABLE poll_answers (
  id_answer int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  id_poll int NOT NULL,
  answer varchar(255) NOT NULL,
  votes int NOT NULL DEFAULT 0
);

następnie dodaje do bazy danych pytanie i odpowiedzi:

INSERT INTO poll_questions VALUES(
  '',
  'Twój ulubiony język programowania?',
  now(),
  now(),
  '2020-03-01',
  0
);
INSERT INTO poll_answers VALUES('', 1, 'C/C++', 0);
INSERT INTO poll_answers VALUES('', 1, 'Java', 0);
INSERT INTO poll_answers VALUES('', 1, 'PHP', 0);
INSERT INTO poll_answers VALUES('', 1, 'Python', 0);
INSERT INTO poll_answers VALUES('', 1, 'Inny', 0);

Drugi krok:

Następnie robię 1 plik:

index.php

<!DOCTYPE html 
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head>
</head>
<body>



<?php

error_reporting(E_ALL ~ E_NOTICE);

class Database {
     public function __construct() {
          mysql_connect('localhost', 'root', '123456');
          mysql_select_db('sonda');
     }

     public function query($sql) {
          return mysql_query($sql);
     }

     public function numrows($sql) {
          return mysql_num_rows($sql);
     }

     public function fetch($sql) {
          return mysql_fetch_array($sql);
     }
}

$db = new Database;

class Poll {
     public $db;
     public $other = true; // czy pokazywac inne sondy
     public $desc_sort = true; // sortowanie innych sond od najnowszych
     public $id; // id sondy
     public $new_fields = array(); // funkcje z nowy polami do formularza
     public $no_add = false; // nie dodawac (np. ktoras z funkcji z $new_fields mowi, ze dane niepoprawne)

     public function __construct()
     {
          $this->db = new Database();
     }

     public function display()
     {
          $sql = $this->db->query('SELECT
                    q.id, q.title, q.date_begin, q.date_end, q.stop,
                    a.id_answer, a.answer, a.votes,
                    (SELECT sum(votes) FROM poll_answers WHERE id_poll = q.id GROUP BY id_poll) as sum
                  FROM
                    poll_questions as q, poll_answers as a
                  WHERE
                    q.id = a.id_poll AND q.id = ' .
                    (!isset($_GET['id']) ? '(SELECT max(id) FROM poll_questions)' : (int)$_GET['id']));

          if($this->db->numrows($sql) > 0)
          {
               $now = date('Y-m-d');
               while($row = $this->db->fetch($sql))
               {
                    if($_POST['vote'] && !$this->no_add)
                    {
                         $row['sum']++;
                         if($row['id_answer'] == $_POST['vote']) $row['votes']++;
                    }
                   
                    if(!$b)
                    {
                         $this->id = $row['id'];
                         if($row['stop'] == 1 || $_POST['vote'] && !$this->no_add) $noform = true;

                         // podstawowe dane o ankiecie
                         $ret .= '<b>' . $row['title'] . '</b><p />Łącznie oddano głosów: ' . $row['sum'].
                              '<br />Data rozpoczęcia: ' . $row['date_begin'] .
                              '<br />Data zakończenia: ' . $row['date_end'];
                         
                         if($row['date_end'] <= $now) $ret .= '<p />Ankieta się już zakończyła.';
                         elseif($row['stop'] == 1) $ret .= '<p />Glosowanie w ankiecie zostało wstrzymane.';

                         $ret .= '<p />';

                         // wyswietlenie formularza
                         if(!isset($_COOKIE['poll' . $this->id]) && $row['date_end'] > $now && !$noform)
                         {
                              $ret .= '<form action="" method="post">';
                              foreach($this->new_fields as $v) $ret .= $v;
                              $form = true;
                         } elseif(isset($_COOKIE['poll' . $this->id]) && $row['date_end'] > $now && !$noform)
                         {
                              $ret .= 'Głosowałeś już w tej sondzie.<p />';
                         }

                         // user zaglosowal
                         if($_POST['vote'] && !$this->no_add)
                         {
                              $ret .= 'Twój głos został dodany.<p />';
                              if(!isset($_COOKIE['poll' . $this->id]))
                              {
                                   $this->db->query('UPDATE poll_answers SET votes=votes+1 WHERE id_answer='.$_POST['vote']);
                                   setcookie('poll' . $this->id, $this->id, time()+3600 * 3600 * 30); // 22 lata
                              }
                              $noform = true;
                         }
                         $b = true;
                    }

                    // wyswietlenie wariantow odpowiedzi
                    if($form)
                         $ret .= '<input type="radio" name="vote" value="' . $row['id_answer'] . '" /> ' .
                              $row['answer'] . '<br />';
                    else
                    {
                         $ret .= $row['answer'].', ' . $row['votes'] . ' glosow, ' .
                              ($row['sum'] > 0 ? round($row['votes']*100/$row['sum']) : 0) . '% ' .
                              '<div style="background: red; height: 10px; width: ' .
                              ($row['votes'] == 0 || $row['sum'] == 0 ? 5 : round($row['votes'] * 200 / $row['sum'])) .
                              'px"></div><br />';
                    }
               }
               if($form) $ret .= '<br /><input type="submit" name="submit" value="Głosuj!" /></form>';
               if($this->other) $ret .= '<p /><b>Inne sondy</b><p />' . $this->other($this->id);
          }
          else $ret = 'Nie ma takiej sondy w bazie.';
          return $ret;
     }

     public function other($id)
     {
          $sql = 'SELECT id, title FROM poll_questions WHERE id <> ' . $id . ' ORDER BY id ' . ($this->desc_sort ? 'DESC' : 'ASC');
          $sql = $this->db->query($sql);
          if($this->db->numrows($sql) > 0)
          {
               $ret = '<ul>';
               while($row = $this->db->fetch($sql))
                    $ret .= '<li><a href="' .$_SERVER['PHP_SELF'] . '?id=' . $row['id'] . '">' . $row['title'] . '</a></li>';
               return $ret . '</ul>';
          }
          else return '(brak)';
     }
}

$poll = new Poll;
echo $poll->display();

?>

</body>
</html>

Co trzeba poprawić ?

0

Zrobiłem kilka poprawek. Proszę o ocenę tego czy czegoś nie brakuje kodu, pliku, innej nazwy pliku itp.

Nie mam możliwości tego uruchomienia w domowych warunkach (ponieważ potrzebny jest serwer z apache, php, mysql). Dlatego chciałbym mieć to rozpisane, a potem będę miał 1 dzień na uruchomienie tego i zrobieniu kilku modyfikacji...

0

w domowych warunkach

Jak to nie?

0

najprościej wamp :-D

0

Zagłosowałem raz, drugi raz nie mogę bo zapamiętało ip. Ale coś jest nie tak, wszystkiego nie wyświetla.

Wyskakują mi (oprócz sondy) następujące błędy:

Notice: Undefined index: vote in C:\wamp\www\sonda\index.php on line 65

Notice: Undefined variable: b in C:\wamp\www\sonda\index.php on line 71

Notice: Undefined index: vote in C:\wamp\www\sonda\index.php on line 74

Notice: Undefined variable: ret in C:\wamp\www\sonda\index.php on line 79

Notice: Undefined variable: noform in C:\wamp\www\sonda\index.php on line 92

Notice: Undefined index: vote in C:\wamp\www\sonda\index.php on line 98

Notice: Undefined variable: form in C:\wamp\www\sonda\index.php on line 113

Notice: Undefined index: vote in C:\wamp\www\sonda\index.php on line 65

Notice: Undefined variable: form in C:\wamp\www\sonda\index.php on line 113

Notice: Undefined index: vote in C:\wamp\www\sonda\index.php on line 65

Notice: Undefined variable: form in C:\wamp\www\sonda\index.php on line 113

Notice: Undefined index: vote in C:\wamp\www\sonda\index.php on line 65

Notice: Undefined variable: form in C:\wamp\www\sonda\index.php on line 113

Notice: Undefined index: vote in C:\wamp\www\sonda\index.php on line 65

Notice: Undefined variable: form in C:\wamp\www\sonda\index.php on line 113

Notice: Undefined variable: form in C:\wamp\www\sonda\index.php on line 124
Tw˘j ulubiony jŠzyk programowania?

Łšcznie oddano głosów: 1
Data rozpoczęcia: 2010-01-22 18:22:47
Data zakończenia: 2020-03-01 00:00:00

Głosowałe� już w tej sondzie.

C/C++, 0 glosow, 0%

Java, 1 glosow, 100%

PHP, 0 glosow, 0%

Python, 0 glosow, 0%

Inny, 0 glosow, 0%

Inne sondy

(brak) 

Co jest jeszcze żle w kodzie ? Może ten drugi plik jest żle zrobiony ?

Zdjecie: user image

0
error_reporting(E_ALL ~ E_NOTICE);
0

Nie chciało mi się przeglądać całego, bo nie ponumerowałeś linie kodu, ale np. ta linijka:
if(!$b)
gdzie wcześniej jest zdefiniowany $b ? a później błędy same lecą :-P

0

Ok, już to uruchomiłem, wszystko działa tak jak trzeba. Dziękuje wszystkim za pomoc i wyrozumiałość, szczególnie koledze Coldpeer.

Mam jeszcze dwie ostatnie prośby.

Jak zrobić polskie litery w tej ankiecie ?

Jak zrobić, żeby wyniki nie były pokazywane na głównej stronie (to co zaznaczone na niebiesko na zdjęciu), tyko wysyłało wyniki do oddzielnego pliku na serwerze np. .txt (czy coś takiego, jak można) ?

Zdjęcie:

user image

0

Polskie znaki?
Między <head>, a </head> wrzucasz:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

I pierwsze zapytanie jakie wykonujesz po połączeniu do bazy to:

mysql_query('SET NAMES utf8');

Ofc plik też wypada zakodować w UTF-8 (z tym sobie poradzi Notepad++)

Wysyłanie wyników na serwer możesz obsłużyć albo przez FTP, albo przykładowo stworzyć sobie jakieś API na drugim serwerze działające na tej zasadzie:

  1. [Serwer A] Użytkownik odznacza jakąś opcję w ankiecie i wysyła formularz
  2. [Serwer A] Dane są przetwarzane i serwer łączy się (przykładowo funkcją file_get_contents()) z serwerem B podając: http://serwerB.pl/ankieta.php?opcja=B
  3. [Serwer B] Odbiera te dane przez skrypt ankieta.php i zapisuje sobie w bazie

Można wiele bajerować, jeszcze co do FTP to można użyć ftp_open.

0

Dziękuje za pomoc, polskie znaki działają. Co do zapisywania wyników to kiedy indziej pokobinuje, bo nie bedzie to takie proste. A teraz mam ważniejsze pytanie/prośbę.
Dzisiaj zauważyłem, że jak dodaje drugie pytanie i do tego odpowiedzi(id_poll = 2). To wyświetla mi się nowa sonda (mam do wyboru dwie sondy). Moje pytanie to:

Jak zrobić żeby w jednej sondzie były 3 pytania i do tego odpowiedzi (wtedy będzie to już ankieta, czyli to o co mi chodzi od początku) ?

Przepuszczam, że bedzie trzeba zrobić od nowa dwie tabele (poll_questions & poll_answers) i do tego nowe zapytania ? Czy mógłby mi ktoś to napisać ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1