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_
或类似的东西,然后发送解码。
我正在使用自定义 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_
或类似的东西,然后发送解码。