Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: textarea help
Forum PHP.pl > Forum > Po stronie przeglądarki
bula87
czy da się jakoś ograniczyć ilość znaków możliwych do wpisania w <texarea> questionmark.gif lub czy znacie jakies inne funkcje aby było to możliwe.
nospor
Funkcja js ograniczjąca przykladowo do 10 znaków:
Kod
function MaxL(obj)
{
    if (obj.value.length>10)
    {
  alert('Za duży text. Max. 10 znaków');
  obj.value=obj.value.substr(0,10);
    }
}


Wykorzystanie w textarea:
  1. <textarea onchange="MaxL(this);"></textarea>
bula87
wielkie dzięki właśnie o coś takiego mi chodziło. A dałoby się jeszcze dodac w skrypcie zeby po wyswietleniu komunikatu pole textarea było czyszczone?
nospor
A wczym problem. Zamiast obcinac do żądanej dlugości po prostu wpiisz nic.
Kod
function MaxL(obj)
{
if (obj.value.length>10)
{
alert('Za duży text. Max. 10 znaków');
obj.value='';
}
}
Jarod
Cytat(nospor @ 2005-05-10 06:18:01)
Funkcja js ograniczjąca przykladowo do 10 znaków:
Kod
function MaxL(obj)
{
    if (obj.value.length>10)
    {
  alert('Za duży text. Max. 10 znaków');
  obj.value=obj.value.substr(0,10);
    }
}


Wykorzystanie w textarea:
  1. <textarea onchange="MaxL(this);"></textarea>

Postanowiłem sprawdzić jak się ta funkcja sprawuje. I jest pewein problem. Jeśli przekroczę 10 znaków to dostane komunkat, że przekroczyłem. Ale jeśli dodam w php sprawdzanie długości to wyglada to tak:

1. podaję 11 znaków
2. JS wywala komunikat ze przekroczylem dozwoloną ilość i skraca do 10
3. klikm zapisz
4. php wywala komunikat ze przekroczylem 10 znaków

Jak zrobić żęby php widział już poprawioną wersję??

EDIT: Powyższy problem występuje jeśli w polu textarea używam entera przy wpisywaniu, żeby nie korzytsać z paska przewijania. Jeśli nie używam entera, tylko pisze wszystko jednym ciągiem to problemu nie ma
nospor
Nie bardzi widzę problem. Też uzywam entera w textarea, wywala alerte, skraca. Potewm musze jescze raz submit zrobić i jest ok. Nie wiem w czym problem
Jarod
Cytat(nospor @ 2005-05-16 06:47:39)
Nie bardzi widzę problem. Też uzywam entera w textarea, wywala alerte, skraca. Potewm musze jescze raz submit zrobić i jest ok. Nie wiem w czym problem

Dziękuje z odpowiedź.

Kawałek kodu z formularzem:
wcześniej w sekcji <head> wkeloja funkjca JS
  1. ...
  2. ...
  3. <form action="zlecenie_k_zapisz.php?<?=SID?>" method="post">
  4.  
  5. <table width="60%" align="left" border="0" cellpadding="4" cellspacing="2">
  6. <tr>
  7. <td class="tdbkground"><strong>Treść zlecenia (max 255 znaków)</strong></td>
  8. </tr>
  9. <tr>
  10. <td class="tdbkground"><textarea onchange="MaxL(this);" name="tresc" cols="60" rows="4" wrap="virtual"></textarea></td>
  11. </tr>
  12. </table>
  13. </td>
  14. ...
  15. ...
  16. ...


I kawałek kodu skryptu, któy sprawdza długość łańcucha na wypadek wyłączenia JS w przeglądarce
  1. ...
  2. ...
  3. //Sprawdz czy nie przekroczono 255 znaków
  4. if ( strlen($_POST[tresc]) > 255 )
  5. {
  6.  ?>
  7.  <table width=\"80%\" align=\"center\" border=\"0\" cellspacing=\"1\" cellpadding=\"10\">
  8. <tr>
  9. <td><img src=\"images/spacer.gif\" alt=\"\" width=\"0\" height=\"120\"></td>
  10. </tr>
  11. <tr>
  12. <td><h2 class=\"error\">Treść zlecenia nie może przekraczać 255 znaków !</h2></td>
  13. </tr>
  14. <tr>
  15. <td align=\"center\"><input type=\"Submit\" Name=\"Button\" Value=\"Wróć\" onClick=\"location.href='zlecenie_k_formularz.php?<?=SID?>'\"></h2></td>
  16. </tr>
  17.  </table>
  18.  <?php
  19.  exit();
  20. }
  21. ...
  22. ...


