Avatar billede moddi100 Seniormester
19. april 2008 - 18:49 Der er 12 kommentarer og
2 løsninger

Tjekke om en given værdi eksiterer i MySQL database

Hej Eksperter

Jeg ønsker en smart måde at tjekke om en given værdi eksisterer i en bestemt tabel i min MySQL database. Hvis den ikke eksisterer skal jeg tilføje det og ellers skal der udskrives en fejl.
Findes der sådan en funktion, der gør det jeg har brug for? Og i givet fald, hvad hedder den??

Svar udbedes hurtigst muligt
Morten
Avatar billede g1mzee Nybegynder
19. april 2008 - 19:20 #1
Sådan som jeg forstår det vil det flyde ud i at være ligeledes.

$query = mysql_query("SELECT * FROM database WHERE ting=$ting") or die (mysql_error());

if (0 < mysql_num_rows($query)) {
    echo "$ting findes i databasen";
} else {
    mysql_query("INSERT INTO database (ting) VALUES ($ting)");
    echo "den er sat ind i databasen";
}


dette skulle være hvad du leder efter :)
Avatar billede nielle Nybegynder
19. april 2008 - 20:10 #2
Det er nu ikke vider effektivt at lave en SELECT *.

$query = mysql_query("SELECT count(*) AS antal FROM database WHERE ting = $ting") or die(mysql_error());
$row = mysql_fetch_assoc($query);

if ($row['antal'] != 0) {
    echo "$ting findes i databasen";
} else {
    mysql_query("INSERT INTO database (ting) VALUES ($ting)");
    echo "den er sat ind i databasen";
}
Avatar billede showsource Seniormester
19. april 2008 - 20:19 #3
Du kan jo lade et felt være UNIQUE, d.v.s at der kun findes et row med den bestemte værdi, og fejler en INSERT kan du skrive fejlmeddelse
Avatar billede moddi100 Seniormester
19. april 2008 - 22:42 #4
Tror jeg vælger din løsning showsource. Hvad er kommandoen, hvis man skal lave et felt unique fra en php-side? (Altså hvordan kan en bruger gøre det)

g1mzee: Hvis jeg havde valgt din løsning, som du skriver den, ville det ikke have virket. Hvis den ikke findes i databasen, vil $query'en jo give en fejl. Derfor skal det rettes til:
$query = mysql_query("SELECT * FROM database WHERE ting=$ting");

nielle: Har aldrig set den syntax før ('count(*) AS antal'), retunerer den hvor mange rækker der er i $query'en? Altså kunne $row['antal'] være lig med 1??
Avatar billede showsource Seniormester
20. april 2008 - 06:01 #5
Hvis du vil ændre på en eksisterende tabel:

ALTER TABLE `dintabel` ADD UNIQUE (`feltnavn`)

Men det er vel ikke noget som skal gøres af de enkelte brugere?

Hvis du vil oprette en tabel, hvor et felt er UNIQUE

CREATE TABLE `nytabel` (
`brugernavn` VARCHAR( 24 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL ,
UNIQUE (`brugernavn`)
)

Hvis en INSERT fejler, bør du bruge mysql_errno() til at være sikker på det rent faktisk er en "DUPLICATE ENTRY" fejl, og ikke noget andet.


COUNT() tæller antal rows i DB, i nielle's ex. hvor ting = $ting
Hvis der ingen rows er, hvor ting = $ting, vil den resultatet være 0

Men selve antallet af rows for query'en vil altid være en, den tæller jo rows
Avatar billede nielle Nybegynder
20. april 2008 - 09:33 #6
> nielle: Har aldrig set den syntax før ('count(*) AS antal'), retunerer den hvor mange rækker der er i $query'en? Altså kunne $row['antal'] være lig med 1??

Helt korrekt.
Avatar billede moddi100 Seniormester
20. april 2008 - 11:21 #7
> Men det er vel ikke noget som skal gøres af de enkelte brugere?

Jeg er ved at lave et adminmodul til en kunde, han skal så automatisk kunne oprette en tabel og dermed også et UNIQUE felt.

>> nielle: Har aldrig set den syntax før ('count(*) AS antal'), retunerer den hvor >mange rækker der er i $query'en? Altså kunne $row['antal'] være lig med 1??

>Helt korrekt.

Er der så nogen egentlig forskel fra at bruge count(*) AS antal i stedet for mysql_num_rows?

Showsource smider du et svar?
Avatar billede nielle Nybegynder
20. april 2008 - 11:47 #8
> Er der så nogen egentlig forskel fra at bruge count(*) AS antal i stedet for mysql_num_rows?

Ja:

SELECT *

returnere alle data, også selvom man ikke skal bruge dem til noget.

SELECT count(*)

returnere kun et enkelt tal - antallet af rækker.

Derfor performer den sidste bedre. Det kan godt være at der ikke er den store effekt i lige dette tilfælde, men man bør nu alligevel lade være at lære sig dårlige vaner hvis det er det her fag man ønsker at fortsætte i. :^)
Avatar billede moddi100 Seniormester
20. april 2008 - 11:52 #9
aaah! Det er jo smart :D
Det har ikke den store effekt nej, men man bliver vel heller ikke overbombet med mysql-fejl hvis rækken ikke findes? (Hvis forespørgslen nu optræder flere steder)
Avatar billede nielle Nybegynder
20. april 2008 - 20:10 #10
Hvis rækken ikke findes returneres værdien 0. Hvis den findes netop en gang, så returneres selvfølgelig 1. Og ligeledes hvis rækken findes mere end en gang.
Avatar billede moddi100 Seniormester
20. april 2008 - 21:05 #11
Okay

Showsource smid et svar, så får du point for din løsning.
Nielle smid et svar, så får du point, som tak for de ekstra spørgsmål jeg gav.

Lyder det rimeligt?
Avatar billede nielle Nybegynder
20. april 2008 - 21:52 #12
Svar :^)
Avatar billede showsource Seniormester
21. april 2008 - 08:53 #13
svar
Avatar billede moddi100 Seniormester
21. april 2008 - 14:17 #14
Tak for hjælpen
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