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

时间:2021-02-05 14:40:01

标签: javascript php jquery database urlencode

我正在使用自定义 PHP 文件将数据发送到我的 JSON 文件并对其进行更新,但是如果“&”字符在字符串中,则该字符串将被截断,并且“&? char 和 '&' 被隐藏。

m-add-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 输入包含一个 '&' 字符,它会被隐藏,它后面的文本也会被隐藏。

enter image description here

我得到的控制台日志是:

Text with

有没有办法让 '&' 字符可识别为任何其他字符并避免我的文本被截断?

3 个答案:

答案 0 :(得分:3)

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

但是,对于 POST 请求,您应该在请求正文中传递值,而不是 URL。使用 jQuery 执行此操作的最简单方法是向 data 设置的 $.ajax 属性提供一个对象,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);
  }
});

答案 1 :(得分:0)

相当于php中的encodeUri:使用rawurlencode

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

答案 2 :(得分:-1)

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