Avatar billede zac Nybegynder
07. oktober 2003 - 16:56 Der er 11 kommentarer og
1 løsning

Check af, at indtastet nr. ikke allerede findes i tabel

Skole skal oprette hold m. hver sit nr.
Nye hold skal have nye nr., viser derfor liste over de gamle ved siden af, som der ikke må tages fra.
Men hvordan checke for, at der alligevel ikke oprettes to hold med samme nr.?

Fra form kommer $hold_nr, som skal indsættes i tabel hold.

Har prøvet at lege med:

if ($action == 'go') {

$ny_hold_nr = $hold_nr;

$result = mysql_query("SELECT hold_nr FROM hold");
while ($row = mysql_fetch_array($result)) {
      $gl_hold_nr              = $row["hold_nr"];
  }

if ($ny_hold_nr == $gl_hold_nr)
  {
echo "fejlmeddelelse...";
  }
else
  { $hold_nr == $ny_hold_nr; }

(insert into hold.....hold_nr...)

...
}

Forstår bl.a. ikke, om der skal noget [array] ind i det her?
Avatar billede schaefner Juniormester
07. oktober 2003 - 17:01 #1
<?php
if ($action == 'go') {
    $ny_hold_nr = $hold_nr;
    if (mysql_result(mysql_query("SELECT COUNT(*) FROM hold WHERE hold_nr = $ny_hold_nr"),0) > 0) {
        echo 'Holdet findes allerede';
    } else {
        // SQL
    }
}
?>
Avatar billede ohmish Nybegynder
07. oktober 2003 - 17:10 #2
for at være på den helt sikre side kan du sættet feltet til at være UNIQUE i databasen. Evt. i kombination med feltet skole.
Avatar billede Slettet bruger
07. oktober 2003 - 18:28 #3
Og hvis du laver feltet UNIQUE, kan du undlade checket (SELECT COUNT(*) ...) og bare kigge på resultatet af din INSERT.

Hvis du vil bruge modellen med først at lave en SELECT COUNT(*) og så en INSERT ... så bliver du nødt til at låse tabellen først med LOCK TABLES hold_nr WRITE.
Avatar billede zac Nybegynder
07. oktober 2003 - 21:53 #4
Geniales...nøjes foreløbig med det første
Tak!
Avatar billede olebole Juniormester
08. oktober 2003 - 13:31 #5
<ole>

Du kan evt. spørge med:

$err = mysql_errno();
if ( $err==1062 ) {
  # Kode, der skal afvikles, hvis værdien findes i DB allerede
}

... efter din indsætning i en kolonne med et UNIQUE index.

/mvh
</bole>
Avatar billede zac Nybegynder
08. oktober 2003 - 15:49 #6
Nja, vil nu alligevel helst ikke nøjes med COUNT løsningen, for den virker (vist) kun når hold_nr er et num felt.
Da der enkelte gange skal kunnes skelnes mellem holdene 23A og 23B, er feltet gjort til varchar(6). Løsningen med COUNT virker ved hold nr. som tal, men ikke med fx 23A.
Nu vil jeg prøve at gøre hold_nr UNIQUE - men skal lige have rettet allerede gentagne hold nr., så der ikke sker noget med dem...kigger så også på <ole/ bole>
Avatar billede olebole Juniormester
08. oktober 2003 - 23:43 #7
Hvis du bruger mit eksempel, kan du undgå PHP udskriver fejl med:

  @mysql_query( ........... );
  $err = mysql_errno();
  if ( $err==1062 ) {
    # Kode, der skal afvikles, hvis værdien findes i DB allerede
  }

Snabel-A'et gør tricket  ;o)/mvh
Avatar billede zac Nybegynder
11. oktober 2003 - 22:53 #8
Tusind tak, det virker! Fik ændret feltet til UNIQUE, og bruger din mellemste løsning:
$err = mysql_errno();
if ( $err==1062 ) {
  # Kode, der skal afvikles, hvis værdien findes i DB allerede
}
Men jeg forstår stadig ikke helt:
- din sidste løsning (@mysql_query( ........... ); $err = mys....) - skulle denne query også ind efter insert? Og så er det et dobbelt kald til databasen, ikke (insert plus query)?
- hvis nu jeg havde flere unikke felter i tabellen, så kunne $err = mysql_errno();.... ikke skelne mellem dem, vel? Så nødt til at vælge @mysql_query( ........... );... til bestemte felter (et ad gangen?)??

Anyway, det virker nu!
Avatar billede olebole Juniormester
11. oktober 2003 - 23:03 #9
Sætter du '@' foran en query, forhindrer du, PHP skriver sine sædvanlige fejlmeddelelser. Du skal ikke lave to queries - det er blot en anden måde at skrive den på  :)

Du kan med den viste kode kun fange én 1062 ad gangen (mig bekendt). Jeg har ikke en metode til at fange flere af den type fejl i samme query.
/mvh
Avatar billede Slettet bruger
12. oktober 2003 - 06:55 #10
Slut. Og ikke mere vrøvl.
Avatar billede zac Nybegynder
21. oktober 2005 - 23:43 #11
lukker gl. spørgsmål for tiden - undskyld forsinkelsen! - giver gerne point til jer alle!
Avatar billede olebole Juniormester
22. oktober 2005 - 00:55 #12
- så er her foreløbig et  ;o)
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