IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Chyba v ukládání textu obsahující znaky \ a \n do DB.

V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Cobis
Člen
Avatar
Cobis:18.8.2018 10:06

Ahoj, mám tento HTML kód:

<!DOCTYPE html>
<html>
    <head>
        <title>Test ukládání JSON stringu do DB</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            textarea {
                resize: none;
                width: 263px;
                height: 81px;
                margin: 0px;
                padding: 5px 0px 0px 5px;
                font-family: Arial;
                font-size: 14px;
                font-weight: normal;
                color: #000000;
                background-color: #f4f4f4;
                border: 1px solid #a5a5a5;
                white-space: pre;
                word-wrap: normal;
                overflow-x: auto;
                overflow-y: auto;
                outline: none;
            }
        </style>
    </head>
    <body>
        <textarea id="input"></textarea><br>
        <button type="button" id="button">Uložit data</button><br><br>
        <textarea id="output"></textarea>
        <script type="text/javascript">
            var input = document.getElementById("input");
            var output = document.getElementById("output");
            var button = document.getElementById("button");

            function onReadyStateChange()
            {
                if (this.readyState === 4)
                {
                    if (this.status === 0 || this.status === 200)
                    {
                        if (this.response)
                        {
                            console.info(this.response);

                            var pattern = '{"text": "'

                            var startIndex = this.response.search(pattern);
                            //console.log("startIndex:",startIndex);

                            var endIndex = this.response.search('};');
                            //console.log("endIndex:",endIndex);

                            if (startIndex !== -1 && endIndex !== -1)
                            {
                                var text = this.response.substring(startIndex + pattern.length, endIndex - 1);
                                console.log("output text:",text);

                                output.value = text;
                            }
                        }
                        else
                        {
                            console.info("Error: onReadyStateChange()");
                        }
                    }
                    else
                    {
                        console.info("Error: onReadyStateChange()");
                    }
                }
            }

            function sendData(data)
            {
                //console.log("sendData()");
                console.log("data:",data);

                var httpRequest = new XMLHttpRequest();
                httpRequest.onreadystatechange = onReadyStateChange;
                httpRequest.open('POST', "sendData.php", true);
                httpRequest.send(data);
            }


            button.addEventListener("click", function (event)
            {
                var dataJSON = '{';

                var text = input.value;
                console.log("input.text:",text);
                //console.log("input.text.length:",text.length);

                text = text.replace(/\\/g, "\u005C\u005C");
                console.log("text:",text);
                //console.log("text.length:",text.length);

                text = text.replace(/\n/g, "\u005C\u005Cn");
                console.log("_text:",text);
                //console.log("_text.length:",text.length);

                dataJSON += '"text": "' + text + '"';
                dataJSON += '}';

                sendData(dataJSON);
            });
        </script>
    </body>
</html>

A kód PHP, který zpracuje a uloží text jako JSON do DB jako typ JSON:

<?php

require_once "mysql.inc.php";

if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
{
    // získá zaslaná data
    $dataJSON = $GLOBALS['HTTP_RAW_POST_DATA'];
    echo '$dataJSON: ' . $dataJSON . ';';

    // dataJSON převede na objekt
    $data = json_decode($dataJSON, TRUE);
    //echo 'data: ' . $data;

    $dataJSON2 = json_encode($data, JSON_UNESCAPED_SLASHES);
    echo '$dataJSON2: ' . $dataJSON2 . ';';

    // uloží řádek do tabulky `tabulka_1` v DB
    $query = mysqli_query($connect, "INSERT INTO `tabulka_1` (`id`, `dataJSON`) VALUES (NULL, '" . $dataJSON2 . "')");
    //$id = mysqli_insert_id($connect) . "";

    if ($query == true)
        {
        echo 'Úspěch...';
    }
    else
    {
        echo 'Neúspěch...';
    }
}

?>

Pokud JS odešle tento text:
"Text

y\n"
Tak se to do DB neuloží, proto jsem tam přidal zpětné lomítka před znaky \, \n. Pokud vytáhnu tyto data z DB tak dostanu řetězec "Text\\n\\ny\\n", který obsahuje moc zpětných lomítek. Da se nějak vyřešit tento problém?

Editováno 18.8.2018 10:07
 
Odpovědět
18.8.2018 10:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.