ugrás a tartalomhoz

Egyedi sorok beszúrása ellenőrzéssel

csaba86 · 2011. Jan. 20. (Cs), 11.24
Sziasztok!

Van egy űrlap, a felhasználó adatokat küld be rajta keresztül.
Szeretném valahogy elkerülni azt, hogy egyet kétszer is beszúrhasson az adatbázisba, így unique tulajdonságot adtam a mezőnek. Egyszerre több sort is szeretnék beszúrni, de ha talál egy már létezőt akkor leáll a folyamat.

Eddig ezt a megoldást találtam, működik is, de szeretnék érdeklődni, hogy létezik-e szebb, okosabb, gyorsabb megoldása is ennek?
  1. mysql_query('INSERT ...');  
  2. if (mysql_errno() == 1062) {  
  3.     echo 'Dupla!';  
  4. }  
Köszönöm a segítségeteket!
 
1

Szeretném valahogy elkerülni

kuka · 2011. Jan. 20. (Cs), 12.30
Szeretném valahogy elkerülni azt, hogy egyet kétszer is beszúrhasson az adatbázisba, így unique tulajdonságot adtam a mezőnek.
Ez így rosszul hangzik, bár így, hogy nem tudjuk
  • miféle adatokról van szó
  • milyen mezői vannak a táblának
  • mely mező unique
nem lehet pontosabb véleményt kialakítani.

Általában session+egyedi szám segítségével oldják meg:
  • amikor az űrlapot generálod gondolsz egy véletlen és egyedi számra majd a számot beírod az űrlapba egy hidden mezőbe és elmented a sessionba
  • amikor az űrlapot beküldik összeveted a hidden mezőben levő egyedi számot a sessionbelivel, majd törlöd a sessionból
Így ha az űrlapot többször küldik be, a második és további próbálkozásokat a PHP elveti, mert a hidden mezőben megmaradt a régi egyedi szám, de a sessionban már nincs.

Természetesen kérdés, hogy az űrlap többszöri kitöltése ugyanazokkal az adatokkal duplázásnak számít, vagy nem. De ez már a logikai rész, amiben csak az dönthet aki ismeri az illető adatok mibenlétét.
2

Valóban, így nehezen érthető

csaba86 · 2011. Jan. 20. (Cs), 12.51
Valóban, így nehezen érthető volt, bocsánat.

Konkrét feladat egy része: Szeretnénk email címeket tárolni adatbázisban. (Persze nem spamelés céljából). Egy szövegmezőt használva erre, akár egy, akár száz email címet is feltudjunk tölteni. Ezt a részt már megvalósítottam, a problémám az, hogy ha létezik már az adott email cím az adatbázisban, akkor elszáll, nem tudja folytatni a többivel.
Egyesével ellenőrizni, hogy szerepel-e már szerintem nem egy szép megoldás, inkább egysével insertelem őket, csak valahogy kellene tudnom, hogy melyik email szerepelt már.

Itt a tábla egyszerűsített verziója amivel tesztelem.
  1. CREATE TABLE `emailek` (  
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `email` varchar(255),  
  4.   PRIMARY KEY (`id`),  
  5.   UNIQUE KEY `email` (`email`)  
  6. ) ENGINE=MyISAM;  
3

Így már más. Így tényleg kell

kuka · 2011. Jan. 20. (Cs), 13.30
Így már más. Így tényleg kell az unique. Bár az ellenőrzést nem muszáj rábízni. Az módszer függhet az egyszerre kapott adatmennyiségtől és az adatküldés sűrűségétől, de itt egy alternatíva:
  • benyomod az összes kapott e-mail címet egy időszakos táblába
  • az emailek táblába átmásolod azokat amelyek még nincsenek benne
  • az időszakos táblából törlöd a feldolgozottakat
Az első és második lépés között lehetnek más lépések, például ellenőrzés tiltólistából.
A lépések között lehet késleltetés, például ha úgyis csak éjfélkor van e-mail küldés, akkor bőven elég csak előtte végezni az átömlesztést.

De az az érzésem, hogy én valószínűleg az egyenkénti select + insert páros ellenőrzést választanám. Nem hinném, hogy érdemes volna bonyolítani.
4

Tetszik az ötleted, de jó ha

csaba86 · 2011. Jan. 20. (Cs), 13.54
Tetszik az ötleted, de jó ha minél hamarabb bekerülnek a címek a végleges helyükre, így a select + insert párost választom én is. Köszönöm szépen a tanácsot!