Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przesyłanie danych z formularza przez Ajax - problem z textarea
Forum PHP.pl > Forum > XML, AJAX
Sztef89
Witam, otóż robię projekt na zaliczenie przedmiotu i nie mogę poradzić sobie z przesłaniem zawartości textarea. Kod wygląda następująco:

//EDIT:
Problem udało mi się rozwiązać ! Korzystam z pluginu tinyMC do edycji tekstu zanim będzie wysłany do bazy danych. Po edytowaniu tekstu należało wyłączyć pulgin i dopiero odpalić skrypt przyciskiem - wtedy ładnie przekazuje tekst do bazy z jednym małym wyjątkiem...
Edytowany tekst nie zostaje w całości przekazany do bazy, zostaje okrojony do ok 100-200 znaków a czasem mniej... wiedzie może o co chodzi ?
Zwykły tekst w całości przekazuje do bazy, natomiast kod html, który właśnie znajduje się w tym polu ucina albo nic nie wysyła...

HTML:
  1. <div id="edytor2">
  2. <form name="edycja">
  3. Nazwa ćwiczenia: <input type="text" name="tytul" size="50" /><br/>
  4. <input type="hidden" name="przedmiot" value="'.$przedmiot.'"/>
  5. <input type="hidden" name="lab" value="'.$lab.'"/>
  6. <center><textarea id="elm1" name="elm1" rows="16" cols="20" style="width: 100%"></textarea></center>
  7. <left><input type="button" name="zapisz" value="Zapisz" class="groovybutton" title="" onmouseover="goLite(this.form.name,this.name)" onmouseout="goDim(this.form.name,this.name)" onclick="MyRequestAjax(value);"/></left>
  8. <a href="java script:;" onmousedown="tinyMCE.get('."'elm1'".').show();">Pokaż edytor</a>
  9. <a href="java script:;" onmousedown="tinyMCE.get('."'elm1'".').hide();">Schowaj edytor</a>
  10. </form>
  11. </div>

Ajax:
  1. var xmlHttp
  2. function MyRequestAjax() {
  3. xmlHttp = GetXmlHttpObject();
  4. var urll = document.edycja.przedmiot.value;
  5. var urll2 = document.edycja.lab.value;
  6. var urll3 = document.edycja.tytul.value;
  7. var urll4 = document.edycja.elm1.value;
  8. var url = "dodajcw.php?&opcja=3"+"&przedm="+urll+"&lab="+urll2+"&tytul="+urll3+"&tresc="+urll4;
  9. xmlHttp.onreadystatechange = stateChanged;
  10. xmlHttp.open("GET", url, true);
  11. xmlHttp.send(null);
  12. }
  13. function stateChanged() {
  14. if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {
  15. document.getElementById("edytor2").innerHTML=xmlHttp.responseText;
  16. }
  17. }
  18. function GetXmlHttpObject() {
  19. var request = null;
  20. if (window.XMLHttpRequest) {
  21. request = new XMLHttpRequest();
  22. }
  23. else if (window.ActiveXObject) {
  24. request=new ActiveXObject("Microsoft.XMLHTTP");
  25. }
  26. return request;
  27. }

Wszystkie dane czyli:
  1. var urll = document.edycja.przedmiot.value;
  2. var urll2 = document.edycja.lab.value;
  3. var urll3 = document.edycja.tytul.value;

Przesyłają się bez problemu do mojego skryptu php jedynie jest problem z pobieraniem zawartości pola textarea o nazwie elm1:
  1. var urll4 = document.edycja.elm1.value;

Przed chwilą próbowałem:
  1. var urll4 = document.getElementById("elm1").value;

Ale tez nie działa sad.gif
Zauważyłem, ze w obu przypadkach jak zmienię .value na np. .name to wyświetla się nazwa tego textarea, czyli jest prawie dobrze... może jakoś inaczej się pobiera zawartość textarea ?

Może projekt ciekawy wybrałem, ale jest bardzo problemowy, mam nadzieje, że pomożecie mi rozwiązać ten problem bo z reszta dam radę smile.gif
Z góry dzięki !
krowal
Takie dane to się wysyła przez 'POST' a nie 'GET'. Jak tak robisz to się nie dziw, że długie pola z różnymi dziwnymi znakami, końcami linni itp. nie dochodzą w całości gdy są przesyłane w urlu.
Sztef89
Dzięki za podpowiedź.

