PHP spreciti unos duplikata odredjenih kolumni u mysql bazu

shone83

Zainteresovan član
Poruka
474
Imam nazive kolumni tipa:

id ime prezime jmbg telefon email sifra ulica broj sufiks napomena

a hocu da zabranim duplikate ako se unese isto ime i prezime u istoj ulici i broju ulice. I takodje, ako se unese ime i prezime bez ulice i broja ali sa istim brojem telefona. Dakle, ove kolumne kad su zajedno ne smeju biti iste:

ime prezime ulica broj
ime prezime telefon

Ako se bilo koja kolumna razlikuje onda da dozvoli.

Za jmbg sam vec odradio ovako i to funkcionise:

Kod:
[/COLOR][COLOR=#757678]if($count_jmbg > 0) {[/COLOR]
[COLOR=#757678]                [/COLOR]
[COLOR=#757678]echo "<script>alert('JMBG već postoji!')</script>";[/COLOR]

[COLOR=#757678]}[/COLOR][COLOR=#000000]

ta fora mi treba i za ovu kombinaciju kolumni.

Vec sam probao da u phpmyadmin stavim te kolumne kao unique i to funkcionise ali ima manu, prazna polja racuna kao identicna tako da kada unesem isto ime i prezime bez adrese on ne dozvoljava, smatra to duplikatom...
 
Moje misljenje (ne mora da znaci da je tacno):
Ako budes radio valdiaciju po tome i svaki cas pitao bazu e jel ima to to i to u toj kombinaciji onda nema leba od te aplikacije, jer ces imati veliki broj upita bez potrebe. Izaberi nesto sto je razlicito za sve i da mora da bude obavezno prilikom unosa. Tipa nemas dva coveka sa istim maticnim brojem, ili email ako postoji nema dalje.
Ovako ces svaki put da pitas bazu e jel ima kombinacija ime prezime ulica broj, nema super a da li ima ime prezime telefon nema super upisuj, ima odbi. Znaci pokusaj da pojednostavis maksimalno ako je moguce.

Imaju uvek na umu KISS - Keep It Simple Stupid :) ili Keep it Simple and Short :)

Edit: A ako vec hcoes da se drzis tog svog resenja onda pravi upita za count za ime prezime ulica broj i telefon nema potrebe da razdvajas ako je veci od nula nema dalje ako nije upisuj kao sto si radioz a jmbg ali mogo bi sve to da objedinis u jedan kveri da ne bi imao jmbg posebno i ovo posebno.
 
Poslednja izmena:
A sta ako je u pitanju jedan ogroman spisak gde moze da se nadje ista osoba sa maticnim, pa onda opet ista bez maticnog. Ili oba puta bez maticnog ali negde sa ulicom i brojem a negde samo sa brojem telefona... Samo su ime i prezime uvek napisami. Kako onda to da resim sto prostije?

Jel imas taj spisak u elektronskoj formi ili na papiru?

Ako te ne mrzi ispisi par redove kako to izgleda (mislim spisak), ali u ovom trenutku mi ne pada nista pametno na pamet.

Mislim kako ti znas da osoba koja ima isto ime i prezime i koja ima samo telefon je ista osoba koja ima samo ime i prezime i maticni broj? Sta je veza?
 
Poslednja izmena:
Nemam u elektronskom formatu, ali sad cu da iskucam da ti pokazem na primeru kako moze da se nadje:

1. papir:

Petar Petrovic 065111222 Petrovska 11
Nikola Nikolic 064222333 Nikolina 22
Ivana Ivanovic 066444555 Ivanova 33
Marko Markovic 069555444 [ne pise adresa]

2. papir:

Petar Petrovic 064888999 [ne pise adresa]
Petar Petrovic 065111222[ne pise adresa]
Ivana Ivanovic [ne pise telefon] Ivanova 33
Marko Markovic 069111222 [ne pise adresa]

Ako se posle prvog ukucava drugi papir trebalo bi da prodje samo prvi Petar Petrovic, drugi ne jer ima isti broj kao ovaj na prvom papiru. Ivana je takodje ista po adresi. Ali, da dozvoli da oba Marka Markovic ubaci jer se po broju vidi da nije isti, a da ne racuna to sto nema adresu kao da je to ista adresa. Razumes?
 
Poslednja izmena:
Nemam u elektronskom formatu, ali sad cu da iskucam da ti pokazem na primeru kako moze da se nadje:

1. papir:

Petar Petrovic 065111222 Petrovska 11
Nikola Nikolic 064222333 Nikolina 22
Ivana Ivanovic 066444555 Ivanova 33

2. papir:

Petar Petrovic 064888999 [ne pise adresa]
Petar Petrovic 065111222[ne pise adresa]
Ivana Ivanovic [ne pise telefon] Ivanova 33

Ako se posle prvog ukucava drugi papir trebalo bi da prodje samo prvi Petar Petrovic, drugi ne jer ima isti broj kao ovaj na prvom papiru. Ivana je takodje ista po adresi. Razumes?

Ocekivo sam bar jedan broj 555 333 al ajd :)
Ako imas ime prezime i adresu uradi count po tome, ako imas ime prezime i telefon uradi count po tome, koristi podatke koje imas da ne bi ponavljao upite. Znaci imas ime prezime tel pretrazujes po tome, imas ime prezime adresu pretrazujes po tome.
Neko magicno resenje sa strane MySQL-a mislim da ne postoji za ovaj tvoj slucaj, posto kao sto si rekao ne mozes da koristis unique vrednosti.
E sad sto se tice implementacije u phpu tu bas ne mogu da pomognem :)
 
