05. marts 2002 - 19:12Der er
30 kommentarer og 1 løsning
Undgå dobbeltposter i tabel!
Hej eksperter
Jeg har en gæstebog, hvor folk kan skrive beskeder (...det er jo, hvad man kan i en gæstebog...)
Mit problem er at folk nogle gange kommer til at poste den samme besked flere gange - derfor vil jeg gerne have ændret den sql-sætning som indsætter beskeden i databasen!
er fuldstændig identisk med en allerede eksisterende post, vil den ikke blive indsat i tabellen!
Udover disse felter har jeg et unikt id, samt et timestamp i tabellen - derfor vil poster der er identiske på ovenstående felter stadig være forskellige på disse to felter!
Jeg har selv eksperimenteret med noget REPLACE INTO med nogle WHERE betingelser, men har ikke haft held med det...
$tjek = mysql_query("SELECT id FROM tabelnavn WHERE gst_name = '$gst_name' AND gst_email = '$gst_email'AND gst_country = '$gst_country' AND gst_homepage ='$gst_homepage' AND gst_message='$gst_message'");
Er det ikke fordi brugerne trykker flere gange på submit-knappen? I så fald har jeg et lille JavaScript, som får submit-knappen til at forsvinde og istedet skrive eks. "vent venligst mens der skrives i gæstebogen"...
der er da intet galt, men først en select og så en insert intet galt - man kunne også delete og så indsætte - de er begge to funktioner - update er da kun en - men som sagt den anden er lige så god, måske langsommere.
Du kan jo ikke update en row i tabellen som ikke er der. Den vi lavede tjekker om den allerede findes i tabel og vis den ikke gør oprettes den, og vis den gør så får brugeren en fejl melding.
Hvorfor er der dog ingen, som foreslår "tipsen" at lave et unikt index på hans tabel ???
Skal kun gøres een gang (evt. ved oprettelse af tabellen) og styrer netop udenom hans problem... det vil sige at det er MySQL som styrer og ikke al mulig kodning...
"Udover disse felter har jeg et unikt id, samt et timestamp i tabellen - derfor vil poster der er identiske på ovenstående felter stadig være forskellige på disse to felter!"
>fri-hash: Man kan sagtens have FLERE unikke index'er i en tabel... og dette er netop idéen med indexfiler.
Det skal jo være muligt at sige: (alt sammen vedr. samme tabel) 1) Jeg vil give mine kunder et unikt kundenummer (Unik nøgle-værdi) 2) Jeg vil kun have kunder med unikt telefonnummer (Unikt index på 1 felt) 3) Jeg vil max have 1 kunde pr. gade i hver by. (Unikt index på flere felter)
Dette "lægges ind" i MySQL, så man ikke selv skal kode sig uden om ovenstående forhindringer, men at databasemotoren tager sig af det...
NB: Mht. de sidste 3 options, er jeg ikke 100% klar over hvad de gør, så det kan godt være lidt tåbeligt - så skal i være velkomne til at fortælle det!
Til alle: Når man har submittet formen, bliver den ikke vist på det efterfølgende billede - dvs. man kan kun submitte den igen, ved at vælge Refresh/Opdater i browseren! Hvis der stadig er tvivl, kan gæstebogen ses på www.tommyipsen.dk !
snigermunken/frihash: Den metode i foreslog fungerer fint, men indebærer 2 forespørgsler, hvilket jeg gerne vil undgå, da jeg ikke tror det er nødvendigt!
proaccess: Det lyder som om det måske er en god idé med et unikt indeks over flere felter, men som min tidligere kommentar nok kraftigt antyder har jeg ikke maks styr på dette - kan du uddybe lidt, hvad du havde forestillet dig, og/eller evt. give et par links, hvor jeg kan læse mere om det? (Udover mysql.com ;-))
Som jeg skrev, kunne det være en metode til at få løst dit problem. Ved een gang for alle at tilføje indexet, vil MySQL selv komme med en fejl, hvis man "bryder" reglen (om unike værdier i indexet)
Det vil sige, at når du senere indsætter data i tabellen, vil der blive checkket i index (sker automatisk) og hvis de indexerede data allerede findes, vil MySQL melde fejl.
proaccess - hvis jeg forsøger at lave det index, får jeg en meddelelse om, at kolonnerne ikke må være definerede som "NOT NULL", hvilket er tilfældet på nuværende tidspunkt!
Hvad er det præcist NULL/NOT NULL gør i kolonnetypen?
Jeg har nu rettet fra NULL til NOT NULL (vil stadig gerne vide, hvad forskellien præcist er!) og får nu at vide, at der er et problem med kolonnen gst_message der er af typen text (blob?) og derfor ikke kan bruges i et unik indeks for denne tabeltype....
NULL / NOT NULL - Angiver om du må bruge NULL, som dataværdi i dit felt... NULL er ingenting, "" er en tom string, og der er således forskel på disse...
Med hensyn til gst_message, så må du ændre felt-typen, hvis dette er muligt...
proaccess: Problemet med gst_message er, at det felt indeholder den besked som bliver tastet ind i gæstebogen - jeg kan ikke se, at der er andre felttyper, som er velegnede til at holde disse data?
Var det evt. en (god) idé at ændre tabeltypen - da fejlbeskeden indikerer, at det så måske kan lade sig gøre med indekset!
Jeg er gået tilbage til basis og ser om jeg kan oprette en ny tabel med de ønskede specifikationer - jeg har prøvet nedenstående version efter en times konsultation med mysql-manualen:
CREATE TABLE guests4 ( gst_id tinyint(3) unsigned zerofill DEFAULT '000' NOT NULL auto_increment, gst_name varchar(50) NOT NULL, gst_email varchar(50) NOT NULL, gst_country varchar(50) NOT NULL, gst_homepage varchar(80) NOT NULL, gst_message text NOT NULL, gst_time timestamp(14), PRIMARY KEY (gst_id), UNIQUE INDEX dblpost (gst_name, gst_email, gst_country, gst_homepage, gst_message(100)) ) TYPE=MYISAM;
Problemet er bare, at den giver følgende fejlemeddelelse:
"ERROR 1073: BLOB column 'gst_message' can't be used in key specification with the used table type"
Jeg har nu testet på min lokale mysql, hvor det fungerer fint - men på freepaq's server giver den fejl! Hvis jeg forsøger med phpinfo() på deres site, fortæller den mig ellers, at mysql er version 3.23.49 - burde det så ikke fungere? (Min egen er 3.23.32!)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.