Autor | Zpráva | ||
---|---|---|---|
leorond Profil |
#1 · Zasláno: 5. 9. 2016, 16:52:37
Ahoj, mám menší problém s vyhledáváním v MSSQL databázi v které mám uloženy data přes funkci base64_encode().
Zvolil jsem tuto možnost vzhledem k plně funkční diakritice ale nyní mám problém s vyhledáváním, ve většině případů se mi nedaří nalézt shodu v databázi se zadaným textem do input. Kód kterým se snažím vypsat výsledek ( kód není zabezpečen, je to jen kód na kterém to zkouším ) if(isset($_GET['search'])) { $errors = array(); if(empty($_GET['search'])) { $errors[] = "Jsme zmateni, nevíme co máme hledat!"; } $text = base64_encode($_GET['search']); $params = array( array($text, null) ); $params_1 = array( "Scrollable" => 'Static' ); $query = "SELECT nadpis_news FROM RoD_News WHERE text_news LIKE '%' + ? + '%'"; $result = sqlsrv_query($conn, $query, $params, $params_1); $rows = sqlsrv_num_rows($result); if($rows == 0) { $errors[] = "Pro tento dotaz nebylo nic nalezeno!"; } if(count($errors) > 0) { foreach($errors as $error) { echo "<li>".$error."</li>"; } } else { while($rows = sqlsrv_fetch_array($result)) { $nadpis = base64_decode($rows[0]); echo $nadpis."<br>"; } } } Kde dělám chybu? Zkusil jsem si převést slovo "Ahoj" a poté "Ahoj," výsledky jsou podobné ale nikoliv stejné. Proč? |
||
juriad Profil |
leorond:
Protože 6 = log_2(64) není dělitel 8 = log_2(256). Převedl jsi text z báze 256 do báze 64 a divíš se, že to nefunguje. To je jako bys desítkové číslo 8762340 převedl na binární 100001011011001111100100 a pak v něm zkoušel hledat 23 což je binárně 10111. |
||
leorond Profil |
#3 · Zasláno: 5. 9. 2016, 16:58:41
To znamená že jsem zvolil špatnou funkci a nepodaří se mi udělat vyhledávání v MSSQL?
|
||
juriad Profil |
#4 · Zasláno: 5. 9. 2016, 17:06:14
Ano, nepodaří se ti to. Zvolil jsi nikoli špatnou funkci, ale špatný přístup. Budeš muset spravit ukládání textů s diakritikou namísto vymýšlení obezliček.
|
||
leorond Profil |
No mohu udělat ještě jedno a to zaměnit funkci pro ukládání textu na
utf8_encode() a pro výpis zvolit funkci utf8_decode() , potom mi bude fungovat diakritika ale nepomůže mi to s vyhledáváním jelikož v databázi mám převedeny například znaky "ý á í é ú ů ó" na HTML entity.
Kdežto znaky "ě š č ř ž" mám převedeny funkcí utf8_encode. Jsem kdesi v koncích :D No ještě bych mohl pomocí str_replace() vytvořit funkci která mi kompletně všechny znaky včetně celé azbuky převede na HTML entity a potom bych vůbec nemusel používat utf8_encode() a utf8_decode() :D
|
||
juriad Profil |
#6 · Zasláno: 5. 9. 2016, 17:51:32
leorond:
Ty snad máš stránky v kódování ISO-8859-1? Protože jinak ti ty texty utf8_encode rozbije. Proč ukládáš znaky s diakritikou v databázi jako entity? V databázi mají být čistá data. Musíš zajistit, že „Žluťoučký kůň“ bude v databázi přesně „Žluťoučký kůň“ a nikoli něco jiného. Přečti si vlákno Azbuka do MS-SQL, kde se řešil podobný problém. |
||
leorond Profil |
#7 · Zasláno: 5. 9. 2016, 18:23:05
juriad: děkuji pomohlo mi to na "ě š č ř ž" ale ostatní mám stále v entitách
|
||
juriad Profil |
#8 · Zasláno: 5. 9. 2016, 18:26:37
leorond:
Zbav se tedy entit (vytáhni vše z databáze a následně ulož zpět). Máš nějaký důvod ukládat do databáze entity? |
||
leorond Profil |
áha už to mám, chyba je v tinyMCE který do DB posílá entity
Do sloupce kde ukládám název článku se ukládá vše v pořádku Vyřešil jsem to funkcí <?php function cz_chars_decode($text) { $diakritika = array("Š", "š", "Ý", "ý", "Á", "á", "Í", "í", "É", "é", "Ú", "ú"); $htmlentity = array("Š", "š", "Ý", "ý", "Á","á", "Í", "í", "É", "é", "Ú", "ú"); $text = str_replace($htmlentity, $diakritika, $text); return $text; } ?> Vlastně všechny články vkládané pomocí TinyMCE proženu funkcí která mi vymění HTML entity za normální písmena :) |
||
Keeehi Profil |
#10 · Zasláno: 5. 9. 2016, 22:26:10
leorond:
A co takhle třeba tinyMCE nastavit, aby nic na entity nepřevádělo. archive.tinymce.com/wiki.php/Configuration3x:entity_encoding Zase totiž řešíš problém, který bys vůbec řešit nemusel. |
||
leorond Profil |
#11 · Zasláno: 6. 9. 2016, 04:47:23
No zkoušel jsem najít nějaký návod ale nějak se mi nedařilo, tak jsem než to vyřeším použil tu funkci děkuji Keeehi
|
||
Časová prodleva: 9 let
|
0