To i meni izlazi kad guglam, npr citam ovde:
http://stackoverflow.com/questions/11303568/mysql-unique-index-except-empty-or-null

ali, zar nece onda da ispisuje nulu u bazi ukoliko nista ne ukucam u polje? Tako mi je bar radilo pre kada sam eksperimentisao u vezi necega drugog...

Da hoce ali ti ionako nemas vrednost u tom polju, mislim da ti onda ne bi izbacivao gresku koju si opisao u pcoetku, i da postoji sansa da ce da radi to sto ti treba. Svakako ne skodi da probas.
 
Mozes da probas da napises trigger ako hoces da postignes zeljeno ponasanje koje ti MySql ne omogucava.
Pokusaj da tu jedinstvenost razresis sa trigerom, a na ta polja nad kojima ce se cesto izvrsavati pretraga stavi kompozitni indeks.

Verovatno nije najsrecnije resenje, ali nista drugo mi ne pada na pamet. :)

EDIT:

Uvek mozes da handlujes i u PHP-u to.
 
Poslednja izmena:
Pa, ukoliko nema neko drugo resenje tj. da ne stoje ruzne nule bez potrebe onda cu probati :) eksperimentisem sutra pa javljam da li radi. Ako neko zna neko elegantnije resenje neka napise...

Nisam zaboravio da javim da li je uspelo, samo sam pronasao logicku gresku u kodu koju nikako da ispravim a mozda se tice i ovoga dela. Kad to ispravim, ako ispravim javljam da li je ovo uspelo :)
 
Rucno je kad neko sjedi i kuca i submit radi, a preko fajla je npr ako to imas u txt fajlu i ucitavas preko PHP (file_get_contents() ili file() potrazi na php.net). Ako te dobro shvatam posmatras sledece kolone:

IME | PREZIME | BROJ_TELEFONA | ADRESA | JMBG

Onako kako bih to ja uradio je:

1. usmjeravanje daljeg toka preko php tako sto cemo odrediti query za ispitivanje duplikata(naravno nakon submita forme, pretpostavljam POST metod) u odnosu na to sta je unijeto:

a) ime, prezime, broj telefona, adresa, jmbg odnosno sve kolone popunjene

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and adresa = $_POST['adresa'] and jmbg = $_POST['jmbg']

*ovo je samo sablon, kod ocigledno nije validan sql niti je testiran, takodje input nije saniran citaj

b) ime, prezime, adresa, jmbg odnosno sve kolone osim broja telefona

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and adresa = $_POST['adresa'] and jmbg = $_POST['jmbg']

c) ime, prezime, broj telefona, jmbg odnosno sve kolone osim adrese

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and jmbg = $_POST['jmbg']

d) ime, prezime, jmbg

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and jmbg = $_POST['jmbg']

------ ako je JMBG opcionalna kolona onda postoje i ove mogucnosti

e) ime, prezime, broj telefona, adresa

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and adresa = $_POST['adresa']

f) ime, prezime, broj telefona

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona']

g) ime, prezime, adresa

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and adresa = $_POST['adresa']

------ sve naveden stvari mozes ubaciti u switch

2. nakon odradjenog upita preko ugradjene funkcije u zavisnosti od toga sta koristis mysqli/PDO ispitaj da li postoji taj rezultat ili ne (npr. mysql_num_rows($result) > 0)

Nadam se da ce te ovo odvesti do rijesenja. Mozda sam nesto previdio ali otprilike ovo je nacin kako se to radi. Ne mozes znati da li postoji taj korisnik u bazi ako ne upitas bazu :D

Takodje bih ti savjetovao da povedes racuna o sigurnosti te skripte koju pravis.
 
Rucno je kad neko sjedi i kuca i submit radi, a preko fajla je npr ako to imas u txt fajlu i ucitavas preko PHP (file_get_contents() ili file() potrazi na php.net). Ako te dobro shvatam posmatras sledece kolone:

