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?

mysql_query('INSERT ...');
if (mysql_errno() == 1062) {
    echo 'Dupla!';
}
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.

CREATE TABLE `emailek` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255),
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) 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!