Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Cześć, tworzę projekt na uczelnię związany z 'mapą serwerowni' na zaliczenie jednego przedmiotu.
Mam na stronie formularz 'add server' gdzie wypełniam dane związane z nazwą,vendorem,numerem_szafy oraz gwarancją, dane przesyłane są do bazy danych.
I w tym momencie nie wiem co zrobić aby dane dynamicznie trafiały z bazy danych na stronę html i były umieszczane w tabelach(<td><tr>) które będą oznaczały szafy rackowe.
Próbowałem już coś tworzyć z Template::Toolkit, ale ostatecznie nic nie wyszło mi..
Jakieś sugestie w jaki sposób byście wykonali to? dodam że muszę to zrobić w połączeniu z perlem + cgi.
Z góry dzięki za pomoc.
Ostatnio edytowany przez sqrtek (2015-04-26 22:34:34)
Offline
W formularzu wysyłasz chyba jako GET lub POST?
To jedyne dostępne możliwości.
Jak skrypt cgi ma dostęp do tablic GET i POST [s]pojęcia nie mam[/s],
ale na pewno da się to zrobić, w PHP to bułka z masłem, więc w Perlu [s]pewnie[/s] też.
EDIT:
Łap sznurka:
http://www.tutorialspoint.com/perl/perl_cgi.htm
Ostatnio edytowany przez Jacekalex (2015-04-27 00:23:46)
Offline
Doszedłem do tego że do swojego projektu uzylem frameworka Catalyst.
Udało zrobić mi się dynamiczne pobieranie danych z bazy danych mysql, co powoduje że dane na stronie w html są ciągle aktualne dzięki (template::toolkit)..
Utknąłem na skryptach CGI.. nie mam pojęcia jak uruchomić skrypty CGI pod tym frameworkiem.
Zrobiłem skrypt CGI który działa na takiej zasadzie że powinien przesyłać dane z formularza do bazy danych.
Niestety w momencie kliknięcia 'submit'.. pojawia mi się cała treść skryptu CGI na ekranie w przeglądarce.
Offline
To coś masz skopane na serwerze WWW, ten nie ma prawa wysyłać treści skryptu do przeglądarki, ma go wykonać, albo wywalić błąd 5xx, ale na pewno nie może go wyświetlać, jako plik tekstowego.
Na jakim serwerze masz tego skrypta?
W Perlu musisz uważać na wszystkie przecinki, kropki, białe znaki i nawiasy.
Dodatkowo perl np wywali błąd, jak w kodzie wpiszesz np adres mailowy ze znakiem @, trzeba go wpisywać w ten sposób:
pacjent\@domena.tld
Drobne błędy w składni, to najważniejszy problem w w programowaniu w Perlu, i nie tylko.
W ogóle to nawet Bash nie toleruje pomylenia znaku [b]`[/b] z [b]'[/b].
PS:
W ogóle nie czaję, po kiego czorta brać Perla i CGI do rzeczy, które dużo łatwiej można naskrobać w PHP.
Ostatnio edytowany przez Jacekalex (2015-05-03 12:32:10)
Offline
@jacekalex: nie każdy ma chęć/czas na naukę hebrajskiego tylko po to aby zrozumieć komunikat błędu.
Offline
[quote=ethanak]@jacekalex: nie każdy ma chęć/czas na naukę hebrajskiego tylko po to aby zrozumieć komunikat błędu.[/quote]
???????????????
Czyżby o 5 piw za dużo?
Jakoś nie widziałem jeszcze programisty, który pisze program, i nie ma czasu albo chęci sprawdzić w logach, dlaczego po trzech dniach kodzenia nie działa.
Jeśli taki istnieje, to z pewnością nie utrzymuje się z programowania. :D
W Perlu dodatkowa trudność z CGI polega na tym, że czasami nie wyświetlają błędów literalnie nigdzie, o ile Autor skrypta nie doda funkcji wyświetlania komunikatu błędu.
A to dodatkowe linijki kodzenia, i nie każdemu się chce tak certolić.
Tylko potem "nie działa" ino ani kawałka loga czy komunikatu błędu, nie ma ani treści skrypta, ani nie wiadomo, na jakiej funkcji się wykłada, ani czy serwer WWW coś ma skopane.
W każdy razie wyświetlanie skrypta CGI w przeglądarce, jako plik tesktowy, to normalny objaw nie jest.
Offline
a) nie wiem ile w php pisałeś, ale mi szczęka opadła o metr jak zobaczyłem komunikat w języku naszych przyjaciół z izraela (wygóglaj sobie "php hebrew error" jeśli nie wiesz o co chodzi)
b) pokazanie treści skryptu nie zależy od języka tylko jest efektem babola w konfiguracji serwera. i jest to owego babola objaw wielce typowy.
Offline
@up
Wielkie halko, formularz w php z insertem do Mysql:
http://www.w3schools.com/tags/tag_input.asp
http://www.w3schools.com/php/php_mysql_insert.asp
Sam insert do bazy z formularza, to może z 30 linijek, i można praktycznie na żywca z netu zerżnąć gotowy kawałek z któregoś z 3k poradników, albo zajrzeć np do kodu FluxBB, Wordpressa czy czegoś podobnego.
Offline
@up: ile napisałeś w php, ile w perlu, pythonie, c, iconie... wypowiadasz się jako wielki znawca tutoriali - ale jakoś nikt nie widział trzech linijek programu które byłyby twoim dziełem...
imaginuj se waćpan, iż pisanie programów na tutorialach się nie kończy. a do wyboru języka raczej nie powinieneś się wtrącać, bo akurat o tym (jak mniemam) nie masz zielonego pojęcia.
pisz o tym na czym się znasz. politykę i programowanie sobie daruj.
Offline
Akurat wybór Perla został narzucony z góry. Domyślam się że mogłoby to wyjść łatwiej zrobić w PHP, ale cóż zrobić.
Wydaje mi się że w moim skrypcie nie powinno być żadnych błędów.
Zrobiłem najprostszy z skryptów, który powinien wyswietlic na ekranie wartosci wpisane do formularza.
przykład:
#!/usr/bin/perl -w use CGI qw/:standard/; CGI::ReadParse(*form); print header; print start_html("skrypt"); print param('name')."<br>"; print param('place')."<br>"; print param('vendor')."<br>"; print param('varranty')."<br>"; print end_html;
Co do serwera.. to nie działam na żadnym apachu,nginxie. Jest to framework, wchodzę tylko w plik wykonywalny, uruchamiam i pokazuje sie informacja że aplikacja działa na takim i takim porcie.
Obawiam się że trzeba będzie skonfigurować w jakiś odpowiedni sposób obsługę CGI w tym Catalyscie, a patrząć na przykładowe konfiguracje w necie to chyba na tym polegnę.
Offline
Spróbuj odpalić skrypta CGI z formularzem na Apachu albo najlepiej LIghtppd, i dopiero, jak tam zadziała, to wsadź go do tego Catalysta.
Wtedy przynajmniej będzie pewność, że to nie ten Catalyst ma coś skopane, co jest bardzo prawdopodobne.
Offline
na Apachu działa CGI, nie działa "template::toolkit".
Będę próbował coś wyrzeźbić wg. tej procedurki:
www.catalystframework.org/calendar/2008/18
Choć czuję że kiepski mój los :P
Ostatnio edytowany przez sqrtek (2015-05-03 22:01:21)
Offline
Zaryzykuję stwierdzenie, że znając Perla,lepiej się trzymać Perla, a nie gotowych frameworków, których działania się do końca nie zna.
Skrypty CGI raczej nie są jakieś gigantyczne, z resztą, jak masz konieczność wczytania do bazy SQL danych z formularza, to może warto by to zrobić niezależnie od tego frameworka, który potem "wyświetla mapę sieci"?
Cała akcja INPUT i przefiltrowanie pól wejściowych regexem i następnie INSERT do bazy, to jest najwyżej pół godzinki roboty w czystym Perlu, wiec nie czaję, do czego w samej operacji tegoż zapisania danych potrzebny jest jakiś Catalyst, Catalyst niech najwyżej potem wyświetla piękną mapkę na podstawie tego, co znalazł w bazie danych.
Chyba ze masz to robić nie w Perlu, tylko w tym cholernym Catalyście.
Sama akcja wysłanie formularza, skrypt insertuje odpowiednie pola do bazy, po czym odsyła pacjenta z przeglądarki na stronę z zaktualizowanymi wynikami, to nic trudnego, jak się robotę podzieli na etapy.
Jeśli natomiast chcesz, zęby wyniki się pojawiały na stronie bez jej przeładowania, po samym wpisaniu w formularz i kliknięciu wyślij, to czeka cie zabawa Ajaxem, co samo w sobie wygląda niezbyt wesoło.
Ostatnio edytowany przez Jacekalex (2015-05-03 22:26:59)
Offline
Właśnie próbowałem to zrobić w samym Apachu, ale pojawiał się problem, aby:
dynacznie dane się aktualizowały w kodzie html wraz z wrzuceniem np. nowego serwera do bazy danych, i tutaj z pomocą mi przyszedł Template::Toolkit który w tym frameworku działa idealnie, ale znowu ze skryptami CGI jest problem.
Na wlasnym serwerze nie mialem problemu ze skryptem CGI, tylko wlasnie z tym aby zrobic cos co bedzie dzialac w stylu Template::Toolkita, nie wiedziałem jak to skonfigurować i wlasnie wtedy pomógł mi ten framework.
przykład kodu który nie mam pojęcia jak zrobić w czystym htmlu + perlu, który pozwala mi dynamicznie wyswietlac zawartosc bazy danych w html:
<div style="display:table-cell" > <table border=1 width=180> <tr> <td width=200 align=center style="font-weight:bold"> 3S4 </td> </tr> [% FOREACH item = DBI.query('SELECT * FROM dane where id_szafy=12') %] <tr> <td> <a href="#" id="about_env_link34[% loop.count %]">[% item.name %]</a> <div id="about-content34[% loop.count %]" style="display: none;"> <table> <tbody> <tr> <td>SN: </td> <td><tt>[% item.SN %]</tt></td> </tr> <tr> <td>Varranty: </td> <td><tt>[% item.varranty %]</tt></td> </tr> <tr> <td>Vendor: </td> <td><tt>[% item.vendor %]</tt></td> </tr> </tbody> </table> </div> <script type="text/javascript"> $('#about_env_link34[% loop.count %]').click(function() { $('#about-content34[% loop.count %]').slideToggle('fast', function() { // ok }); return false; }); </script> </td> </tr> [% END %] </table>
Offline
Ten skrypt ma odświeżać stronę bez przeładowania, czy odsyłać pacjenta poprzez przekierowanie 302 na odświeżoną stronę?
Ja bym to zrobił przez nagłówek redirect zwracany przez skrypt cgi po dokonaniu INSERTU do bazy danych, to jest dosyć łatwe do zrobienia w czyściutkim perlu:
http://perldoc.perl.org/CGI.html#GENERATING-A-REDIRECTION-HEADER
Na tej zasadzie działają te wszystkie systemy skracania sznurków, także gotowych przykładów w różnych językach nie zabraknie.
Ostatnio edytowany przez Jacekalex (2015-05-04 00:05:10)
Offline
Hmm nie wiem czy dobrze zrozumiałem ale to by dodawało wpis do bazy i odświeżało stronę.
Tylko jeszcze potrzeba kodu , który pobierze mi dane z bazy i wyswietli mi na stronie w htmlu, wlasnie w tym przypadku sluzy mi ten Template::Toolkit.
Offline
Jak odświeżasz stronę, to może ją generować dowolny skrypt cgi czy php, pobierając zestaw danych z bazy SQL i wywalając go jako stronę HTML.
Przekierowanie wysyła na adres URL, a od autora strony zależy, jaki skrypt wygeneruje stronę na adresie docelowym, i co na niej będzie.
Trudniej byłoby to zrobić Ajaxem bez odświeżenia strony, ale to już wykracza poza granice Perla.
Offline
Ale zaraz, w jaki sposób dodać skrypt CGI aby był generowany w momencie odświeżania strony? bo ja do tej pory wykorzystywałem tylko CGI do formularzy czyli np. wykorzystywałem go w html jako:
<action form="nazwa_skryptu.cgi">
Da się jeszcze gdzieś 'wcisnąć' skrypty CGI? :D
Offline
[quote=sqrtek]Ale zaraz, w jaki sposób dodać skrypt CGI aby był generowany w momencie odświeżania strony?[/quote]
Nie bardzo precyzyjnie się wyrażasz - odświeżenie to przecież nic innego, jak ponowne wyświetlenie danej strony. I jeśli URL prowadzi do skryptu będzie wykonany skrypt - jeśli do statycznej strony to nie będzie i żadna magia nie pomoże.
Skrypty można 'wcisnąć' dosłownie wszędzie - i od konfiguracji serwera tylko zależy kiedy i jaki będzie wykonywany. Łącznie z ekstremalna sytuacją (często stosowaną w stuprocentowo dynamicznych stronach - jak sklepy, CMS-y itp.) gdy serwer każde wywołanie dowolnego URL-a przekierowuje wewnętrznie do index.cgi (w praktyce jest to nieco bardziej skomplikowane, ale mniej więcej tak to działa).
W Twoim przypadku najprostsze byłoby zastosowanie dwóch oddzielnych skryptów - jednego do zapisania danych, drugiego do ich wywietlania - ale jeśli chcesz skorzyskać z porady którą dał [b]jacekalex[/b] (czyli zrobienia tego z przekierowaniem najpierw na skryptach, a potem opakowania w kod standalone) nie byłoby to najlepsze rozwiązanie (w końcu aplikacja jest jedna). Pozostaje sterowanie zachowaniem skryptu przez parametr.
Teoretycznie można byłoby to załatwić bez przekierowań, ale rozwiązanie z przekierowaniem zapobiega przypadkowemu ponownemu wywołaniu funkcji zapisu danych przy odświeżeniu strony i należy je stosować zawsze tam, gdzie z wyświetleniem strony łączy się jakaś akcja mająca efekty uboczne (np. zapisanie danych do bazy, wysłanie maila itp.).
Niech domyślnym działaniem skryptu będzie pobranie danych z bazy i ich wyświetlenie wraz z formatką do wpisania nowych danych, natomiast po dodaniu parametru (np 'zapisz=t') skrypt będzie oczekiwał na nowe dane i zapisywał je do bazy. Działanie skryptu byłoby następujące (niezależnie od języka w którym byłby napisany):
[b]1[/b] - czy wystąpił parametr 'zapisz'? Jeśli nie, przejdź do wyświetlenia strony i kończ.
[b]2[/b] - czy wpisane dane są poprawne? Jeśli nie, wyświetl stronę zawierającą komunikat błędu oraz wstępnie wypełniony otrzymanymi danymi formularz i kończ.
[b]3[/b] - wpisz dane do bazy
[b]4[/b] - wygeneruj nagłówki przekierowania i kończ
gdzie nagłówki przekierowania to:
302 Moved temporarily Location: skrypt.cgi
a formatka wprowadzania danych zawiera dodatkowe ukryte pole, czyli coś w stylu:
<form method="POST" action="skrypt.cgi"> <fieldset><legend>Podaj nowe dane</legend> <input type="hidden" name="zapisz" value="t"> <!-- tu Twoje inputy --> </fieldset> </form>
Ponieważ przeglądarka w przypadku statusu 302 automatycznie zamienia POST na GET, dane nie będą ponownie wysłane. Przy okazji - fakt wysłania danych nie zostanie odnotowany w historii przeglądarki, czyli można bezpiecznie używać funkcji "wstecz", "naprzód" czy "przeładuj" bez niebezpieczeństwa ponownego wysłania danych.
W ten sposób wywołanie http://twojadomena.tld/skrypt.cgi spowoduje wyświetlenie danych oraz formularza do wpisania nowych, a wysłanie owego formularza zaowocuje wyświetleniem tych samych informacji, ale ze zaktualizowanymi danymi.
Możesz również (o ile nic więcej oprócz wyświetlania danych i wprowadzania nowych nie przewidujesz) w ustawieniach serwera podać, że skrypt ma być domyślnym indeksem - dla Apacza będzie to coś w stylu:
DirectoryIndex skrypt.cgi
Wtedy zarówno w "action" jak i "location" podajesz jedynie "/" (lub "./" gdy skrypt siedzi gdzieś głębiej w strukturze serwisu).
W aplikacji standalone będzie podobnie - niestety ani Perla, ani użytego frameworku nie znam więc się nie wypowiem.
Offline
Fakt.. zapomniałem zupełnie że index może być napisany jako skrypt CGI!.
To rozwiązuje moje wszelkie problemy. Dzieki wielkie!
[Problem solved]
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00100 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.144.89.152' WHERE u.id=1 |
0.00084 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.144.89.152', 1732377761) |
0.00071 | SELECT * FROM punbb_online WHERE logged<1732377461 |
0.00080 | DELETE FROM punbb_online WHERE ident='146.70.128.181' |
0.00096 | SELECT topic_id FROM punbb_posts WHERE id=286660 |
0.00009 | SELECT id FROM punbb_posts WHERE topic_id=27331 ORDER BY posted |
0.00081 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=27331 AND t.moved_to IS NULL |
0.00009 | SELECT search_for, replace_with FROM punbb_censoring |
0.00249 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=27331 ORDER BY p.id LIMIT 0,25 |
0.00141 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=27331 |
Total query time: 0.00933 s |