Javascript PHP-“文件”&&引用;字符隐藏在$\u POST中

Javascript PHP-“文件”&&引用;字符隐藏在$\u POST中,javascript,php,jquery,database,urlencode,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,

我正在使用一个自定义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
}
因此,如果
#itemsdescription
输入包含一个“&”字符,该字符将被隐藏,后面的文本也将被隐藏

我得到的控制台日志是:

Text with

有没有办法使“&”字符可以识别为任何其他字符,并避免我的文本被截断?

问题在于,您正在以URL编码的字符串发送数据,其中,符号和字符具有特殊含义,需要进行编码

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

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

说了这么多,试试这个:

$.ajax({
url:'m-add-edit.php?',
键入:“POST”,
数据:{
tableName:'项目',
说明:$('#itemsdescription').val()
},
成功:功能(数据){
控制台日志(数据);
},
错误:函数(x、s、e){
控制台日志(x,s,e);
}
});

php中encodeUri的等价物:使用



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

除了发送到服务器的内容之外,您已经记录了所有内容。。。
tableName=Items&description=Text with&and more
?Franko为什么不使用PHP的内置净化功能?@sxkx如何在我的PHP代码中使用它?此外,
params
在发送时具体包括什么<代码>表名=项目和说明=包含和更多内容的文本
?PHP如何猜测中间的
&
不是值之间的分隔符,而是该值的一部分?为什么不使用一个参数数组,让jQuery处理所有转义?如果您不想为此使用数组,那么如果替换
$tableName=$\u POST['tableName'],则需要自己处理特殊字符(正如Andreas在第一条注释中所指出的!)带有
$tableName=filter\u变量($\u POST['tableName'],filter\u SANITIZE\u字符串)
您可以取消
//HTML清理
部分。有关信息,请参见;谢谢,但问题是它是动态数据,我需要将参数字符串设置为“data”,因为我还使用移动sdk调用ajax函数。这个答案在这种情况下仍然有效。它在逻辑上与您已经拥有的完全相同,我只是更改了向AJAX请求提供数据的方式OK,非常感谢,所以我理解了“&”问题,问题是我不知道如何构建一个数组来传递到AJAX函数,并使它与我的m-add-edit.php文件正常工作。我会搜索一些关于它的东西是什么阻止你使用发布的代码?Map
params='tableName=Items&description='+$('#itemsdescription').val()
to
params={tableName:'Items',description:[…]}
在我的情况下,你该怎么做?看Frenchy的帖子,他明确地说出了我的意思。不要手动操作。不要胡乱地将某些东西替换为需要在PHP中以相反方向映射的魔法字符串-如果您的内容在明文中包含
\u和
,会怎么样?这就是为什么我编写了“特定和原始”的方法,我看不出内置方法和我自己的方法之间有任何区别,那只不过是一个简单的例子。谢谢,我试过你的功能,但由于某种原因,它不起作用,我在AWS上有一个Ubuntu服务器,我不知道这是否是问题所在,如果AJAX请求以错误的格式发送数据,这将不起作用事实上,问题在于您的服务器。您的服务器应该正确解码URL否,问题在于AJAX请求发送数据unencoded@NicoHaase是的,这是因为我传递了一个URL字符串“tablename=table&string=text&more&other=blablabla”等等,因此AJAX无法理解什么是关于它的,并且“认为”它是一个分隔符
Text with
function encodeURIComponent($str) {
    $revert = array('%21'=>'!', '%26' =>'&', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');
    return strtr(rawurlencode($str), $revert);
}