2010-11-28 13 views
3

Ich erlaube Benutzern, Webseiten mit CKEditor zu bearbeiten und dann ihre modifizierten HTML-Snippets auf dem Server zu speichern, damit ich sie bei nachfolgenden Seitenlieferungen anzeigen kann.HTML-Code an PHP mit jQuery senden

ich diesen Code bin mit dem HTML und einige IDs an den Server senden:

var datatosend = JSON.stringify({ page: 1, block: 22, content: editor1.getData() }); 

$.ajax({ 
    url: "/ajax/fragment/", 
    type: "POST", 
    dataType: 'json',      
    data: "data=" + datatosend, 
    success: function (html) { }, 
    error: function (xhr, status, msg) { 
    alert(status + " " + msg); 
    } 
});  

Und auf der Server-Seite ich PHP verwende und das tun:

$json = stripslashes($_POST[ "data" ]); 
    $values = json_decode($json, true);  

Dies funktioniert häufig, wenn Nicht-HTML-Snippets gesendet werden, aber nicht funktioniert, wenn so etwas im Inhalt gesendet wird:

<img alt="" src="http://one.localbiz.net/uploads/1/Dido-3_2.JPG" style="width: 173px; height: 130px;" /> 

Ich bin mir nicht sicher, was ich tun soll, um die Daten clientseitig zu verschlüsseln und dann serverseitig zu dekodieren? Auch nicht sicher, ob dataType: 'json' hier am besten ist?

+1

Warum machst du eine stripslashes vor json decode? –

Antwort

3

Das Attribut "dataType" ist der erwartete Rückgabedatentyp aus dem serverseitigen Skript. Da Sie den Aufruf JSON.stringify verwenden, nehme ich an, dass das Skript json2.js oder ähnliches verwendet wird, das die Serialisierung der JSON-Objekte auf der Clientseite ermöglicht.

Sie können die JavaScript escape() - Funktion für den Aufruf von editor1.getData() verwenden, damit die problematischen Zeichen ordnungsgemäß ausgeblendet werden.

Ich habe Folgendes als Test verwendet und das PHP-Programm hat die exakte Kopie des String-Literals zurückgegeben, das an die Escape-Funktion übergeben wurde.

so.html *

<!DOCTYPE html> 
<html><head><title>SO Example</title> 
<script 
    type="text/javascript" 
    src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"> 
</script> 
</head> 
<body> 

<script type="text/javascript"> 
    var $data = 'd=' + escape(
    '<img alt="" src="http://one.localbiz.net/uploads/1/Dido-3_2.JPG" style="width: 173px; height: 130px;" />' 
); 

    $.ajax({ 
    url:"/so.php", 
    type:"post", 
    dataType:"html", 
    data:$data, 
    success:function(obj){ 
     alert(obj); 
    } 
    }); 
</script> 
</body> 
</html> 

so.php *

<?php 
    echo $_POST['d']; 
+0

Cool danke. Haben Sie Informationen darüber, wann Sie escape() oder encodeURIComponent() verwenden sollen? Und was ist in PHP zu tun, wenn Sie beides verwenden? Es scheint eine Menge unterschiedlicher Meinungen im Internet zu geben und vermutlich wird irgendwann die Funktion escape() einen hochgeladenen Charakter konvertieren, der später in PHP erneut konvertiert werden muss? –

+0

Ich glaube, es ist von Fall zu Fall abhängig von dem, was von Client-Seite eingereicht wird.Die Familie der Funktionen escape(), encodeURI() und encodeURIComponent() decken alle unterschiedliche und überlappende Teilmengen von Zeichenübersetzungen ab. Ich denke, das ist der Grund, warum Wiki Markup/Markdown so populär ist für die Bearbeitung von Client-Seiten/Browsern, da es im Allgemeinen weniger speziellen Charakter-Wahnsinn gibt. Dieser Link hat eine gute Abhandlung über die verschiedenen Optionen: http://xkr.us/articles/javascript/encode-compare/. – JTP

2

Ich würde vorschlagen, den PHP-Aufruf zu stripslashes() zu löschen. Du solltest das nicht wirklich brauchen. Es wäre hilfreich, wenn Sie erklären könnten, was mit dem Element img bricht.

Soweit "nicht sicher, ob dataType: 'json' ist das beste Ding hier zu verwenden" Ich würde sagen, es sollte in Ordnung sein. Es wird die Serialisierung korrekt behandeln und Ihnen ermöglichen, nur einen einzelnen Wert zu veröffentlichen.

1

Ich habe diese gleiche genau Szenario, aber ich bin mit YAHOO.lang.JSON. stringify (html) von http://developer.yahoo.com/yui/json/ und PHP json_decode (json) und die Server-Seite, und ich kann html mit einem beliebigen Sonderzeichen haben (zB! @ # $%^& *() + {}: "<>?) Und es in der Datenbank korrekt speichert und von der Datenbank abruft, indem einfach die Reihenfolge umgekehrt wird, um den HTML-Code zu speichern. Ich weiß nicht, ob das nur die Kraft der YUI ist, oder wie es funktioniert, aber es funktioniert ... Ich bin mir auch nicht sicher, ob es einen speziellen HTML-Satz gibt, mit dem es nicht funktioniert, aber ich habe es nicht getan komm schon darüber.