IME | PREZIME | BROJ_TELEFONA | ADRESA | JMBG

Onako kako bih to ja uradio je:

1. usmjeravanje daljeg toka preko php tako sto cemo odrediti query za ispitivanje duplikata(naravno nakon submita forme, pretpostavljam POST metod) u odnosu na to sta je unijeto:

a) ime, prezime, broj telefona, adresa, jmbg odnosno sve kolone popunjene

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and adresa = $_POST['adresa'] and jmbg = $_POST['jmbg']

*ovo je samo sablon, kod ocigledno nije validan sql niti je testiran, takodje input nije saniran citaj

b) ime, prezime, adresa, jmbg odnosno sve kolone osim broja telefona

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and adresa = $_POST['adresa'] and jmbg = $_POST['jmbg']

c) ime, prezime, broj telefona, jmbg odnosno sve kolone osim adrese

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and jmbg = $_POST['jmbg']

d) ime, prezime, jmbg

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and jmbg = $_POST['jmbg']

------ ako je JMBG opcionalna kolona onda postoje i ove mogucnosti

e) ime, prezime, broj telefona, adresa

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona'] and adresa = $_POST['adresa']

f) ime, prezime, broj telefona

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and broj_telefona = $_POST['broj_telefona']

g) ime, prezime, adresa

SELECT * FROM korisnici WHERE ime = $_POST['ime'] and prezime = $_POST['prezime'] and adresa = $_POST['adresa']

------ sve naveden stvari mozes ubaciti u switch

2. nakon odradjenog upita preko ugradjene funkcije u zavisnosti od toga sta koristis mysqli/PDO ispitaj da li postoji taj rezultat ili ne (npr. mysql_num_rows($result) > 0)

Nadam se da ce te ovo odvesti do rijesenja. Mozda sam nesto previdio ali otprilike ovo je nacin kako se to radi. Ne mozes znati da li postoji taj korisnik u bazi ako ne upitas bazu :D

Takodje bih ti savjetovao da povedes racuna o sigurnosti te skripte koju pravis.

Gde se tako radi?


Jesi procitao prethodne postove?
 
Ja sam napisao odlicno rijesenje a ti si istakao neke nebitne cinjenice. Covjek je fino napisao da postoji nekoliko mogucnosti. Valjda nije glup da ne zna da moze samo preko JMBG odraditi validaciju. Ako je istakao da provjerava JMBG ali treba da provjeri jos nesto onda to znaci da je mozda JMBG opcionalan.

Ti si rekao da posalje upit gdje provjerava jednu kolonu a ja sam rekao da posalje upit gdje ce provjeriti po odredjenim vrijednostima sto znaci da ce raditi savrseno.

Brzina nije bitna a ne vjerujem da ce neko unijeti 1 000 000 korisnika u tabelu mada ni to nece predstavljati problem.

Pitanje za tebe Red_Zmaja: da li uopste poznajes mysql bazu podataka?
 
Ja sam napisao odlicno rijesenje a ti si istakao neke nebitne cinjenice. Covjek je fino napisao da postoji nekoliko mogucnosti. Valjda nije glup da ne zna da moze samo preko JMBG odraditi validaciju. Ako je istakao da provjerava JMBG ali treba da provjeri jos nesto onda to znaci da je mozda JMBG opcionalan.

Ti si rekao da posalje upit gdje provjerava jednu kolonu a ja sam rekao da posalje upit gdje ce provjeriti po odredjenim vrijednostima sto znaci da ce raditi savrseno.

Brzina nije bitna a ne vjerujem da ce neko unijeti 1 000 000 korisnika u tabelu mada ni to nece predstavljati problem.

Pitanje za tebe Red_Zmaja: da li uopste poznajes mysql bazu podataka?

Ne poznajem MySQL. A moze i na papiru da drzi i da ganja tako po potrebi.
 
Razumijem te vrlo dobro o cemu govoris, ali nas postavljac teme ima za primary key neki nebitan id u ovom slucaju najvjerovatnije. Najlakse rijesenje je da se korisnici vode po JMBG ili broju telefona ali da je tako onda ovog pitanja vjerovatno ne bi bilo...Ako ulogu igra vise kolona kao sto sam ja pretpostavio kod sebe u rijesenju onda je to to...u svakom drugom slucaju bilo bi besmisleno postavljati pitanje :D

shone mora da odradi upit za nekoliko kolona da bi provjerio da li je taj unos duplikat...ono sto sam ja gore napisao provjerava prvo sta je uneseno i zatim na osnovu toga formira upit koji cemo slati u bazu, a baza ce nam na osnovu toga odgovoriti sa selektovanim redom ili ne...zatim provjerimo da li je postojao red preko mysqli_num_rows i to je to...ako postoji red nemoj upisivati a ako ne postoji upisi
 

Back
Top