webForumDet fria alternativet

Omvänd wild-card sökning

PHP

10 svar · 515 visningar · startad av nkrantz

Medlem sedan apr. 2002830 inlägg
Frågan#1

Har en liten fråga. En kund skall ha ett rabattkodssystem där kunden skriver in olika koder för att få rabatter. Men nu har det även kommit fram att de även vill att vissa kunder skall kunna använda nummer från medlemskort, och inte köra en realtidscheckning av kortnummret, utan enbart gå på de 9 eller i vissa fall 6 första siffrorna på kortet. Vi admin-gränssnittet skall de alltså kunna lägga in wildcard kortnummer, typ 123456*******.

Hur matchar jag via PHP/mySQL så att om användaren skriver in 123456123456 så ska den förstå att den skall validera mot 123456*******?

Någon som har förslag? :)

// Nippe

Medlem sedan aug. 20002 975 inlägg
#2

Använd LEFT()-funktionen i din SQL-fråga.

Medlem sedan apr. 2002830 inlägg
#3

Mjo, men det kan ju vara olika antal tecken som jag ska jämföra.... I vissa fall så skall 12345678900000 godkännas mot 123456789*****, men i vissa fall skall 123456000000 godkännas mot 123456******... typ...

// N

Medlem sedan aug. 20002 975 inlägg
#4

Om jag förstått dig rätt så är 123456******* ett värde som skickas in via formulär eller motsvarande.

Då borde det inte vara några problem att rensa bort *** från det postade. Sedan använda strlen() för att att ta fram längden, och bygga upp SQL-frågan.

Medlem sedan apr. 2002830 inlägg
#5

Nope.. Du har inte förstått mig rätt. 123456****** sparas i databasen. 123456000000 skickas in från formuläret. Problemet är att antalet tecken innan "wildcardsen" kan variera...

// Nippe

Medlem sedan aug. 20002 975 inlägg
#6

Du har krånglat till det för dig :)

Det borde gå att med LOCATE() och SUBSTRING() plocka ut siffrorna, för att sedan göra en jämförelse med LIKE.
Har du då "tal" både med och utan * lär du troligtvis behöva använda IF() också.

Alternativt kan du loopa igenom alla rader och göra dina jämförelser med PHP, men detta är ingen höjdarvariant om du har många poster.

Medlem sedan apr. 2002830 inlägg
#7

Hm... Jag tror nog att det enklaste är att göra allt omvänt liksom, plocka ut värderna från databasen och jämför med inputen, för att istället jämföra inputen mot databasen... Men som du säger, ingen höjdar variant direkt...

Tack ändå!

Medlem sedan aug. 20002 975 inlägg
#8

Testa annars något i stil med:

$sql = "
  SELECT * FROM tabell 
  WHERE IF (LOCATE('*', knummer, 1), '$formvar' LIKE CONCAT(LEFT(knummer, LOCATE('*', knummer, 1)-1), '%'), '$formvar' = knummer)
";
Medlem sedan apr. 2002830 inlägg
#9

Den funkar okej! MEN, jag skulle vilja att den blir känsligare när det gäller antal tecken.

Som det är nu så godkänner den (om knummer tex är 'code**'):
Code
Code1
Code12
Code123
Code1234
(...)

Jag skulle vilja att den enbart godkände Code12 i ovanstående fall... Kan man få till det tror du?

// Nippe

Medlem sedan aug. 20002 975 inlägg
#10

Testa då med

$sql = " 
  SELECT * FROM tabell 
  WHERE '$formvar' LIKE REPLACE(knummer, '*', '_') 
";
Medlem sedan apr. 2002830 inlägg
#11

Du är kungen! :D

Tack så mycket!

511 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
376 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
376 ms — ändringar (db)