• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Baza danych MYSQL, użytkownicy(zalogowani) i głosowanie

Object Storage Arubacloud
0 głosów
718 wizyt
pytanie zadane 7 lutego 2016 w SQL, bazy danych przez Tomasz Hełmecki Początkujący (250 p.)

Witam, 

To będzie mój pierwszy wpis na tym forum, Mirosławowi Zelentowi bardzo dziękuję za filmiki, jak pewnie Wy też.

Próbuję stworzyć stronę, gdzie jest logowanie, to działa, jest login, jest hasło, wpisuję i loguję się. Pojawia się strona, gdzie mam do wyboru sondy, gdzie jak kliknę, to przechodzi do strony gdzie mogę głosować i gdzie są wyniki. Wyniki są w bazie w takiej postaci : sejsa_id, nazwa, za, przeciw. w php jest zakodowane, ze jak sie klika to update bazy, a w bazie jest trigger, wyzwalacz ktory autoincremetuje odpowiednio o 1 głos i to działa. I teraz męczę się już długo na obsługą tego, aby 1 użytkownik mógł raz głosować, aby po prostu np. nie wyświetlały mu się te sondy w których już głosował. Zrobiłem tabelę history_vote gdzie jest vote_id, user_id, session_id, glosza, przeciw. Mam taki kod co nie dziala dobrze, bo user_id sie powtarza, najepiej aby user_id byłoby raz, a session_id to aby była tabela. Kurka, natchnienie, moze kolejna tabelę zrobić. Albo jak Wy widzicie system, gdzie jest logowanie i można raz głosować, na zawsze, czyli sesje odpadają. Fragment kodu z pliku php.

$sql="select * from session";
					$result = query($sql);
					while ($tmp=mysqli_fetch_array($result)) 
					{
							if($_GET['session'] == $tmp['session_id']){
								$_SESSION['session_id']=$tmp['session_id'];
								
								$sql2="select * from history_vote where user_id=".$_SESSION['user_id']." ";
								$result2 = query($sql2);	
								while ($tmp2=mysqli_fetch_array($result)) 
								{								
									if(!($_SESSION['session_id']==$tmp2['session_id'] ))
									{
									$www.=	'
									<form class="form-horizontal" method="POST" action="count.php">
										<div class="form-group">
											<div class="col-sm-4 center">
											<div class="col-sm-12 text-center">
											Głosujesz odnośnie ustawy '.$tmp['name'].'. Twój głos to:
													<button type="submit"name="for" class="btn btn-primary form-control">Za</button>  <br><br>
													<button type="submit" name="against" class="btn btn-primary form-control">Przeciw</button> <br>
											</form>
											</div>
										</div>';
									}
								}
						}
					}

 

3 odpowiedzi

+1 głos
odpowiedź 7 lutego 2016 przez Frendom Pasjonat (18,900 p.)
W history_vote sa id osob ktore glosowaly? Jezeli tak, to przed przeslaniem danych z tej sondy robisz warunek, ktory spraedzi czy takie id juz jest w tabeli history_vote. Jezeli tak to wyswietlasz jakis komunikat ze nie mozna glosowac kilka razy, a jak nie to normalnie prztewarzasz te sonde :)
0 głosów
odpowiedź 7 lutego 2016 przez mar3 Gaduła (3,040 p.)

Mam taki kod co nie dziala dobrze, bo user_id sie powtarza

W tabeli history_vote nie powinno się powtarzać user_id. Przecież jeżeli ktoś już zagłosuje to nie pozwalasz ponownie głosować.

Dlaczego potrzebujesz kolumny za oraz przeciw, zamist jednej typu boolean.

komentarz 7 lutego 2016 przez Tomasz Hełmecki Początkujący (250 p.)
Dobra, ale jak się dowiedzieć, że w tej sesji_id już ten user_id głosował? Jak zablokować aby user_id=6, jeśli głosował w sesji_id=8 już więcej nie mógł tak? Jak taka baza ma wyglądać, jaka struktura bazy, jaki diagram.
0 głosów
odpowiedź 7 lutego 2016 przez Tomasz Hełmecki Początkujący (250 p.)
​					$sql="select * from session";
					$result = query($sql);
					while ($tmp=mysqli_fetch_array($result)) 
					{
							if($_GET['session'] == $tmp['session_id']){
								$_SESSION['session_id']=$tmp['session_id'];
								
								$sql2="select * from history_vote where user_id=".$_SESSION['user_id']." AND session_id=".$_SESSION['session_id']." ";
								$result2 = query($sql2);	
								if($tmp2=mysqli_fetch_array($result2)==false) 
								{			
								$row_cnt = $result2->num_rows;							
								$www.=	'
									<form class="form-horizontal" method="POST" action="count.php">
										<div class="form-group">
											<div class="col-sm-4 center">
											<div class="col-sm-12 text-center">
											Głosujesz odnośnie ustawy '.$tmp['name'].'. Twój głos to:
													<button type="submit"name="for" class="btn btn-primary form-control">Za</button>  <br><br>
													<button type="submit" name="against" class="btn btn-primary form-control">Przeciw</button> <br>
											</form>
											</div>
										</div>';									
								}
						}
					}

Czy to jest dobre rozwiązanie? Mogę trzymać w tabeli history_vote każde głosowanie? Dla mnie to jest dobre rozwiązanie, pomaga mi, bo sprawdzam czy jest tam user_id i session_id takie a takie, i jeśli wartość zwraca false to znaczy że nie ma, czyli, żeby się pojawiły te dwa buttony do głosowania, a jeśli wartość jest true to się nie buttony do głosowania nie pojawia. Tylko ta baza history_vote może być bardzo duża w przyszłości, bo tam będzie głosowanie każdego usera przechowywane, każda sesja, każdy głos, ale potem można się za to dostać do tego co było, to moja jedna z pierwszych baz i nie wiem czy mogą być tak wielkie tabele, gdzie spokojnie może być w przyszłość 1000 wierszy, gdzie będą dane : vote_id (inkrementowane) user_id (każde głosowanie x usera) session_id (każda sesja, każda sonda w ktorej bral udzial ten x user), glos za , glos przeciw. 

Przykład:

8,4,2,1,0 - czyli rekord 8, user 4, sesja2 i glos za lub 9,4,3,1,0 podobnie tylko w sesji(sondzie) 3. 

Dzięki tym co się udzielili w wątku.

komentarz 7 lutego 2016 przez Frendom Pasjonat (18,900 p.)
Nie przejmuj sie tym ze twoja baza danych bedzie "puchnac". Kazda baza z biegiem czasu staje sie wielka, w zaleznosci co jest tam przechowywane. Ty trzymasz tylko id, wiec ilosc rekordow nie wplynie na predkosc dzialania bazy
komentarz 7 lutego 2016 przez Tomasz Hełmecki Początkujący (250 p.)
Czyli zostawiam taki rozkład tabel w bazie i próbuję "jechać" dalej

Podobne pytania

–3 głosów
2 odpowiedzi 536 wizyt
pytanie zadane 2 września 2015 w SQL, bazy danych przez DawidxD Użytkownik (810 p.)
0 głosów
2 odpowiedzi 334 wizyt
pytanie zadane 12 lutego 2017 w SQL, bazy danych przez kon.bed21 Obywatel (1,610 p.)
0 głosów
1 odpowiedź 350 wizyt
pytanie zadane 12 listopada 2016 w SQL, bazy danych przez Bless Nowicjusz (160 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...