Невозможно сохранить разрыв строки и <отметку в MariaDB / MySQL - PullRequest
0 голосов
/ 07 ноября 2019

Я не могу сохранить следующую строку, введенную в textarea, из браузера.

a
<br>b

Сервер MariaDB / Apache перестает отвечать на запросы, когда указанная выше строка передается от клиента.

Это JavaScript на стороне клиента

// ...
var description = document.getElementById("txt_manage_remind_desc").value.trim();
// ...
// ...
$.get("PHP/MyAjax.php?page=addNewRemind&remindId="+remindId+"&remindText="+remindText+"&description="+description+"&isEvent="+timeEventIsOn+"&eventTime="+eventTime+"&public_or_private="+public_or_private+"&moveToAfter="+moveToAfter, function(responseText) {
 // responseText Usage
}

Это PHP на стороне сервера

// ...
$description = mysqli_real_escape_string($mysqli,$_REQUEST['description']);
// ...
// ...
// Insertion of New Remind
$stmt = $mysqli->prepare("INSERT INTO  `reminders` (
                          `user_id` ,
                          `reminder` ,
                          `description` ,
                          `is_an_event` ,
                          `event_time` ,
                          `public_or_private` ,
                          `created_on` ,
                          `type` ,
                          `priority`
                          )
                          VALUES (
                          ?,
                          ?,
                          ?,
                          ?,
                          ?,
                          ?,
                          NOW(),
                          'user_defined',
                          ?
                          )");
if(false === $stmt) {
  die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}
$rc = $stmt->bind_param("sssssss", $session_id, $remindText, $description, $isEvent, $eventTime, $public_or_private, $newPriority);
if(false === $rc) {
  die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}
$rc = $stmt->execute();
if(false === $rc) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}
else {
  echo "saved";
}

Я использовал функцию escape() из JavaScript для экранирования проблемных символов, которые были сохраненызаписи, но преобразование специальных символов в нежелательные символы.
Я обнаружил, что проблема связана с комбинацией line break и <.
Предложите любое решение JavaScript или PHP для решения этой проблемы.

1 Ответ

0 голосов
/ 07 ноября 2019

Ваш код использует метод GET. GET метод следуйте правилу URL. Не принимать определенные символы.

Решение Heresome.

  1. Используйте POST
var fd = new FormData();
fd.append("description", document.getElementById("txt_manage_remind_desc").value.trim());
fd.append("remindId", remindId);
//add more fd.append() like you put GET

var x = new XMHttpRequest();
x.onreadystatechange = function(){
   if(this.status == 200 && this.readystate == 4){
       console.log("success sent");
   }
}
x.open("POST", "PHP/MyAjax.php?page=addNewRemind", true);
x.send(fd);

Затем в ваших PHP-кодах метод $_GET меняется на метод $_POST.

$description = $_POST["description"];
//add more others key=value

Иначе, вы можете закодировать ваши данные в Base64
// ...
var description = document.getElementById("txt_manage_remind_desc").value.trim();
// ...
// ...
$.get("PHP/MyAjax.php?page=addNewRemind&remindId="+remindId+"&remindText="+remindText+"&description="+ btoa(description) +"&isEvent="+timeEventIsOn+"&eventTime="+eventTime+"&public_or_private="+public_or_private+"&moveToAfter="+moveToAfter, function(responseText) {
 // responseText Usage
}

Некоторое время в JS по умолчанию функция atob() и btoa() не работает, потому что она не представляет 8-битный байтовый символ. Итак, вам нужна другая функция JS base64.

    function base64_encode(str) {
        return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
            function toSolidBytes(match, p1) {
                return String.fromCharCode('0x' + p1);
        }));
    }
    function base64_decode(str) {
        return decodeURIComponent(atob(str).split('').map(function(c) {
            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
        }).join(''));
    }

Итак, если вы используете новую функцию, то ваш запрос будет выглядеть так:

// ...
var description = document.getElementById("txt_manage_remind_desc").value.trim();
// ...
// ...
$.get("PHP/MyAjax.php?page=addNewRemind&remindId="+remindId+"&remindText="+remindText+"&description="+ base64_encode(description) +"&isEvent="+timeEventIsOn+"&eventTime="+eventTime+"&public_or_private="+public_or_private+"&moveToAfter="+moveToAfter, function(responseText) {
 // responseText Usage
}

Тогда в вашем PHP вам потребуетсярасшифруйте его как строку $description = base64_decode($description);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...