Niestety jeszcze mam problem. Skrypt z pierwszego posta zmieniłem na następujący:
  1. var xmlHttp
  2. function MyRequestAjax() {
  3. xmlHttp = GetXmlHttpObject();
  4. var przed = document.edycja.przedmiot.value;
  5. var lab = document.edycja.lab.value;
  6. var tytul = document.edycja.tytul.value;
  7. var tresc = document.edycja.elm1.value;
  8. xmlHttp.open("POST", "dodajcw.php");
  9. xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  10. xmlHttp.send('opcja=3' + '&przedm=' + escape(przed) + '&lab=' + escape(lab) + '&tytul=' + escape(tytul) + '&tresc=' + escape(tresc));
  11. xmlHttp.onreadystatechange = stateChanged;
  12. }
  13. function stateChanged() {
  14. if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {
  15. document.getElementById("edytor2").innerHTML=xmlHttp.responseText;
  16. }
  17. }
  18. function GetXmlHttpObject() {
  19. var request = null;
  20. if (window.XMLHttpRequest) {
  21. request = new XMLHttpRequest();
  22. }
  23. else if (window.ActiveXObject) {
  24. request=new ActiveXObject("Microsoft.XMLHTTP");
  25. }
  26. return request;
  27. }


Teraz zrobiło się tak, że wcale danych nie wysyła. Użyłem funkcji escape do kodowania tekstu przed wysłaniem.
Proszę o wyjaśnienie co robię źle i jak powinno być. Mam małe doświadczenie w ajaxie... sad.gif
ylk
użyj funkcji encodeURIComponent()
Sztef89
używając escape() lub encodeURIComponent() pojawia się następujący błąd:
Cytat
Could not enter data: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'POST", "dodajcw.php");
xmlHttp.setRequestHeader('Content-Type', 'appl' at line 1


Jak wysyłam normalnie POSTem bez tych funkcji to ucina mi kod, i zamiast wysłać:

Cytat
<p>
<div>var xmlHttp</div>
<div>function MyRequestAjax() {</div>
<div>xmlHttp = GetXmlHttpObject();</div>
<div>var przed &nbsp;= document.edycja.przedmiot.value;</div>
<div>var lab = document.edycja.lab.value;</div>
<div>var tytul = document.edycja.tytul.value;</div>
<div>var tresc = document.edycja.elm1.value;</div>
<div>xmlHttp.open("POST", "dodajcw.php");</div>
<div>xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');</div>
<div>xmlHttp.send('&amp;opcja=3' + '&amp;przedm=' + przed + '&amp;lab=' + lab + '&amp;tytul=' + tytul + '&amp;tresc=' + tresc);</div>
<div>xmlHttp.onreadystatechange = stateChanged;</div>
<div>}</div>
<div>function stateChanged() {</div>
<div>if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {</div>
<div>document.getElementById("edytor2").innerHTML=xmlHttp.responseText;</div>
<div>}</div>
<div>}</div>
<div>function GetXmlHttpObject() {</div>
<div>var request = null;</div>
<div>if (window.XMLHttpRequest) {</div>
<div>request = new XMLHttpRequest();</div>
<div>}</div>
<div>else if (window.ActiveXObject) {</div>
<div>request=new ActiveXObject("Microsoft.XMLHTTP");</div>
<div>}</div>
<div>return request;</div>
<div>}</div>
</p>


Wysyła tylko tyle(skopiowałem z bazy):
Cytat
<p>
<div>var xmlHttp</div>
<div>function MyRequestAjax() {</div>
<div>xmlHttp = GetXmlHttpObject();</div>
<div>var przed
Zbigizmi
bo traktuje wszystko, co jest po & jako następną zmienną.
Musisz po stronie serwera to zdekodować zanim prześlesz do bazy.
urldecode()

http://pl2.php.net/manual/pl/function.urldecode.php
Sztef89
Ok rozumiem. Ogólnie czałośc działa tak:

1. Wprowadam kod do edytora Tiny MCE
2. Wyłaczam Tiny MCE aby zostało samo textarea bo z włączonym edytorem nie przekazuje danych (niewiadomo dlaczego)
3. Klikam na przycisk "Zapisz" i włącza się ajaxowy skrypt, który pobiera dane z pól
4. Skrypt wysyła dane do php
5. php zapisuje dane do bazy

Gdy wypisuję zawartość zmiennej $tresc przed zapisaniem jej zawartości do bazy to już wtedy tekst jest ucięty.
Funkcję, którą musiałbym użyć np. urldecode() musze uruchomić przed wysłaniem danych do skryptu (czyli pomiędzy pkt 3 a 4), czyli bezpośrednio w skrypcie js, czyli tu:
Cytat
var xmlHttp
function MyRequestAjax() {
xmlHttp = GetXmlHttpObject();
var przed = document.edycja.przedmiot.value;
var lab = document.edycja.lab.value;
var tytul = document.edycja.tytul.value;
var tresc = document.edycja.elm1.value;
xmlHttp.open("POST", "dodajcw.php");
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttp.send('&opcja=3' + '&przedm=' + przed + '&lab=' + lab + '&tytul=' + tytul + '&tresc=' + tresc); //w tej linijce trzeba jakoś zakodować treść aby plik php przyjął ją w całości
xmlHttp.onreadystatechange = stateChanged;
}
function stateChanged() {
if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {
document.getElementById("edytor2").innerHTML=xmlHttp.responseText;
}
}
function GetXmlHttpObject() {
var request = null;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
request=new ActiveXObject("Microsoft.XMLHTTP");
}
return request;
}


moglibyście pomóc to zrobić żeby zapisywało do bazy znaki np. $&^%!@ i się nie zatrzymywało na nich ? smile.gif
jakbym wiedział jak to zrobić to bym nie prosił, troszkę czarna magia to dla mnie jest smile.gif
Zbigizmi
htmlspecialchars

http://pl2.php.net/manual/pl/function.htmlspecialchars.php

pamiętaj, gdy chcesz to odczytać to musisz użyć

htmlspecialchars_decode
Sztef89
ale
htmlspecialchars — Convert special characters to HTML entities
czyli zmienia znak " na &amp; czyli znów pojawia się ten głupi znak & przy którym ucina...

po drugie jak te funkcje użyć w skrypcie co podałem w poprzednim poście ? normalnie zmienić tresc na htmlspecialchars(tresc) questionmark.gif

może to przez md5 zakodować ? biggrin.gif
Zbigizmi
Zatem mamy dwie sprawy.
1. Przesyłanie ze strony do serwera i wtedy używamy urlencode i decode, ponieważ to zastępuje znaki typu &
2. Kodowanie po stronie serwera, żeby zapisać w bazie danych i wtedy chcemy wszytkie znaki typu < > " itp zastąpić '&xxx;', bo tutaj nam znak & nie przeszkadza.

To są dwie odrębne sprawy.

Możesz to zakodować w md5 -- tylko, że.... tego już nie odczytasz.
Kodowanie md5 ze względów bezpieczeństwa nie da się odkodować i używa się do kodowania haseł.
Jak znam hasło, to mogę je zakodować i porównać zakodowane ale odkodować się nie da smile.gif))
Sztef89
Kurde, głupie to trochę biggrin.gif

