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?

Author: Web_Designer, 2009-09-03

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.

 123
Author: bucabay,
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']);
 17
Author: Deniss Kozlovs,
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

 5
Author: Rob Allen,
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!

 3
Author: Pawr,
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ść!

 0
Author: Marc,
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'");
}
?>
 -1
Author: BX16Soupapes,
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