OPIS PROBLEMU:
PRZYPADEK I: Jeśli w polu textarea użytkownik wpisuje ciąg znaków bez używania entera, przekroczy 255 znaków to zostanie wyświetlony odpowiedni alert. Klika ok, skrypt JS obcina wpisany tekst do 255 znaków. Użytkownik klika zapisz, a skrypt zapisuje ciąg do bazy. - WSZYSTKO OK


PRZYPADEK II:
Jeśli w polu textarea użytkownik wpisuje ciąg znaków, używając przy tym entera, przekroczy 255 znaków (JS liczy entery) to zostanie wyświetlony odpowiedni alert. Klika ok, skrypt JS obcina wpisany tekst do 255 znaków (obcina od końca). Użytkownik klika zapisz, a skrypt wyświetla komunikat, że przekroczono limit 255 znaków. Tak jakby do skryptu przekazywane było 255 znaków + entery. Skrypt nie widzi, że JS obcieło do 255 znaków. Nie wiem jak sobie z tym poradzić. Może wywale skrypt JS sad.gif

Używam Firefoxa winksmiley.jpg
nospor
Aby sprawdzić co ci przeslal do skryptu zrób test.
Daj dlugość znaków do 3;
Wpisz powiedzmy ala<enter>ma<enter>kota, wyslij to. pOwinien ci js sie wydrzec, ze za duzo znkaów, obciac do 3 czyli do ala. Teraz wyswietl w php to co otrzymasz. Jak to bedzie ala to git, jak ala ma kota to pogadamy winksmiley.jpg
Jarod
Cytat(nospor @ 2005-05-16 11:06:36)
Aby sprawdzić co ci przeslal do skryptu zrób test.
Daj dlugość znaków do 3;
Wpisz powiedzmy ala<enter>ma<enter>kota, wyslij to. pOwinien ci js sie wydrzec, ze za duzo znkaów, obciac do 3 czyli do ala. Teraz wyswietl w php to co otrzymasz. Jak to bedzie ala to git, jak ala ma kota to pogadamy  winksmiley.jpg

Cytat
Aby sprawdzić co ci przeslal do skryptu zrób test.
Daj dlugość znaków do 3;

Zrobiłem tak

Cytat
Wpisz powiedzmy ala<enter>ma<enter>kota, wyslij to. pOwinien ci js sie wydrzec, ze za duzo znkaów, obciac do 3 czyli do ala.

Tak robi. Wywala alert, klikam ok i pozostaje ale w polu formularza. Daje wyślij i

Cytat
Teraz wyswietl w php to co otrzymasz. Jak to bedzie ala to git, jak ala ma kota to pogadamy  winksmiley.jpg

Skrypt wyświetla ala.

Cytat
Teraz wyswietl w php to co otrzymasz. Jak to bedzie ala to git(...)


Więc gdzie robie błąd?

EDIT: Dodałem w skrypcie
  1. <?php
  2. echo $_POST[tresc].&#092;"#\"; exit();
  3. ?>

i okazuje się że przesyła napis ala i jakiś znak - chyba enter... sad.gif
nospor
Hmmm, no dziwne. Mi przesyła tylko 3 znaki. Też dałem strlen().
Ja gdy wciskam wyślij i jest zadużo znaków to wywala alert i obcina. POtem muszę jeszcze raz wcisnąć wyślij aby wyslalo już poprawione. W takiej sytuacji tam nie ma gdzie się żaden enter wcisnąć. Dziwne.

Robilem teraz wszystkie chyba mozliwe testy i jest caly czas ok. Naprawdę nie wiem gdzie może tkwić problem.

Może jako tymczasowe rozwiązanie zrób coś takiego:
usuń biale znaki (entery i spacje) z konca treści i dopiero potem sprawdzaj dlugość. Wkoncu bialy znak na koncu za bardzo nikomu si ę nie przyda.
  1. <?php
  2.  
  3. $tresc=rtrim($_POST['tresc']);
  4.  
  5. ?>


i pamietaj, aby indyexy w tablicach podawać w ciapkach (jesli są stringiem). Bez tego też pójdzie, ale to malo eleganckie i chyba nawet warninga wywala.
czyli daj $_POST['tresc'] a nie $_POST[tresc].

Pozdro. Daj znać jak ci się uda coś z tym zrobić.
Jarod
@nospor: wiem w czym problem. JS traktuje entery (zlicza je) jako 1 znak a php jako 2.
Jeśli w formularzu podam coś takiego
Kod
1
2
3
4
5
to dla JS jest to 9znaków natomiast do skryptu php przesylane jest 13. Nawet jak usunę z końca tego entera to nic to nie zmieni. Poszedłem za poradą crashu i zastosowałem
  1. <?php
  2. strlen(str_replace(array(&#092;"n\", \"r\"), '',$_POST[tresc]))
  3. ?>
do sptrawdzania długości. Niby wszystko ok ale przetestowałem co się stanie jak JS będzie wyłączone a Ty podasz naprzyklad taki tekst:
Cytat
ale
ma
kotka,
kotek
ma hiv
i ala
ma problem

Sam zobacz ile tak naprawde zostanie zapisane do bazy.. Ilość możliwych (widocznych dla użytkownika znaków) zmniejsza się wraz z ilością użytych enterów...

Naprawdę lepiej będzie zastosować tylko sprawdzanie w php z opcją przesyłu przez POST tego co już użytkownik wpisał (gdyb wopisał za dużo znaków) i nię bedzie musiał pisać od nowa.. Bo o to chyba chodzi w tym całym zamieszsaniu


pozdrawiam i dzięki za pomoc
nospor
jeszcze raz to potestowalem z enterami.
js tak samo jak php traktuje enter (\r\n) jako dwa znaki.

Zrób test:
daj ograniczenie na 5 znaków
wpisz 1<enter>2<enter>
Będziesz więc miał ciąg:1\r\n2\r\n czyli 6 znaków. Wywali ci alert i obetnie do 5 czyli do ciągu:1\r\n2\r.
Tak przesłany ciąg php zinterpretuje jednak jako 1\r\n2\r\n, czyli doda sobie na koniec \n w sumie 6 znaków. Wystawczy więc usunąć biale znaki z konca i bedzie wtedy ok czyli 1\r\n2.

a więc daj tak:
$tresc=rtrim($_POST['tresc']) i wszystko będzie grało winksmiley.jpg
Jarod
Cytat(nospor @ 2005-05-17 10:34:01)
daj ograniczenie na 5 znaków
wpisz 1<enter>2<enter>
Będziesz więc miał ciąg:1\r\n2\r\n czyli 6 znaków. Wywali ci alert i obetnie do 5 czyli do ciągu:1\r\n2\r.

Nie wywala. Dopiero jak dam:
Kod
1
2
3
to kasuje ostani enter i zostaje
Kod
1
2
3


Dam sobie z tym spokój. Mówie Ci, że JS traktuje u mnie enter jako 1 znak (Firefox)

pozdrawiam
qrzysztof
Sorki, że odgrzebuję tak stary temat, ale trafiłem na identyczny problem.

Mam podwójną walidację textarea. JS informuje użytkownika, że tekst jest dłuższy niż 500 znaków i go przycina a potem jeszcze skrypt PHP też sprawdza i też przycina. Używam do tego mb_strlen(utf-8) oraz mb_substr(utf-8).

Jeśli w tekście nie ma enterów (a entery są dla mnie istotne - musi być możliwość ich używania) to obie walidacje działają tak samo. Jeśli są entery to obcięcie za pomocą PHP da rezultat mniejszy od obcięcia przez JS o właśnie liczbę enterów.

Przykład:

wejście: tekst 600 znaków, 10 enterów

wyjście JS: tekst 500 znaków

wyjście PHP: tekst 490 znaków.

Coś więcej może już wiadomo na ten temat po 5 latach?
icetique
Może po prostu \r\n zamieniaj na \n zlicz znaki i zamień \n na \r\n (w php).
qrzysztof
Tak też zrobiłem. Zliczyłem entery i obcinam w PHP do 500+liczba enterów. W bazie leci to do TEXT, więc i tak nie ma to większego znaczenia. Gdybym chciał zrobić VARCHAR(500) to już trzeba by trochę bardziej zakombinować.

Tyle, że pojawił się nowy problem. Cudzysłowy powodują to samo. Chyba wszystkie znaki z "ucieczką" będzie trzeba zliczyć.

Dodałem jeszcze stripslashes i powinno już być ok.
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.