Ajax Post و Plus Sign ( +) - كيفية التشفير؟
-
21-09-2019 - |
سؤال
أقوم بنشر محتويات حقل النموذج عبر AJAX إلى برنامج نصي PHP واستخدام JavaScript escape(field_contents)
. المشكلة هي أنه يتم تجريد أي علامات زائد واستبدالها بالمساحات. كيف يمكنني "تشفير" علامة Plus بأمان ثم فك "فك تشفيرها" على جانب PHP؟
المحلول
يستخدم encodeURIComponent()
في JS وفي PHP ، يجب أن تتلقى القيم الصحيحة.
ملاحظة: عند الوصول إلى $_GET
, $_POST
أو $_REQUEST
في PHP ، تقوم باسترداد القيم التي تم فك تشفيرها بالفعل.
مثال:
في JS الخاص بك:
// url encode your string
var string = encodeURIComponent('+'); // "%2B"
// send it to your server
window.location = 'http://example.com/?string='+string; // http://example.com/?string=%2B
على الخادم الخاص بك:
echo $_GET['string']; // "+"
هو فقط طلب HTTP الخام الذي يحتوي على البيانات المشفرة عناوين URL.
للحصول على طلب ، يمكنك استرداد هذا من URI. $_SERVER['REQUEST_URI']
أو $_SERVER['QUERY_STRING']
. للحصول على وظيفة urlencoded ، file_get_contents('php://stdin')
NB:
decode()
يعمل فقط مع الأحرف المشفرة بايت واحد. لن يعمل لنطاق UTF-8 الكامل.
على سبيل المثال:
text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100
// correct
encodeURIComponent(text); // "%C4%80"
ملحوظة: "%C4%80"
يعادل: escape('\xc4\x80')
وهو تسلسل البايت (\xc4\x80
) وهذا يمثل Ā
في UTF-8. لذلك إذا كنت تستخدم encodeURIComponent()
يجب أن يعرف جانب الخادم الخاص بك أنه يتلقى UTF-8. وإلا فإن PHP سوف ينقل الترميز.
نصائح أخرى
في JavaScript جرب:
encodeURIComponent()
وفي PHP:
urldecode($_POST['field']);
القيمة السداسية السداسية التي تبحث عنها %2B
للحصول عليها تلقائيًا في PHP ، قم بتشغيل السلسلة الخاصة بك من خلال urlencode($stringVal)
. ثم قم بتشغيله urldecode($stringVal)
لاستعادتها.
إذا كنت تريد أن تعالجها JavaScript ، فاستخدمها escape( str )
تعديل
بعد تعليق @Bobince فعلت المزيد من القراءة وهو محق. يستخدم encodeURIComponent(str)
و decodeURIComponent(str)
. الهروب لن يحول الشخصيات ، فقط هرب منها \
'س
لجعلها أكثر إثارة للاهتمام ونأمل أن نمكّن من سحب الشعر لشخص آخر. باستخدام Python ، قام القاموس المبني لجهاز يمكننا استخدام Curl لتكوينه.
مشكلة: {"timezone":"+5"} //throws an error " 5"
المحلول: {"timezone":"%2B"+"5"} //Works
لذلك ، باختصار:
var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])
شكرا لهذا المنصب!
إذا كان عليك أن تفعل حليقة في PHP ، فيجب عليك استخدامها urlencode()
من PHP ولكن بشكل فردي!
strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")
اذا فعلت urlencode(strPOST)
, ، سوف تجلب لك مشكلة أخرى ، سيكون لديك عنصر واحد 1 وسيكون تغيير قيمة xx وستكون كقيمة واحدة ، انظر هنا العائد!
مثال 1
$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B
مثال 2
$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B
مثال 1 هو الطريقة الجيدة لإعداد سلسلة للنشر في حليقة
مثال 2 أظهر أن المستقبلات لن يرى المساواة والأمبر والأمبير لتمييز كلتا القيمة!
كانت مشكلتي مع اللهجات (á é) وعلامة Plus (+) عندما أحاول حفظ "أمثلة رمز" JavaScript إلى MySQL:
الحل الخاص بي (ليس الطريقة الأفضل ، لكنه يعمل):
JavaScript:
function replaceAll( text, busca, reemplaza ){
while (text.toString().indexOf(busca) != -1)
text = text.toString().replace(busca,reemplaza);return text;
}
function cleanCode(cod){
code = replaceAll(cod , "|", "{1}" ); // error | palos de explode en java
code = replaceAll(code, "+", "{0}" ); // error con los signos mas
return code;
}
وظيفة لحفظ:
function save(pid,code){
code = cleanCode(code); // fix sign + and |
code = escape(code); // fix accents
var url = 'editor.php';
var variables = 'op=save';
var myData = variables +'&code='+ code +'&pid='+ pid +'&newdate=' +(new Date()).getTime();
var result = null;
$.ajax({
datatype : "html",
data: myData,
url: url,
success : function(result) {
alert(result); // result ok
},
});
} // end function
وظيفة في PHP:
<?php
function save($pid,$code){
$code= preg_replace("[\{1\}]","|",$code);
$code= preg_replace("[\{0\}]","+",$code);
mysql_query("update table set code= '" . mysql_real_escape_string($code) . "' where pid='$pid'");
}
?>