Autor Zpráva
leorond
Profil
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
To znamená že jsem zvolil špatnou funkci a nepodaří se mi udělat vyhledávání v MSSQL?
juriad
Profil
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
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
juriad: děkuji pomohlo mi to na "ě š č ř ž" ale ostatní mám stále v entitách
juriad
Profil
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("&Scaron;", "&scaron;", "&Yacute;", "&yacute;", "&Aacute;","&aacute;", "&Iacute;", "&iacute;", "&Eacute;", "&eacute;", "&Uacute;", "&uacute;");
    $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
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
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: