带换行符的文本通过Ajax / JavaScript返回\ r \ n文本

时间:2018-09-20 16:47:50

标签: javascript php jquery ajax

除了在JavaScript,Ajax和PHP之间来回传递值的问题外,其他代码均能正常工作。使用TinyMCE作为编辑器,当我在文本中添加一个段落分隔符时,保存数据(通过JavaScript / Ajax和PHP传递数据),文本看起来还可以。这是JavaScript和Ajax代码-可以正常工作,当单击“提交”按钮时,它将数据正确传递给PHP程序:

  // save the main who's who form data:
  $("form#who_main").submit(function(e)
  {
     e.preventDefault();

     // first thing, clear out the message div used for this (if there's anything there):
     document.getElementById("who_message").innerHTML = "";

     // because we're using TinyMCE, need to replace value in that into the textarea
     // so that when JavaScript gathers the formData it is getting it from the textarea
     // controls (it doesn't know what to do with TinyMCE):
     var shortbio = tinymce.get('shortbio').getContent();
     document.getElementById( "shortbio" ).value = shortbio;
     var user_notes = tinymce.get('user_notes').getContent();
     document.getElementById( "user_notes" ).value = user_notes;
     var admin_notes = tinymce.get('admin_notes').getContent();
     document.getElementById( "admin_notes" ).value = admin_notes;

     // this loads all the controls of the form rather than doing one at a time and fumbling
     // with the file object ...:
     var formData = new FormData(this);

     // ajax call to attempt to upload and save the image:
     $.ajax
     ({
        type: "POST",
        url: "<?php echo $History_html_RootPath; ?>admin/AjaxCalls/who_update_main_save.php",
        data: formData,
        dataType: "json", // return value is json array
        processData : false,
        contentType: false,
        success: function(data)
        {
           // need to see if we have an error, if so, display it, otherwise,
           // we should hopefully have success ...
           if ( data[0].toLowerCase().includes( "error" ) )
           {
              var errormsg = "<div class='alert alert-danger'>"+data+"</div>";
              document.getElementById("who_message").innerHTML = errormsg;
              return;
           }
           else
           {
              // success!

              // update things on screen, so we don't get confused using the data array returned
              // from PHP:
              document.getElementById("namecode").value                = data[0];
              document.getElementById("region").value                  = data[1];
              document.getElementById("local").value                   = data[2];
              document.getElementById("preferredtitle").value          = data[3];
              document.getElementById("shortbio").value                = data[4];
              tinymce.get('shortbio').setContent( data[4] );
              document.getElementById("headshotphoto").value           = data[5];
              document.getElementById("photographername").value        = data[6];
              document.getElementById("photographerlink").value        = data[7];
              document.getElementById("user_notes").value              = data[8];
              tinymce.get('user_notes').setContent( data[8] );
              document.getElementById("admin_notes").value             = data[9];
              tinymce.get('admin_notes').setContent( data[9] );

              // clear out the upload file control:
              //document.getElementById("headshotphoto").value           = "";

              // change the message:
              var message = "<div class='alert alert-success'>";
                  message += "<b>Success!</b> This data has been updated in the <i>holding</i> table.";
                  message += "</div>";
              document.getElementById("who_message").innerHTML = message;
              return;
           }
        }  // end success
     }); // end ajax call
  }) // end of code associated with who_main submit

PHP文件通过发布接收数据,我使用PHP函数mysqli_real_escape_string()处理问题。这样做的一个问题是它似乎在引号中插入了反斜杠(单引号和双引号),依此类推。我只是想到可能是问题的原因,这是我不确定的原因。我将对其进行测试,但与此同时。 ...我将数据保存到表中,一切都很好。如果出现段落中断,则将适当的标签保存到表中。      

一些文本

更多文本为“引用文本”

当我使用JSON编码将数据传回时:

$returndata = array();
$returndata[0]  = $namecode;
$returndata[1]  = $region;
$returndata[2]  = $local;
$returndata[3] = $preferredtitle;
$returndata[4] = $shortbio;
$returndata[5] = $photo_file;
$returndata[6] = $photographername;
$returndata[7] = $photographerlink;
$returndata[8] = $user_notes;
$returndata[9] = $admin_notes;
// done-done:
echo json_encode( $returndata );
return;

上面的代码(javascript / Ajax代码)回来看起来像:     

一些文本

\ r \ n

更多文本\“引用文本”

我不需要在文本中显示\ r \ n和\'(或\“)。如果我要再次保存它,因为反斜杠被重复等等,它会变得很奇怪。有一些我想念的东西,但我不知道是什么,这让我发疯,因为其他所有东西都可以按我的需要正常工作。

注意添加了我尝试在PHP中使用的代码来处理“转义符”,它适用于单引号和双引号,但不适用于\ r \ n字符-而是它只是去除反斜杠:

function remove_escapes( $string )
{
   $string = str_replace ( "\'", "&#039;", $string ); // convert single quote
   $string = str_replace ( "\"", "&quot;", $string ); // convert double-quote
   $string = str_replace ( "\r\n", "", $string ); // remove \r\n
   $string = str_replace ( "\\", "", $string ); // remove slash
   // anything else giving us heartburn?
   return $string;
} // eof: remove_escapes()

如果将其与json数组一起使用,则会在段落之间插入字母rn:

$returndata[8] =  remove_escapes( $user_notes );
$returndata[9] =  remove_escapes( $admin_notes );

4 个答案:

答案 0 :(得分:0)

也许会做类似data.replace(/\n/g, '<br>')的操作,这将用html newline或data.replace(/\\n/g, '<br>')替换所有换行标记以查找字符而不是换行标记

答案 1 :(得分:0)

我已经做了一些测试以检查数据,由于从$ _POST()数组中获取数据时,由于mysqli_real_escape_string()函数的缘故,它似乎正在发生。如果我将其取出,则不会获得\ r \ n代码。因此,也许jquery帖子以我不需要该功能的方式传递东西?在三种不同的文本控件上进行的进一步测试表明,它无需使用mysqli_real_escape_string即可正常工作,并且我还有一些额外的功能可以处理在文本中查找JavaScript等问题,因此我可以简化代码。除非有人能告诉我不这样做的理由...?

答案 2 :(得分:0)

mysqli_real_escape_string()在那里可以转义特殊字符,这有助于防止sql注入之类的黑客攻击。

答案 3 :(得分:0)

看来,我能找到的唯一解决方案是继续mysqli_real_escape_string(),但在将信息传回时,保存更改后,从表中重新加载数据,该表不显示转义字符,因此避免了这个问题。似乎有很多额外的数据处理,但是一次(来回传递)一次(在我的代码中)。