2009-09-03 7 views
76

Ich POST den Inhalt eines Formularfelds über AJAX zu einem PHP-Skript und mit JavaScript zu escape(field_contents). Das Problem ist, dass alle Pluszeichen entfernt und durch Leerzeichen ersetzt werden. Wie kann ich das Pluszeichen sicher verschlüsseln und dann auf der PHP-Seite entschlüsseln?AJAX POST und Plus Zeichen (+) - Wie zu kodieren?

+0

zu klären, ich war escape (field_contents), nicht codieren – jalperin

Antwort

113

Verwenden Sie encodeURIComponent() in JS und in PHP sollten Sie die richtigen Werte erhalten.

Hinweis: Wenn Sie in PHP auf $_GET, $_POST oder $_REQUEST zugreifen, rufen Sie Werte ab, die bereits decodiert wurden.

Beispiel:

In Ihrem 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 

Auf dem Server:

echo $_GET['string']; // "+" 

Es ist nur die Roh-HTTP-Anforderung, dass die URL-codierten Daten enthält.

Für eine GET-Anfrage können Sie diese aus dem URI. $_SERVER['REQUEST_URI'] oder $_SERVER['QUERY_STRING'] abrufen. Für eine urlencoded POST, file_get_contents('php://stdin')

NB:

decode() funktioniert nur für einzelne Byte codierte Zeichen. Es wird nicht für den gesamten UTF-8-Bereich funktionieren.

Beispiel:

text = "\u0100"; // Ā 
// incorrect 
escape(text); // %u0100 
// correct 
encodeURIComponent(text); // "%C4%80" 

Anmerkung: "%C4%80" entspricht: escape('\xc4\x80')

Welche die Byte-Sequenz (\xc4\x80), der eine in UTF-8 darstellt. Wenn Sie also encodeURIComponent() verwenden, muss Ihre Serverseite wissen, dass sie UTF-8 empfängt. Ansonsten wird PHP die Kodierung fehlerhaft machen.

+0

Ein Follow-up: Wenn ich codiereURIComponent (Text) und Text enthält Zeichen wie das intelligente Zitat (&rsqo;), scheint das PHP-Skript Junk-Zeichen zu sehen. Ich nehme an, es ist ein Zeichensatzproblem, aber ich weiß nicht, wie ich es lösen soll. Ich mache den AJAX POST mit "Content-Type": "application/x-www-form-urlencoded; charset = UTF-8", und ich benutze PHP5 auf der Serverseite. – jalperin

+0

Wie siehst du diese Charaktere? Sie müssen sicherstellen, dass der Browser weiß, dass es UTF-8 ist. In HTML können Sie '' oder '' Sie können es auch einstellen in PHP mit dem Content-Type HTTP Header.'header ('Content-Type: text/html; Zeichensatz = UTF-8');' PS: &rsqo; dekodiert nicht im Browser (FF3.5). – bucabay

+1

Ich liebe euch !!! du hilfst mir immer !! :) – Alejandra

15

In JavaScript versuchen:

encodeURIComponent() 

und in PHP:

urldecode($_POST['field']); 
+7

encodeURIComponent ist die richtige Antwort - aber wie es URL-codierte Daten und nicht HTML-codierte Daten generiert, ist html_entity_encode weg. – Quentin

5

Der hexadezimale Wert Sie suchen, ist %2B

Um es automatisch in PHP führen Sie Ihre Schnur durch urlencode($stringVal) zu erhalten . Und dann rufe es rhough urldecode($stringVal), um es zurück zu bekommen.

Wenn Sie die JavaScript wollen es zu handhaben, verwenden escape(str)

bearbeiten

Nach @ bobince Kommentar ich mehr Lesung tat, und er ist richtig. Verwenden Sie encodeURIComponent(str) und decodeURIComponent(str). Escape wandelt die Zeichen nicht um, entkomme sie nur mit \ 's

+1

* Verwenden Sie 'escape' (oder' unescape') nicht in JavaScript; Sie sind nicht identisch mit der URL-Codierung und gehen bei + und allen Nicht-ASCII-Unicode-Zeichen fehl. encodeURIComponent/decodeURIComponent ist fast immer was Sie wollen. – bobince

1

Wenn Sie eine Curl in PHP machen müssen, sollten Sie urlencode() von PHP aber einzeln verwenden!

strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") 

Wenn Sie urlencode(strPOST) tun, Sie Sie ein anderes Problem bringen wird, Sie ein element1 haben und & wird hier unten die Rückkehr ändern% xx Wert und sein als ein Wert, siehe sein!

Beispiel 1

$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B 

Beispiel 2

$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B 

Beispiel 1 ist die gute Möglichkeit Zeichenfolge für POST in curl

Beispiel 2 zeigen, herzustellen, dass der Rezeptor nicht die gleich siehe und das kaufmännische Und, um beide Werte zu unterscheiden!

0

mein Problem war, mit den Akzenten (á d e) und das Pluszeichen (+), wenn ich versuche javascript „Code-Beispiele“ zu mysql speichern:

meine Lösung (nicht der bessere Weg, aber es Werke):

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; 
} 

Funktion zu speichern:

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 

fu nction in 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'"); 
} 
?> 
3

Um es interessanter zu machen und hoffentlich weniger Haare ziehen für jemand anderen zu ermöglichen. Mit Python, gebaut Wörterbuch für ein Gerät, das wir verwenden können, um zu konfigurieren.

Problem: {"timezone":"+5"} //throws an error " 5"

Lösung: {"timezone":"%2B"+"5"} //Works

Also, auf den Punkt:

var = {"timezone":"%2B"+"5"} 
json = JSONEncoder().encode(var) 
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json]) 

Dank diesem Beitrag!