Avatar billede tfrandse Nybegynder
27. august 2008 - 12:10 Der er 15 kommentarer og
1 løsning

Mysql instr ?

Hejsa folkens :)

Side: kat.php?kat=6

Den henter jo så fra en database, hvor at kat = 6.
Men indholdet i databasen kan være følgende:

[kat]
6
1,5
4,21
1,16,14

Så jeg kom itanke om at InStr måske ville kunne bruges i MySQLen, og kom frem til følgende.

$sql_extra = "(kat = '".$_GET["kat"]."')";
$sql_extra = $sql_extra . " OR (INSTR(kat, '".$_GET["kat"]."'))";

$sql = "SELECT * FROM {$prefix}produkt WHERE ((aktiv = 1) AND (sub = 0) AND $sql_extra) ORDER BY id DESC";

Problemet er at den også tager '1,16,24' med, fordi at det indeholder et 6-tal.
Hvad kan jeg gøre for at undgå dette ?

Dbh,
Martin
Avatar billede coderdk Praktikant
27. august 2008 - 12:16 #1
Du bør lave din database om så du får en en-til-mange relation i stedet for... I.e. du har produkt og produkt_kategori hvor produkt_kategori indeholder produkt ID og kategori ID.
Avatar billede tfrandse Nybegynder
27. august 2008 - 12:18 #2
Tro mig, ville jeg godt nok også hellere - men da det er et site jeg har overtaget opdatering af - og ikke har tiden til den store opdatering, så vil jeg ikke gå så meget i dybden af den.

Men ellers et godt forslag coder :)
Avatar billede coderdk Praktikant
27. august 2008 - 13:33 #3
Du *kunne* godt bruge den løsning du beskriver men så skal du opdatere al indholdet, så der er komma i start og slut af feltet, e.g. ",6," og ",1,16,14," - for så skal du lede efter ',".$_GET['kat'].",' - alternativt kan du bruge REGEXP:

"SELECT * FROM produkt WHERE aktiv = 1 AND sub = 0 AND kat REGEXP '(^|,)".$_GET['kat']."($|,)'"

(utestet)
Avatar billede coderdk Praktikant
27. august 2008 - 13:34 #4
Fælles for dem begge er, at det performer ad helvedes til ;)
Avatar billede tfrandse Nybegynder
27. august 2008 - 13:35 #5
Der er virkelig ikke en anden metode :/
Det er godt nok mange produkter at gå igennem - hehe :P
Avatar billede pidgeot Nybegynder
27. august 2008 - 13:39 #6
Der er da også den metode med at bruge 4 betingelser til at dække alle kombinationer af om der er komma før/efter, så du sliper for at ændre de eksisterende:

WHERE aktiv = 1 AND sub = 0 AND (kat = '".$_GET["kat"]."' OR kat LIKE '%,".$_GET["kat"]."' OR kat LIKE '".$_GET["kat"].",%' OR kat LIKE '%,".$_GET["kat"].",%')

...men det grundlæggende problem er jo det samme; det kommer ikke til at køre godt så længe strukturen ikke er i  orden.
Avatar billede coderdk Praktikant
27. august 2008 - 13:40 #7
Du behøver ikke gå dem igennem:

UPDATE tabel SET kat = CONCAT(',',kat,',')

Men prøv den med REGEXP, den bør virke uden du behøver gøre noget
Avatar billede tfrandse Nybegynder
27. august 2008 - 13:42 #8
Det kan godt tyde på at jeg skal igang med at ændre strukturen en helt del på sitet :-/

Det er lidt.. Nej rettelse; meget ærgeligt.
Men ikke destomindre, så virkede pidgeot's SQL sætning, som en midlertidig løsning;

Smid et svar pidgeot.
Avatar billede coderdk Praktikant
27. august 2008 - 13:42 #9
$sql = "SELECT * FROM {$prefix}produkt WHERE aktiv = 1 AND sub = 0 AND kat REGEXP '(^|,)".$_GET['kat']."($|,)' ORDER BY id DESC";
Avatar billede coderdk Praktikant
27. august 2008 - 13:57 #10
Min regexpløsning burde altså virke ;)
Avatar billede pidgeot Nybegynder
27. august 2008 - 14:04 #11
Min kommentar var ment som en tilføjelse til det med REGEXP - begge skulle virke uden ændringer (omend du nok vil mene den ene er nemmere at gennemskue en den anden - hvilken der er hvilken, ved du bedst selv). Giv derfor pointene til coderdk, og kom så i gang med at kigge på den databasestruktur ;)

...og husk at jo før du får rettet op på databasestrukturen, jo mindre kommer du også til at skulle rette rent kodemæssigt (fordi du ikke selv har nået at skrive så meget der er afhængig af den gamle struktur). Det er måske nok OK at du haster en eller anden ting ud hvis der er tale om en alvorlig fejl eller mangel, og så først kigger på databasen efter det, men igen; jo før jo bedre.
Avatar billede tfrandse Nybegynder
27. august 2008 - 14:14 #12
Jamen ellers smid begge svar; så kan I jo dele :)

Jovist, der skal kigges på den struktur, og det kan næsten ikke gøres hurtigst nok - men igen, det var en fejl der skulle ordnes. Og at gå igennem hele strukturen er ikke hurtigt :)
Avatar billede coderdk Praktikant
27. august 2008 - 14:39 #13
Jeg deler gerne ;)
Avatar billede coderdk Praktikant
27. august 2008 - 14:39 #14
Du kan jo også skrive et lille script, der løber hele skidtet igennem og laver den nye struktur :)
Avatar billede pidgeot Nybegynder
27. august 2008 - 14:47 #15
Det er vel næsten den mindste del (select query, løkke med explode og inserts) - han skal jo igennem koden for at finde de steder hvor oplysningerne blev brugt.

Jeg springer over her, men tak for tilbuddet. :)
Avatar billede tfrandse Nybegynder
27. august 2008 - 15:26 #16
Jamen jeg siger tak til jer begge 2 :)

I har været mig en stor hjælp.
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



IT-JOB

RISMA Systems A/S

Senior PHP-udvikler

De Nationale Geologiske Undersøgelser for Danmark og Grønland (GEUS)

IT-systemadministrator søges til GEUS