Avatar billede para7 Nybegynder
09. januar 2010 - 16:20 Der 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),
Avatar billede para7 Nybegynder
09. januar 2010 - 16:22 #1
Vi skal give nogle brugere et unikt brugernavn i en db, hvor brugerne er oprettet i forvejen. Så det er en update.
Avatar billede repox Seniormester
09. januar 2010 - 16:28 #2
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.
Avatar billede para7 Nybegynder
09. januar 2010 - 16:54 #3
OK, hvad hedder den option og hvor er den. Kan ikke finde noget der ligner.
Avatar billede repox Seniormester
09. januar 2010 - 17:05 #4
Den hedder UNIQUE og kan slås til via en tabels struktur i phpMyAdmin:
http://i45.tinypic.com/fumdf8.png
Avatar billede para7 Nybegynder
09. januar 2010 - 17:20 #5
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 :)
Avatar billede para7 Nybegynder
09. januar 2010 - 17:22 #6
Hov, der bliver slet ikke gemt nogen felters værdier, bare returneret, så det er bedst med en form for feedback...
Avatar billede repox Seniormester
09. januar 2010 - 17:31 #7
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:


<?php

  $sql = "INSERT INTO users VALUES (NULL, '".$username."')";
  $res = mysql_query($sql);

  if(!$res)
  {
    if(mysql_errno() == 1062)
    echo "Brugernavn er optaget.";
  }

?>

Avatar billede para7 Nybegynder
09. januar 2010 - 18:03 #8
Der er noget jeg ikke forstår, det er hvor der står navnet på sql strengen i min kode (som jeg har kopieret og ikke forstået ordentligt endnu).

include("dbconn.php");
if (! $link)
die("Couldn't connect to MySQL");
mysql_select_db($db , $link)
or die("Couldn't open $db: ".mysql_error());
mysql_query("UPDATE users SET "
."vipcode_inviter='$vipcode_inviter',"
."vipcode='$vipcode',"
."date_edited='$date_edited',"
."firstname='$firstname',"
."lastname='$lastname',"
."address='$address',"
."zipcode='$zipcode',"
."city='$city',"
."country='$country',"
."telephone='$telephone',"
."email='$email',"
."notes='$notes'"
."WHERE id='$id'");
mysql_close($link);
$res = mysql_query(???);
if(!$res)
{
    if(mysql_errno() == 1062)
    echo "Brugernavn er optaget.";
}
Avatar billede repox Seniormester
09. januar 2010 - 18:09 #9
Prøv det her:


    include("dbconn.php");
    if(!$link)
        die("Couldn't connect to MySQL");
   
    mysql_select_db($db , $link)    or die("Couldn't open $db: ".mysql_error());

    $sql = "UPDATE users SET "
        ."vipcode_inviter='$vipcode_inviter',"
        ."vipcode='$vipcode',"
        ."date_edited='$date_edited',"
        ."firstname='$firstname',"
        ."lastname='$lastname',"
        ."address='$address',"
        ."zipcode='$zipcode',"
        ."city='$city',"
        ."country='$country',"
        ."telephone='$telephone',"
        ."email='$email',"
        ."notes='$notes'"
        ."WHERE id='$id'";
   
    $res = mysql_query($sql);
    if(!$res)
    {
        if(mysql_errno() == 1062)
        echo "Brugernavn er optaget.";
    }

Avatar billede para7 Nybegynder
09. januar 2010 - 18:20 #10
Det virker udemærket, tak for det og point til dig :)
Avatar billede para7 Nybegynder
09. januar 2010 - 18:21 #11
Det er da også lettere end at lave en db forespørgsel om der er en duplicate først...
Avatar billede repox Seniormester
09. januar 2010 - 18:30 #12
Det er det nemlig ;)
Avatar billede Slettet bruger
09. januar 2010 - 18:33 #13
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;
}
Avatar billede para7 Nybegynder
09. januar 2010 - 18:40 #14
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 ;))
Avatar billede repox Seniormester
09. januar 2010 - 19:19 #15
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?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester