Avatar billede Slettet bruger
19. februar 2005 - 18:05 Der er 34 kommentarer og
1 løsning

mysql / php spg med LIKE

Jeg har en kolonne i min tabel hvor der f.eks. står

45 60 23

dette er størrelser. Jeg vil gerne kunne finde f.eks. 45. Min query nu siger "WHERE tabel.kolonne LIKE '%$vaerdi%'"
men hvis jeg f.eks. søger på 2 finder jeg jo 23.. det er ikke meningen.

Håber i forstår problemet
Avatar billede michael_stim Ekspert
19. februar 2005 - 18:13 #1
Forstår ikke.
Avatar billede michael_stim Ekspert
19. februar 2005 - 18:14 #2
Du vil finde 45 og söger på 2. Svarer til at man vil finde Hansen og söger på W.
Avatar billede boomshanka Nybegynder
19. februar 2005 - 18:22 #3
LIKE bruger man vist kun, hvis du vil søge i tekststrenge. Hvis du vil søge efter et bestemt tal kan du bare bruge:

WHERE tabel.kolonne = værdi;
Avatar billede boomshanka Nybegynder
19. februar 2005 - 18:23 #4
ups!

"WHERE tabel.kolonne = $værdi"
Avatar billede Slettet bruger
19. februar 2005 - 18:25 #5
nej boomshanka, så vil jeg jo ikke finde noget når der står "45 60 23".

michael.. hvis jeg søger på 2 får jeg 23
Avatar billede boomshanka Nybegynder
19. februar 2005 - 18:27 #6
nå, du mener i samme række...nu er jeg med
Avatar billede boomshanka Nybegynder
19. februar 2005 - 18:30 #7
...men så er jeg ikke helt med alligevel :-)

som michael siger; hvordan vil du finde 45, hvis du søger efter 2?
Avatar billede boomshanka Nybegynder
19. februar 2005 - 18:32 #8
mener du at du vil søge efter 45, men får "45 60 23"?
Avatar billede michael_stim Ekspert
19. februar 2005 - 18:33 #9
"WHERE tabel.kolonne LIKE '%$vaerdi'" ->Starter på det du söger efter
"WHERE tabel.kolonne LIKE '$vaerdi%'" ->Slutter på det du söger efter
"WHERE tabel.kolonne LIKE '%$vaerdi%'" ->Har det du söger efter i sig
Avatar billede detox Nybegynder
19. februar 2005 - 19:11 #10
Hvis jeg har forstået dig rigtigt, skal du ud i en regexp for at skelne mellem 2 og 23 i sådan en streng. Prøv:

SELECT * FROM `tabel` WHERE tabel.kolonne REGEXP '[[:<:]]2[[:>:]]'
Avatar billede detox Nybegynder
19. februar 2005 - 19:13 #11
Men måske skulle du overveje en bedre måde at gemme dine data på.
Avatar billede Slettet bruger
19. februar 2005 - 19:15 #12
jeg tror du har fat i noget detox..

det er fordi jeg har en tabel med cykler, og det ville være spild at lave 3 rækker med cykler, hvor den eneste forskel er størrelsen.. derfor gør jeg det sådan
Avatar billede detox Nybegynder
19. februar 2005 - 19:25 #13
Nu ved jeg ikke hvor mange cykler det drejer sig om, men REGEXP er forholdsvis langsommelig.
Avatar billede Slettet bruger
19. februar 2005 - 19:39 #14
det drejer sig om rigtig mange.. det er ikke en mulighed at lave en række for hver..
noget andet jeg har tænkt på er, at når man i en input boks skriver "60 54 26" kan det så lade sig gøre, at få den til at ændre det til "\'60\' \'54\' \'´26\'" ?

altså ereg_replace("alle tal der står for sig selv", "\'Alle tal der står for sig selv\'", $var)

?
Avatar billede Slettet bruger
19. februar 2005 - 19:48 #15
og så naturligvis sætte det ind i tabellen.. det er mere om man kan finde tal der er "omkranset" af mellemrum, og så sætter \' på dem
Avatar billede detox Nybegynder
19. februar 2005 - 19:50 #16
Måske skulle du i virkeligheden have flere tabeller, fx en med cykelmærker/beskrivelse og en med størrelser.
Avatar billede detox Nybegynder
19. februar 2005 - 19:53 #17
Til dit sidste spørgsmål:

