PHP - "&" 字符被隐藏在 $_POST 中

PHP - "&" character gets hidden in $_POST

我正在使用自定义 PHP 文件将数据发送到我的 JSON 文件并更新它,但是如果“&”字符进入字符串,该字符串将被截断并且文本在那之后 '&? char 以及 '&' 被隐藏。

m-加-edit.php:

<?php 
header('Content-Type: text/html; charset=ISO-8859-1');
$tableName = $_POST['tableName'];

// HTML sanitization
if (strpos($tableName, '<') !== false || strpos($tableName, '>') !== false
){ $tableName = preg_replace("/[^a-zA-Z]/", "", $tableName); }

// Get JSON Table's Data
$data = file_get_contents($tableName. '.json');
$data_array = json_decode($data, true);

// SAVE DATA
$newDataArr = array();

foreach ($data_array[0] as $k=>$v){
    $keysArr = explode("_", $k);
    $kType = $keysArr[0];
    $kName = $keysArr[1];

    echo $_POST[$k]; // This is just to test the output when sending data
}

以下是我用来从输入字段 (#itemDescription) 获取值并调用上面的 PHP 文件的 AJAX 函数:

var params = 'tableName=Items&description='+ $('#itemDescription').val();

    $.ajax({
        url : 'm-add-edit.php?',
        type: 'POST',
        data: params,
        async: false,
        success: function(data) {
            console.log(data); // <-- JUST TO TEST THE OUTPUT
    
        // error
        }, error: function(e) {  
    }});

所以,如果 #itemDescription 输入包含一个“&”字符,它会被隐藏,它后面的文本也会被隐藏。

我得到的控制台日志是:

Text with

有没有办法让“&”字符像其他任何字符一样被识别并避免我的文本被截断?

问题是因为您在 URL 编码字符串中发送数据,其中 & 字符具有特殊含义,需要进行编码。

但是,对于 POST 请求,您应该在请求正文中传递值,而不是 URL。使用 jQuery 执行此操作的最简单方法是为 $.ajax 设置的 data 属性 提供一个对象,而 jQuery 将负责编码它正确并为您将其设置在请求的正确部分。

此外,您应该删除 async: false 设置。始终异步发送 AJAX 请求,因为不推荐使用同步请求并将在浏览器控制台中显示警告。当您正确使用回调时,您根本不需要 async: false

综上所述,试试这个:

$.ajax({
  url: 'm-add-edit.php?',
  type: 'POST',
  data: {
    tableName: 'Items',
    description: $('#itemDescription').val()
  },
  success: function(data) {
    console.log(data);
  },
  error: function(x, s, e) {
    console.log(x, s, e);
  }
});

相当于 php 中的 encodeUri:使用 rawurlencode

function encodeURIComponent($str) {
    $revert = array('%21'=>'!', '%26' =>'&', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');
    return strtr(rawurlencode($str), $revert);
}

如果您对特定符号有疑问,为什么不使用一些替换功能并将 & 更改为其他特定和原始符号,例如:_ampersand_ 或类似的东西,然后发送解码。