AJAX POST i znak Plus ( + ) - jak kodować?
Zamieszczam zawartość pola formularza poprzez AJAX do skryptu PHP i używając JavaScript do escape(field_contents)
. Problem polega na tym, że wszelkie znaki plus są usuwane i zastępowane spacjami. Jak bezpiecznie "zakodować" znak plusa, a następnie odpowiednio "dekodować" go po stronie PHP?
6 answers
Użyj encodeURIComponent()
w JS i w PHP powinieneś otrzymać prawidłowe wartości.
Uwaga: gdy uzyskasz dostęp $_GET
, $_POST
lub $_REQUEST
w PHP pobierasz wartości, które zostały już zdekodowane.
Przykład:
W Twoim 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
Na twoim serwerze:
echo $_GET['string']; // "+"
Jest to tylko surowe żądanie HTTP, które zawiera zakodowane dane URL.
Dla żądania GET można pobrać to z URI. $_SERVER['REQUEST_URI']
lub $_SERVER['QUERY_STRING']
. Dla urlencoded POST, file_get_contents('php://stdin')
NB:
decode()
działa tylko dla znaków zakodowanych pojedynczo. Nie będzie działać dla pełnego zakresu UTF-8.
Eg:
text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100
// correct
encodeURIComponent(text); // "%C4%80"
Uwaga: "%C4%80"
jest równoważne: escape('\xc4\x80')
, który jest sekwencją bajtów (\xc4\x80
) reprezentującą Ā
w UTF-8. Więc jeśli używasz encodeURIComponent()
Twoja strona serwera musi wiedzieć, że odbiera UTF-8. W przeciwnym razie PHP zmieni kodowanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 14:00:00
W JavaScript spróbuj:
encodeURIComponent()
Oraz w PHP:
urldecode($_POST['field']);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 11:43:48
Wartość szesnastkowa, której szukasz to %2B
Aby uzyskać go automatycznie w PHP, Uruchom łańcuch poprzez urlencode($stringVal)
. A następnie uruchom go rhough urldecode($stringVal)
, aby go odzyskać.
Jeśli chcesz, aby obsługiwał go JavaScript, użyj escape( str )
Edit
Po komentarzu @ bobince przeczytałem więcej i ma rację.
Użyj encodeURIComponent(str)
i decodeURIComponent(str)
. Escape nie konwertuje znaków, tylko ucieka z \
' s
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-03 15:31:20
Aby uczynić go bardziej interesującym i miejmy nadzieję, że umożliwi mniej ciągnięcia włosów dla kogoś innego. Używając Pythona, zbudowaliśmy słownik dla urządzenia, które możemy użyć curl do konfiguracji.
Problem: {"timezone":"+5"} //throws an error " 5"
Rozwiązanie: {"timezone":"%2B"+"5"} //Works
W skrócie:
var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])
Thanks to this post!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-06 22:38:39
Jeśli musisz zrobić curl w php, powinieneś użyć urlencode()
z PHP, ale indywidualnie!
strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")
Jeśli zrobisz urlencode(strPOST)
, przyniesie ci inny problem, będziesz miał JEDEN Przedmiot1 i & będzie zmienić wartość % xx i być jako jedna wartość, zobacz tutaj powrót!
Przykład 1
$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B
Przykład 2
$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B
Przykład 1 to dobry sposób na przygotowanie napisu do posta w curl
Przykład 2 pokazuje, że receptor nie będzie widział równych i amperów, aby rozróżnić oba wartość!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-23 07:33:54
Mój problem był z akcentami (á é ñ ) i znakiem plus ( + ), gdy próbowałem zapisać javascript "przykłady kodu" do mysql:
Moje rozwiązanie (nie lepsze, ale działa):
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;
}
Funkcja do zapisania:
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
Funkcja w 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'");
}
?>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-22 20:41:55