Bản chất chuyển đổi text html khi lưu vào CSDL

1. Lưu có mã html <> sẽ báo lỗi
2. Cách xử lý
3. CHÚ Ý KHI DÙNG mceEditor
---------------------

1. Khi lưu dùng Query Ajax
   Các ô input gởi về có mã html <> sẽ báo lỗi
   Ví dụ: Xin chào  -> lưu bình thường
             <b>Xin chào</b> sẽ báo lỗi vì không có phép truyền

Trong điều kiện thường
  - Nhập giá trị a vào input thì lưu bình thường
  - Nhập giá trị a> vào input thì lưu bình thường
    * Nhưng khi nhập vào input giá trị là <a> thì lưu LỖI  (vì có mã HTML)
*** Để giải quyết xem phần dưới:


* Nếu như copy dòng chữ dưới vào 1 textera thuần

<p><strong>&gt;</strong></p>     >
<p><strong><strong>&lt;</strong></strong></p>           <
<p><strong><strong>&amp;<br /></strong><br /></strong></p>                &
...
******** Khi lưu (submit) sẽ báo lỗi...)


* Nếu như chuyển toàn bộ chữ màu xanh qua Post Query sẽ bị lỗi không truyển được
Như vậy ta cần chuyển đổi chữ màu xanh qua dạng mã hóa để lưu vào CSDL
   Mã hóa HTML gọi là HtmlDecode
   Mã hóa url gọi là encodeURI

*** Khi load lên hiển thị phải mã hóa ngược lai.


2. Cách xử lý
* Để xử lý ta cần 2 bước
B1: chuyển đổi trước khi truyền qua ajax
Kiểu Endcode html
var data = {};
$.each($("#frmTest").serializeArray(), function() {
    data[this.name] =  htmlEncode(this.value) 
});
//hàm viết thêm, hay import file common.js ở themes\lib_cm
function htmlEncode(input) {
        const textArea = document.createElement("textarea");
        textArea.innerText = input;
        return textArea.innerHTML.split("<br>").join("\n");
      }

Có thể dùng kiểu encodeURIComponent html
var data = {};
$.each($("#frmTest").serializeArray(), function() {
    data[this.name] =   encodeURIComponent(this.value) 
});
//encodeURIComponent hàm có sẵn , có thể dùng hàm encodeURI
   var url="/adminxml/Query_Do.aspx?name=BanHang_iif/test&out=txt";
                $.post( url,
            data
        )
        .done(function( data ) {
            alert( "KQ " + data );       
           
       });

  B2: thêm tham số tùy chọn cho query
Kiểu Endcode html<Query>
<ID>Q1</ID>
<Src>12</Src>
<Type>Sql</Type>
<Cmd>Update tbTestSQL Set MoTa=@MoTa Where _SYS_KEY='1'; </Cmd>
<SqlParameter>
MoTa<pr&/><iif-DGVL>Form:MoTa</iif-DGVL><pr&/>ntext<pr&/>cv:htmldecode
</SqlParameter>
<SqlConfig>
 Call:ExecuteNonQuery
</SqlConfig>
</Query>

cv:htmldecode
    - dành cho EncodeHTML
cv:urldecode
   - dành cho
EncodeUrl
 
* Gợi ý thêm: nếu tất cả các ô đều htmlendcode vậy sẽ cấu hình nhiều
Để nhanh ta chỉ cần thêm
<SqlConfig>
...
ConvertSave:htmldecode
</SqlConfig>
Khi đó ta ko cần thêm <pr&/>cv:htmldecode

Dùng htmldecode sẽ nhanh hơn urlendcode
 
*Nên dùng <iif-DGVL>Form:MoTa</iif-DGVL>  hay hơn, vì dữ liệu xử lý nhanh gọn , tham khảo
cc


3. CHÚ Ý KHI DÙNG mceEditor
 các ký tự đặc biệt > , < , & ... sẽ được mã hóa đơn gọi là HtmlEndcode
nhưng vì lỗi từ mceEdittor nên khi lưu chú ý

var data = {};
$.each($("#frmTest").serializeArray(), function() {
    data[this.name] = this.value   //  this.value //   htmlEncode(this.value) encodeURIComponent(this.value)  
    
});
data["MoTa"]= htmlEncode( tinyMCE.get('TextArea1').getContent() );
textear có tên TextArea1
* khi getContent thì có chứa mã html <..> nên cần dùng
htmlEncode


Mục liên quan: