![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 15.12.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Zakupiłem niedawno książkę: "AJAX i PHP. Tworzenie interaktywnych aplikacji internetowych" (wyd. Helion) i mam niestety problem już na pierwszym przykładzie z tej książki (zapewne jakiś błąd w druku, bo kod jest prawie że w 100% skopiowany z książki). Niestety - moja mała (jeszcze) wiedza na temat AJAKSA nie pozwala mi rozwiązać problemu samodzielnie (uprzedzając pytania - Google też nie pomogło). Plik index.html:
Plik quickstart.js: Kod var xmlHttp = createXmlHttpRequestObject(); function createXmlHttpRequestObject() { var xmlHttp; if (window.ActiveXObject) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xmlHttp = false; } } else { try { xmlHttp = new XMLHttpRequest(); } catch (e) { xmlHttp = false; } } if (!xmlHttp) { alert("Błąd podczas tworzenia obiektu XMLHttpRequest!"); } else { return xmlHttp; } } function process() { if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) { name = encodeURIComponent(document.getElementById("myName").value); xmlHttp.open("GET", "quickstart.php?name=" + name, true); xmlHttp.onreadystatechange = handleServerResponse; xmlHttp.send(null); xmlHttp.overrideMimeType("application/xhtml+xml; charset=utf-8"); } else { setTimeout("process()", 1000); } } function handleServerResponse() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { xmlResponse = xmlHttp.responseXML; xmlDocumentElement = xmlResponse.documentElement; helloMessage = xmlDocumentElement.firstChild.data; document.getElementById("ajaxMessage").innerHTML = "<em>" + helloMessage + "</em>"; setTimeout("process()", 1000); } else { alert("Wystąpił błąd podczas uzyskiwania dostępu do serwera: " + xmlHttp.statusText); } } } Plik quickstart.php:
Po otworzeniu strony pod Firefoksem, Firebug wyrzuca cały czas jeden i ten sam error:
Moje pytanie brzmi - w jaki sposób poprawić wywołanie funkcji handleServerResponse(), tak aby kod ten wreszcie zaczął działać? Z góry dziękuję za pomoc. Ten post edytował m010ch 30.09.2007, 11:16:48 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 179 Pomógł: 1 Dołączył: 8.03.2007 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Cześć,
ta książka ma kilka takich niedoróbek. Ściągnij kody źródłowe ze strony Heliona i porównaj ze swoim kodem. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 15.12.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
ta książka ma kilka takich niedoróbek. Ściągnij kody źródłowe ze strony Heliona i porównaj ze swoim kodem. Uwierz mi to pierwsze co zrobiłem - kod jest identyczny jak ten w książce. Aczkolwiek uruchomiłem go przed chwilą i... skrypt zaczął działać ![]() ![]() Pytanie jednak mam nadal - dlaczego pliki te mają problemy z działaniem przy ustawionym kodowaniu UTF-8? p.s. Widzę, że nadal są problemy z polskimi znakami ![]() Kod Błąd parsowania XML: niezdefiniowana jednostka Obszar: http://localhost/ajax/quickstart/quickstart.php?name=Rafa%C5%82 Numer linii 1, kolumna 70: Kod Błąd parsowania XML: niezdefiniowana jednostka Obszar: http://localhost/ajax/quickstart/quickstart.php?name=Micha%C5%82 Numer linii 1, kolumna 71:
Ten post edytował m010ch 30.09.2007, 11:22:58 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 179 Pomógł: 1 Dołączył: 8.03.2007 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Sprawdziłem, wydaje mi się, że problem leży w BOM-ie. Pliki w paczce z Helion Notepad++ rozpoznawał jako ANSI as UTF-8 bez BOM. Natomiast po zapisaniu pliku .php zwykłym UTF z BOM wszystko siada.
Dzieje się tak dlatego, ponieważ plik .php ma za zadanie wygenerować dokument XML a nie może prawidłowo ustawić header'a gdy już coś wysłał. (BOM). Wystarczy uruchomić sam plik .php żeby się o tym przekonać. Pojawi się wtedy znany komunikat Cannot modify header information... edit: jeśli korzystasz z Notepad++ to, to 'poprawne' kodowanie UTF-8, które nie będzie ci sprawiać problemów w PHP, to właśnie: ANSI as UTF-8 bez BOM Ten post edytował atomek4 30.09.2007, 11:36:28 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 15.12.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Dzieje się tak dlatego, ponieważ plik .php ma za zadanie wygenerować dokument XML a nie może prawidłowo ustawić header'a gdy już coś wysłał. (BOM). Wystarczy uruchomić sam plik .php żeby się o tym przekonać. Pojawi się wtedy znany komunikat Cannot modify header information... Faktycznie - dzięki za wyjaśnienie. edit: jeśli korzystasz z Notepad++ to, to 'poprawne' kodowanie UTF-8, które nie będzie ci sprawiać problemów w PHP, to właśnie: ANSI as UTF-8 bez BOM Tak - ustawiłem je jako domyślne dla wszystkich i faktycznie działa (co nie zmienia faktu, że błędy parsowania XML dla polskich ogonków w imieniu wpisanym do inputa, o których wspomniałem wyżej nadal występują...) Dzięki za dotychczasową pomoc - jeżeli domyślasz się jeszcze co może powodować wspomniane przeze mnie problemy - podziel się proszę swoimi podejrzeniami ![]() |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 179 Pomógł: 1 Dołączył: 8.03.2007 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Co parsowania ogonków, to w tych kodach z książki używane są funkcje:w pliku JS encodeURIComponent() a w PHP htmlentities" title="Zobacz w manualu PHP" target="_manual i to one powodują błędy, po usunięciu ich występowania wszystko działa. Z tego co pamiętam to adresy URL są właśnie kodowane Unikodem, czyli tak jak pliki, więc wydaje mi się zbędne.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 15.12.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Dzięki - jesteśmy coraz bliżej rozwiązania problemu, ale jednak coś jeszcze jest nie tak
![]() Po usunięciu obu htmlentities() z quickstart.php i jednego encodeURIComponent() z quickstart.js - owszem - nie pokazuje już błędów parsowania XML, ale za to skrypt nie działa jak powinien. Po wpisaniu imienia np. Michał dostaje: Michał, nie znam Cię! zamiast Witaj mistrzu Michał! Wygląda na to, że teraz 'ł' wpisane do inputa nie jest tożsame z 'ł' w tablicy userNames... :/ Ten post edytował m010ch 30.09.2007, 14:13:47 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 179 Pomógł: 1 Dołączył: 8.03.2007 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Chyba wiem o co chodzi, błąd tym razem dotyczy funkcji strtoupper" title="Zobacz w manualu PHP" target="_manual. Ma ona problemy ze zrobieniem wielkiej litery z polskiego znaku. Rozwiązanie znalazłem na naszym forum.
Teraz kod w pliku .php, może wyglądać tak:
Oczywiście reszta tak samo. Mam nadzieję, że to rozwiąże problem ![]() edit: Tak masz racje, bo ja już potem nie zmieniałem tych wielkich liter. Można by tą zamianę na wielkie wpisać w tym in_array (tak jak było poprzednio), bo tu chodzi tylko porównanie. Zmienna pozostała by wtedy niezmieniona. Ja tylko tak napisałem, żeby było czytelniej. Nie ma za co, po to jest forum. Sam mam tą książkę, ale tak szczegółowo to nawet nie analizowałem tego przykładu przy czytaniu. ![]() Ten post edytował atomek4 30.09.2007, 18:19:26 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 15.12.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie atomek4!
![]() Problem został prawie rozwiązany. Prawie - bo teraz po wpisaniu jakiegoś imienia zawsze dostaję w odpowiedzi to imię dużymi literami, np.: Witaj mistrzu MICHAŁ! Na szczęście - samodzielnie poradziłem sobie z tym problemem - poniżej rozwiązanie dla zainteresowanych: 1. Zamieniamy drugi parametr w funkcji mb_convert_case z MB_CASE_UPPER na MB_CASE_TITLE. 2. Ta zmiana wynika z pierwszej - w tablicy przechowującej imiona musimy zmienić zapis tych imion z pisanych dużymi literami, na pisane małymi literami z pierwszą literą dużą (czyli np. $userNames = array('Michał', 'Filip', 'Marcin', 'Rafał');) Teraz - niezależnie czy do inputa wpisze się "Michał", "michał" czy "MICHAŁ", w odpowiedzi otrzyma się zawsze oczekiwane, czyli: np. Witaj mistrzu Michał! atomek4 - jeszcze raz dzięki za pomoc! |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 21.06.2025 - 19:41 |