webForumDet fria alternativet

strtoupper()

PHPur PHP

9 svar · 1 616 visningar · startad av drew

Medlem sedan mars 2007845 inlägg
Frågan#1

Jag har detta i ett skript

$keywords = strtoupper($search_keywords);
$sql .= ' AND UPPER(p.message_text) REGEXP "[[:<:]](' . $keywords . ')[[:>:]]"';

Om jag söker på älsklingen som jag vet finns i texten så hittas det inte.

Om jag ändrar till

$keywords = $search_keywords;
$sql .= ' AND p.message_text REGEXP "[[:<:]](' . $keywords . ')[[:>:]]"';

så hittas dom. Det är samma med allt som innehåller åäö

Tanken är att sökningen inte ska skilja på stora och små bokstäver.

Fältet i databasen är mediumtext, utf8_bin. åäö visas som dom ska på alla sidor.

Det jag undrar är dels om det är php eller MySQL som inte klarar att göra om ä till Ä? Och dels vad ska jag göra för att det ska bli rätt?

Medlem sedan mars 2007845 inlägg
#2

Jag har meddelanden innehållande både Älsklingen och älsklingen.

Vid en sökning på älsklingen så hittas ingen. Men om jag söker på Älsklingen så hittas alla.

Detta är alltså med den version där alla tecken görs om till stora.

Det enklaste och bästa för att klara åäö och andra bokstäver utanför a-z både som stora och små. Och samtidigt vara någorlunda kompatibel med andra databaser än MySQL är nog att läsa in alla meddelanden som är aktuella enligt user_id och sen sköta sorteringen i php. Kanske.

Medlem sedan juli 20033 147 inlägg
#3

strtoupper() tar inte hänsyn till åäö, enklast är att göra

$match    = array('å', 'ä', 'ö');
$replace  = array('Å', 'Ä', 'Ö');

$keywords = str_replace($match, $replace, strtolower($search_keywords));
Medlem sedan mars 2007845 inlägg
#4

strtolower() borde ju inte behövas om man ska göra alla tecken stora.

Melea skrev:

$keywords = str_replace($match, $replace, strtolower($search_keywords));

Jag testade både med strtolower() och utan. Det fungerade inte. Däremot fungerade att inte låta php hantera det alls.

$sql .= ' AND UPPER(p.message_text) REGEXP UPPER("[[:<:]](' . $keywords . ')[[:>:]]")';
Medlem sedan juli 20033 147 inlägg
#5

Menade självklart strtoupper(), men det har mao löst sig?

Medlem sedan mars 2007845 inlägg
#6

Ja, det verkar som att det fungerar. Tack för hjälpen.

Medlem sedan apr. 2008137 inlägg
#7

Vad har du för collate på tabellen? Mysql REGEXP ska inte vara case sensitive utom för collate _cs.
Rätt lösning borde vara att konvertera till en case-insensitive collate. Om du testat phpmyadmin så är det så dom gör vid sina sökningar.

REGEXP CONVERT( _utf8 'sträng'
USING latin1 )
COLLATE latin1_swedish_ci
Medlem sedan mars 2007845 inlägg
#8

Enligt MySQL's egen sida så är sökningar i binära fält alltid case sensitive.

Och exakt det där testade jag, men fick inga träffar alls.

Medlem sedan juni 20014 421 inlägg
#9

Varför har du valt utf8-bin? I princip alla binära textjämförelser är skiftlägesknslig. Varför inte använda en som inte är det som är mer vanligt att använda på text? Typ utf8_general_ci, utf8_swedish_ci eller utf8_unicode_ci?

Medlem sedan mars 2007845 inlägg
#10

Det är inte jag som valt. Men tanken är nog att det ska fungera likadant oavsett språk.

133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)