zakodowałem w pliku php przed wysłaniem do serwera i mam takie coś:
Cytat
%3Cp%3E%0A%3Cdiv%3Evar+xmlHttp%3C%2Fdiv%3E%0A%3Cdiv%3Efunction+MyRequestAjax%28%29+%7B%3C%2Fdiv%3E%0A%3Cdiv%3ExmlHttp+%3D+GetXmlHttpObject%28%29%3B%3C%2Fdiv%3E%0A%3Cdiv%3Evar+przed+


A wcześniej było:
Cytat
<p>
<div>var xmlHttp</div>
<div>function MyRequestAjax() {</div>
<div>xmlHttp = GetXmlHttpObject();</div>
<div>var przed


wychodzi na to, że tekst ucinany jest wtedy gdy trafia do skryptu php lub wcześniej... :/
Kurcze resztę projektu zrobiłem i to zostało sad.gif A bez tego projekt nie przejdzie bo to najważniejsze sad.gif

Zrobiłem taki test w php:
Cytat
$test ="<p>
<div>var xmlHttp</div>
<div>function MyRequestAjax() {</div>
<div>xmlHttp = GetXmlHttpObject();</div>
<div>var przed &nbsp;= document.edycja.przedmiot.value;</div>
<div>var lab = document.edycja.lab.value;</div>
<div>var tytul = document.edycja.tytul.value;</div>
<div>var tresc = document.edycja.elm1.value;</div>
<div>xmlHttp.open('POST', 'dodajcw.php');</div>
<div>xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');</div>
<div>xmlHttp.send('&amp;opcja=3' + '&amp;przedm=' + przed + '&amp;lab=' + lab + '&amp;tytul=' + tytul + '&amp;tresc=' + tresc);</div>
<div>xmlHttp.onreadystatechange = stateChanged;</div>
<div>}</div>
<div>function stateChanged() {</div>
<div>if (xmlHttp.readyState == 4 || xmlHttp.readyState == 'complete') {</div>
<div>document.getElementById('edytor2').innerHTML=xmlHttp.responseText;</div>
<div>}</div>
<div>}</div>
<div>function GetXmlHttpObject() {</div>
<div>var request = null;</div>
<div>if (window.XMLHttpRequest) {</div>
<div>request = new XMLHttpRequest();</div>
<div>}</div>
<div>else if (window.ActiveXObject) {</div>
<div>request=new ActiveXObject('Microsoft.XMLHTTP');</div>
<div>}</div>
<div>return request;</div>
<div>}</div></p>";

echo $test;


i tu się ładnie kod wyświetla i nic nie ucina... czyli to nie wina skryptu php tylko skryptu js który kod podawałem wcześniej.
pewnie gdy wykonuje tą linijkę:
var tresc = document.edycja.elm1.value;
wtedy wartość elm1 zanim zapisze do tresc ją przy okazji ucina :/ Oczywiście mogę się mylić... ale niby gdzie zostaje tekst ucięty ? sad.gif

z tym md5 faktycznie strzeliłem gafę biggrin.gif wink.gif

Cytat(Zbigizmi @ 6.02.2011, 18:30:26 ) *
bo traktuje wszystko, co jest po & jako następną zmienną.
Musisz po stronie serwera to zdekodować zanim prześlesz do bazy.
urldecode()


Napisałeś wcześniej prawie dobrze... kod jaki trafia do POSTa wygląda jakoś tak:
dodajcw.php&opcja=3&przedm=2&lab=1&tytul=jakistytul&tresc=tu jakis tekst w którym nie może wystąpić znak &
W moim tekście niestety dużo razy występuje znak & i dlatego ucina bo myśli ze to kolejne parametry.
Myliłeś się tylko przy stwierdzeniu, że ten tekst trzeba przemielić przed wysłaniem do bazy, otóż trzeba ten tekst przemielić zanim zostanie wysłane zapytanie POST.
Rozwiązaniem by było zakodowanie tekstu tak aby nie występował w nim znak & zanim zostanie wydane polecenie POST.
Wie ktoś jak to zrobić ? sad.gif Jak wpadnę na jakiś pomysł to dam znać jednak do tej pory proszę o pomoc ! sad.gif
Zbigizmi
spróbuj tak

  1. var xmlHttp
  2. function MyRequestAjax() {
  3. xmlHttp = GetXmlHttpObject();
  4. var przed = document.edycja.przedmiot.value;
  5. var lab = document.edycja.lab.value;
  6. var tytul = document.edycja.tytul.value;
  7. var tresc = encodeURIComponent(document.edycja.elm1.value);
  8. xmlHttp.open("POST", "dodajcw.php");
  9. xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  10. xmlHttp.send('&opcja=3' + '&przedm=' + przed + '&lab=' + lab + '&tytul=' + tytul + '&tresc=' + tresc); //w tej linijce trzeba jakoś zakodować treść aby plik php przyjął ją w całości
  11. xmlHttp.onreadystatechange = stateChanged;
  12. }
  13. function stateChanged() {
  14. if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {
  15. document.getElementById("edytor2").innerHTML=xmlHttp.responseText;
  16. }
  17. }
  18. function GetXmlHttpObject() {
  19. var request = null;
  20. if (window.XMLHttpRequest) {
  21. request = new XMLHttpRequest();
  22. }
  23. else if (window.ActiveXObject) {
  24. request=new ActiveXObject("Microsoft.XMLHTTP");
  25. }
  26. return request;
  27. }


jeśli tak nie będzie działać to wyrzuć 'application/x-www-form-urlencoded' a zostaw tylko tresc zakodowaną, bo może wystąpic podwójen kodowanie

przy odbiorze musisz
  1. $tresc = urldecode($_GET['tresc']);
  2.  
  3. a jak wkładasz do bazy to

  1. $tresc=htmlspecialchars($tresc);


a gdy wyjmujesz musisz odkodować
Sztef89
Poszło ! Ha biggrin.gif wiedziałem ze to będzie banalne w rozwiązaniu tongue.gif

Niestety przy wysyłaniu do bazy (już w skrypcie php) wywala błąd:
Cytat
Could not enter data: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'POST", "dodajcw.php");
xmlHttp.setRequestHeader('Content-Type', 'appl' at line 1


Moje zapytanie wygląda tak:
  1. $sql = 'INSERT INTO tresci (ID_przedmiotu, nrlab, tytul, kod) VALUES ( "'.$przedmiot.'", "'.$lab.'", "'.$tytul.'", "'.$kod.'" )';

na zwykłym tekście się nie wykrzacza a przy kodzie html jaki chce zapisać wywala powyższy błąd. Pewnie przez to że kod html zawiera cudzysłowia i pazurki.
Czyli ten tekst mam jeszcze zakodować zanim trafi co zapytania SQL ?
Normalnie jak wkleję przez phpmyadmin ten kod to nie ma błędu.


UFFFF Dziękuję panowie za pomoc ! Jak wcześniej podejrzewałem powyższy błąd był związany z cudzysłowiami ale zmieniłem kod php w poniższy sposób i działa:
  1. $kod1=$_POST['tresc'];
  2. $kod2 = urldecode($kod1);
  3. $kod = htmlspecialchars($kod2);


Projekt można uznać za zrobiony, tylko dzięki Wam !
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.