content top

Intreaba-ma: Sistem de votare pentru o lista de obiecte

Intreaba-ma: Sistem de votare pentru o lista de obiecte

O sa vedem in acest articol un exemplu rapid pentru rezolvarea unei probleme cu care m-a abordat un cititor. Sa vedem despre ce este vorba.

Avem o lista de elemente, sa zicem melodii, ordonate dupa note. In dreptul fiecarei melodii utilizatorul are posibilitatea sa dea o nota pentru a o ridica in clasament. Dupa vot, trebuie sa fim redirectati inapoi la lista ordonata dupa noile note.

O sa rezolvam aceasta problema in cativa pasi simpli, pentru ca lucrurile sa fie cat mai clare. Pentru ca exemplul sa fie complet, eu am sa includ si fisierul care defineste baza de date cu care vom lucra.

Sa vedem, deci, cum arata structura bazei de date:

CREATE DATABASE music_test;

USE music_test;

CREATE TABLE song
(
	id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(64) NOT NULL,
	rating INT NOT NULL
);

INSERT INTO song(name, rating) VALUES('Calexico - Pepita', 0);
INSERT INTO song(name, rating) VALUES('Clannad - I Will Find You', 0);
INSERT INTO song(name, rating) VALUES('Sven Van Hees - Flute Salad', 0);
INSERT INTO song(name, rating) VALUES('M.O.P. - Cold As Ice', 0);
INSERT INTO song(name, rating) VALUES('Gloria Gaynor - I Love You Baby', 0);
INSERT INTO song(name, rating) VALUES('Queen - Love of My Life', 0);
INSERT INTO song(name, rating) VALUES('Sally Oldfield - Mirror', 0);
INSERT INTO song(name, rating) VALUES('Linkin Park - Somewhere I Belong', 0);
INSERT INTO song(name, rating) VALUES('Holograf - Viata Are Gust', 0);
INSERT INTO song(name, rating) VALUES('Joey Diggs - Always Coca-Cola', 0);
INSERT INTO song(name, rating) VALUES('Mission Belle - Just What I Want', 0);
INSERT INTO song(name, rating) VALUES('Dj Bobo - Chihuahua', 0);

Dupa cum se vede, avem o tabela simpla in care tinem un id (pentru identificare unica), un nume si nota pe care a primit-o melodia. Observati ca toate melodiile pleaca de la nota zero.

Sa vedem acum fisierul index.php unde vom afisa melodiile si de unde utilizatorii vor putea vota

<!DOCTYPE html>
<html>

<head>
	<title>Lista melodii</title>
	<style type="text/css">
		body {
			font-family: sans-serif;
			font-size: 13px;
			color: #000;
		}

		table tr td {
			padding: 3px;
		}

		#wrapper {
			width: 304px;
			padding: 15px;
			border: 1px solid #CCC;
			margin: auto;
		}
	</style>
</head>

<body>
	<div id="wrapper">
		<form method="post" action="save.php">
			<?php include("table.php"); ?>
			<div style="text-align: right; margin: 0px; padding: 0px">
				<input type="submit" value="Voteaza" />
			</div>
		</form>
	</div>
</body>

</html>

Este o structura HMTL simpla, dar o scriem intr-un fisier cu extensia .php pentru a putea diviza putin codul. Astfel, observati ca includem la un moment dat fisierul table.php. Sa vedem cum arata el si ce face:

Read More

Depistarea duplicatelor dintr-o baza de date

Depistarea duplicatelor dintr-o baza de date

M-am lovit de cateva ori de aceasta problema si de fiecare data cautam pe internet solutia si o foloseam ca atare. Dar dupa ce am Googleit a treia oara aceeasi chestie, m-am gandit ca ar fi timpul sa inteleg ce se afla in spatele acestui algoritm.

Vorbesc bineinteles despre acea mica interogare cu ajutorul careia identificam inregistrarile duplicat dintr-o baza de date.

Sa zicem ca avem o tabela in care tinem adrese de email si vrem sa vedem daca avem duplicate. Vom pleca de la premisa ca tabela respectiva are o structura de genul urmator:

CREATE TABLE user
(
	id INT NOT NULL PRIMAY KEY,
	username VARCHAR(64) NOT NULL,
	password VARCHAR(32) NOT NULL,
	first_name VARCHAR(64),
	last_name VARCHAR(64)
);

In tabela de mai sus, campul username este cel care tine adresa de email. In cazul in care va intrebati, campul password are 32 de carctere pentru ca parola va fi criptata md5.

Deci, cum facem sa vedem daca avem aceeasi adresa de email de mai multe ori in aceasta tabela? Interogarea va arata asa:

SELECT
	u.username,
	count(u.username) AS cnt
FROM
	user u
GROUP BY
	u.username
HAVING
	cnt > 1
;

Astfel, aflam care din adresele de email se gasesc de mai multe ori in baza de date. Odata ce avem aceasta informatie, putem sa facem o cautare dupa respectivele adrese de email si sa investigam duplicatele.

Dar putem face chiar mai mult. Poate vrem sa vedem, de exemplu cine s-a inscris de mai multe ori folosind acleasi nume si aceeasi adresa de email. Pentru acest lucru, vom modifica interogarea astfel:

SELECT
	u.first_name,
	u.last_name,
	u.username,
	count(u.username) AS cnt
FROM
	user u
GROUP BY
	u.username,
	u.first_name,
	u.last_name
HAVING
	cnt > 1
;

Acest tip de interogare poate fi foarte util in anumite situatii. De asemenea, se pot face niste statistici interesante. Putem afla de exemplu, cati utilizatori au ales aceeasi parola atunci cand s-au inscris. Nu vom vedea parola aleasa, pentru ca este criptata, dar cel putin stim cati utilizatori folosesc parole foarte comune…

SELECT
	u.password,
	count(u.password) AS cnt
FROM
	user u
GROUP BY
	u.password
HAVING
	cnt > 1
;

Cam asta este ideea de baza in aflarea duplicateolr din baza de date. Evident,  in functie de situatie, putem sa rafinam cautarea si sa filtram cateva rezultate folosind si un WHERE in interogarea noastra. Dar despre acest lucru vom vorbi poate, intr-un articol viitor.

Read More
content top
  • RSS
  • Twitter
  • Tumblr
  • Facebook