【问题标题】:PHP - "&" character gets hidden in $_POST [closed]PHP - “&”字符隐藏在 $_POST [关闭]
【发布时间】:2021-05-09 21:49:39
【问题描述】:

我正在使用自定义 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 输入包含“&”字符,则该字符将被隐藏,其后的文本也会被隐藏。

我得到的控制台日志是:

Text with

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

【问题讨论】:

  • 除了发送到服务器的内容外,您已经记录了所有内容...tableName=Items&amp;description=Text with &amp; and more 中没有可疑内容?
  • Franko 为什么不使用 PHP 的内置清理功能?
  • @sxkx 如何在我的 PHP 代码中使用它?
  • 另外,params 在发送时究竟包含哪些内容? tableName=Items&amp;description=Text with &amp; and more? PHP 应该如何猜测中间的 &amp; 不是值之间的分隔符,而是该值的一部分?为什么不使用参数数组,让 jQuery 处理所有转义?如果您不想为此使用数组,则需要自己处理特殊字符(正如 Andreas 在第一条评论中指出的那样!)
  • 如果您将$tableName = $_POST['tableName']; 替换为$tableName = filter_var($_POST['tableName'], FILTER_SANITIZE_STRING);,您可以取消// HTML sanitization 部分。有关信息,请参阅; filter_varSanitize filters.

标签: javascript php jquery database urlencode


【解决方案1】:

问题是因为您在 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);
  }
});

【讨论】:

  • 谢谢,但问题是它是动态数据,我需要将参数字符串设置为“数据”,因为我也使用移动 sdk 来调用该 ajax 函数
  • 这个答案仍然适用于这种情况。它在逻辑上与您已经拥有的相同,我只是更改了将数据提供给 AJAX 请求的方式
  • 好的,非常感谢,所以我理解了 '&' 问题,问题是我不知道如何构建一个数组以传递给我的 AJAX 函数并使其与我的m-add-edit.php 文件。我会搜索有关它的东西
  • 是什么让您无法使用发布的代码?将params = 'tableName=Items&amp;description='+ $('#itemDescription').val(); 映射到params = {tableName: 'Items', description: [...] },就完成了
【解决方案2】:

php 中 encodeUri 的等价物:使用rawurlencode

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

【讨论】:

  • 谢谢,我试过你的功能,但由于某种原因,它不起作用,我在 AWS 上有一个 Ubuntu 服务器,不知道是不是这个问题
  • 如果 AJAX 请求以错误的格式发送数据,这将不起作用
  • 事实上问题是你的服务器..你的服务器应该正确解码 url
  • 不行,问题是AJAX请求发送的数据未编码
  • @NicoHaase 是对的,这是因为我传递了一个 URL 字符串,例如 "tablename=table&string=text&more&other=blabla" 等。所以 AJAX 无法理解 & 是什么并且“认为” & 是分隔符
【解决方案3】:

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

【讨论】:

  • 在我的情况下该怎么做?
  • 查看 Frenchy 的帖子,他说的正是我的意思。
  • 不要手动执行此操作。不要摆弄将某些东西替换为您需要在 PHP 中以相反方向映射的魔术字符串 - 如果您的内容在明文中包含 _ampersand_ 怎么办?
  • 这就是为什么我写了“具体和原创”的,我看不出内置的方法和我自己的有什么区别,_ampersand_只是一个简单的例子。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
相关资源
最近更新 更多