09. januar 2010 - 16:20Der er
14 kommentarer og 1 løsning
Undgå duplicate insert i mysql db
Er der ikke en fix måde man kan undgå at komme til at indsætte en duplicate i et databasefelt? Altså troede jeg jeg kunne sætte det fra phpMyadmin. Men måske der er en lille indskudt sql sætning, som kan forebygge det? Det er en administration for os selv, så det behøver ikke være så brugervenligt, bare at der returneres en fejlmeddelelse, at det er en duplicate entry. (Har set det i ASP og Access database),
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Du kan sætte det felt som du ikke vil have skal indeholde dubletter til at være unikt. Det kan du klare gennem phpMyAdmin. Det bevirker at din SQL sætning ved insert/update statements vil fejle når en dublet forsøges indsat/opdateret.
Fint nok. der var en knap der hed Unik. Dog fik jeg ikke nogen fejlmeddelelse da jeg prøvede at skrive en doublet ind. Ville være bedst at man kunne få at vide at værdien ikke blev gemt..
Men skriv lige svar for point, det er guldet værd :)
nu ved jeg selvfølgelig ikke hvordan du tilgår den, men der er rigeligt med muligheder for at kontrollere fejlen. Eksempelvis vil mysql_errno() returnere 1062 hvis det er en dublet fejl der er skyld i at SQL forespørgslen fejler:
i #8 opdaterer du, en post identificeret ved ID, det er ikke det samme som at indsætte en ny post med et eksisterende ID.
Nuvel - håber ikke det forvirrer for meget at jeg kommer med andet forslag (fra gemmerne)
function enumTableID($table, $text) { $sql = 'select id from ' . $table . ' where name="' . $text . '"'; $idA = queryArray($sql); if (count($idA)) { extract($idA[0]); return $id; } $id = nextEnumTableID($table); $sql = 'insert into ' . $table . ' values(' . $id . ',"' . $text . '")'; mysql_query($sql) || mysql_close()&0 || die("Query error"); return $id; }
// like autonumber function nextEnumTableID($enumStrTable) { $sql = "select max(id) as max from " . $enumStrTable; $idA = queryArray($sql); if (count($idA)) { extract($idA[0]); return $max+1; } return 1; }
function queryArray($query) { $resultat = mysql_query($query) or die("Unable to execute query: $query"); while($raekke = mysql_fetch_array($resultat)) $resultat_array[] = $raekke; return $resultat_array; }
Tak ellebe Foreløbig er jeg glad for at min kode bare virker og jeg når deadline, men det er nok smartere med dit forslag. Når jeg blir lidt mere langhåret ud i php er det nok guf ;))
ellebe: Du laver nogle halvdårlige løsninger på ting som er letløselige med et ordentligt database design ( auto increment alene sparer dig den ene af funktionerne og dermed et databasekald ) og dine funktioner vil konsekvent dræbe det eksekverende script såfremt mysql fejler (af en eller anden årsag). Samtidig imødekommer du ikke problematikken med dubletter i dine funktioner. Dine funktioner er meget specifikke og skal tilpasses til den aktuelle tabel. Hvad sparer/opnår man ved at anvende dine funktioner?
Synes godt om
Ny brugerNybegynder
Din løsning...
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.