Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Сохранить html в blob mysql

Ржач Ученик (29), на голосовании 1 год назад
День добрый! Можете ли подсказать как правильно работать с BLOB полями? А именно есть div contenteditable, он может содержать форматированный текст, картинку, ссылку. Как его сохранить в таблице mysql? Вот мой код, но я не понимаю малость как правильно вообще работать с ним.

это код передачи из js скрипта в php скрипт

 btnPublicNote.onclick = () => { 
const sendNote = document.querySelector('div.enterNote').innerHTML;
let blob = new Blob([sendNote], {type: 'text/html'});
const param = 'note='+blob+'&iduser='+localStorage.getItem('authLink');
fetch('../php/note/noteUser.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
},
body: param
}).then(response => response.text()).then(result => console.log(result))
}
это код содержащийся на стороне сервера в PHP

  $stmt = $link->prepare("INSERT INTO `scnural`.`noteUsers`  
(`id`, `userid`, `note`, `date`) VALUES
(NULL, ?, ?, ?);");
$stmt->bind_param('iss', $id, $note, $dateTime);
$stmt->execute();

в базу вставляется просто blob object размером 13 байт. Хотя из JS смотрел передаётся объект BLOB размером и 15 кБ и 100 кБ. Но в базу пишет только 13 байт. Как с ними работать? BLOB? В рунете нашёл только статьи где описывается работа с BLOB и mysql на примере изображений, а как с текстом быть?
Голосование за лучший ответ
1 1 Ученик (230) 1 год назад
Для сохранения содержимого div'а в MySQL в виде BLOB необходимо преобразовать его содержимое в бинарный формат. В данном случае вы можете использовать метод Blob.prototype.arrayBuffer() для преобразования объекта Blob в ArrayBuffer, а затем передавать его в PHP-скрипт.

Пример кода на JS:

const sendNote = document.querySelector('div.enterNote').innerHTML;
const blob = new Blob([sendNote], { type: 'text/html' });
const reader = new FileReader();

reader.addEventListener('loadend', () => {
const arrayBuffer = reader.result;
const formData = new FormData();
formData.append('note', new Blob([arrayBuffer], { type: 'application/octet-stream' }));
formData.append('iduser', localStorage.getItem('authLink'));

fetch('../php/note/noteUser.php', {
method: 'POST',
body: formData,
}).then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error(error));
});

reader.readAsArrayBuffer(blob);
Пример кода на PHP для сохранения BLOB:

$note = $_POST['note'];
$id = $_POST['iduser'];
$dateTime = date('Y-m-d H:i:s');

$stmt = $link->prepare("INSERT INTO `scnural`.`noteUsers`
(`id`, `userid`, `note`, `date`) VALUES
(NULL, ?, ?, ?);");
$stmt->bind_param('iss', $id, $note, $dateTime);
$stmt->execute();
Обратите внимание, что в данном примере мы используем FormData, чтобы отправить данные на сервер в виде формы, а также тип application/octet-stream для BLOB в качестве типа MIME.
Саня Семенов Оракул (60497) 1 год назад
если не знаешь что такое BLOB не лезь в эту область, сделай тип текст и сувай HTML в базу текстом
Михаил Просветленный (30520) 1 год назад
Во-первых, я бы рекомендовал вам использовать тип данных TEXT вместо BLOB для хранения HTML-кода в таблице MySQL. Тип данных BLOB предназначен для хранения двоичных данных, таких как изображения или видео, а не текста. Тип данных TEXT позволяет хранить текстовые данные с различными кодировками символов, такими как UTF-8. Это упростит работу с HTML-кодом и избежать проблем с кодировкой.

Во-вторых, я бы посоветовал вам не передавать объект BLOB из JavaScript в PHP скрипт, а просто передавать строку HTML-кода. Объект BLOB может быть сложно обработать на стороне сервера и может вызвать ошибки при записи в базу данных. Вы можете просто изменить ваш код на следующий:

btnPublicNote.onclick = () => {
const sendNote = document.querySelector('div.enterNote').innerHTML;
//let blob = new Blob([sendNote], {type: 'text/html'}); // не нужно создавать объект BLOB
const param = 'note='+sendNote+'&iduser='+localStorage.getItem('authLink');
fetch('../php/note/noteUser.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
},
body: param
}).then(response => response.text()).then(result => console.log(result))
}

Ваш PHP код выглядит правильно, но вы должны убедиться, что тип данных поля note в таблице noteUsers соответствует типу TEXT и имеет подходящую кодировку символов.
Похожие вопросы