$str = preg_replace("/\b(\d+)\b/", "\'$1\'", $str);
Avatar billede Slettet bruger
19. februar 2005 - 20:37 #18
kunne jeg få lidt hjælp til den preg_replace.. ("/\b(\d+)\b/" forvirrer mig mere end normalt :D
Avatar billede Slettet bruger
19. februar 2005 - 20:38 #19
og det kan jo ikke hjælpe at have flere tabeller, idet der jo alligevel kommer til at stå flere størrelser i hver række
Avatar billede detox Nybegynder
19. februar 2005 - 20:42 #20
Eks:

$str = '12 34 56';
$str = preg_replace("/\b(\d+)\b/", "\'$1\'", $str);
echo $str;
Avatar billede detox Nybegynder
19. februar 2005 - 20:45 #21
Eller du kunne have en størrelse i hver række. Det vil alligevel være mere effektivt, selvom der er flere rækker. Der er jo plads til rigtigt mange rækker i en tabel.
Avatar billede Slettet bruger
19. februar 2005 - 21:13 #22
jaja, men hver række skal jo alligevel have flere størrelser før det kan bruges... ellers kunne do jo lige komme med et eksempel.. hvis du gider :P
Avatar billede detox Nybegynder
19. februar 2005 - 21:26 #23
Det jeg mener er du har cykelnavnet (og evt. andre data) i en tabel:

id | navn
14 | centurion

i en anden tabel kan du så have størrelser:

id | str
14 | 45
14 | 60
14 | 23

men hvis jeg har misforstået det og der er 3 størrelser til at beskrive hver cykel, kan du jo lave en kolonne til hver.
Jeg tænker bare du kan få problemer med hastigheden på forespørgsler, hvis der er mange cykler og mange brugere.
Avatar billede Slettet bruger
19. februar 2005 - 21:46 #24
idet jeg har mange cykler vil jeg næsten tro at det der er sværere.. jeg tror det rigtige er den preg_replace, tak for de mange inputs detox. Smid svar :P
Avatar billede detox Nybegynder
19. februar 2005 - 21:59 #25
oki, velbekommen
Avatar billede Slettet bruger
20. februar 2005 - 13:52 #26
kan det også laves så der også kommer ' om ord?
Avatar billede detox Nybegynder
21. februar 2005 - 02:15 #27
$str = preg_replace("/\b(\w+)\b/", "\'$1\'", $str);
Avatar billede detox Nybegynder
21. februar 2005 - 02:16 #28
Eller blot:

$str = preg_replace("/(\w+)/", "\'$1\'", $str);
Avatar billede Slettet bruger
21. februar 2005 - 20:52 #29
Ved du hvor man kan se hvad "/\b(\w+)\b/" og "/(\w+)/" gør?, jeg kan ikke finde noget på php.net
Avatar billede Slettet bruger
12. marts 2005 - 22:45 #30
Detox, jeg håber stadig du er derude et sted, og er villig til at hjælpe. Der er 50 point i det for dig :)

Jeg har valgt at have værdierne i databasen som f.eks. "51/25/6/90/1", og vil gerne bruge regexp i min mysql query. Jeg har selv lavet noget, der egentlig burde virke (synes jeg :o)), her er det:


WHERE cykler.stoerrelse_cm REGEXP ' '^\$vaerdi\/ | \/\$vaerdi\/ | \$vaerdi$ | ^\$vaerdi$''
Avatar billede Slettet bruger
12. marts 2005 - 22:45 #31
WHERE cykler.stoerrelse_cm REGEXP '^\$vaerdi\/ | \/\$vaerdi\/ | \$vaerdi$ | ^\$vaerdi$'

den sidste her.

der kommer bare ikke noget resultat :(
Avatar billede Slettet bruger
12. marts 2005 - 22:47 #32
cykler.stoerrelse_cm '^$vaerdi\/ | \$vaerdi\/ | $vaerdi$ | ^$vaerdi$'

der var den rigtige :)

i querien jeg udskriver står der ($vaerdi er 21):

cykler.stoerrelse_cm REGEXP '^21\/ | $vaerdi\/ | 21$ | ^21$'
Avatar billede Slettet bruger
12. marts 2005 - 22:59 #33
ej det gør ikke noget, jeg har - på mystisk vis - formået at konstruere en rimelig svedig expression :D
Avatar billede detox Nybegynder
13. marts 2005 - 09:47 #34
REGEXP styrer ;O)
Avatar billede Slettet bruger
13. marts 2005 - 10:49 #35
det er rimelig smart vil jeg da gerne give dig ret i :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