Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pomoc w rozwiązaniu i doborze algorytmów :).
Forum PHP.pl > Forum > PHP
JarekG
Witam.
Chciałbym poprosić forumowiczów o pomoc w dobrze rozwiązań i algorytmów. Potrzebuję zrobić taką jedna rzecz dla kolegów z roboty.
Sprawa wygląda tak że serwisanci wracają z roboty u klienta, wsiadają na program, piszą co robili, jakie materiały zużyli, ile itd. Pracują na wersji którą napisałem jakiś czas temu, ale teraz trzeba ją ulepszyć, a w ogóle napisać na nowo bo coś się kaszani, a tamta była pisana na żywca, mało przemyślana i w ogóle teraz chcę mieć 'wypasa' winksmiley.jpg. W ramach tej wersji która jest, wykrytych zostało kilka błędów - poważnych - i z tym nowym doświadczeniem ruszam w świat dalej.

Interfejs jest intuicyjny na tyle, że każdy potrafi z niego korzystać. Jednak dla mnie jest kilka spraw teraz do rozstrzygnięcia i chciałem zapytać Was - bardziej doświadczonych programistów jak wszystko razem poskładać i jakie problemy mogą nastąpić w pracach itp.
Wszystko chodzi w oparciu o MySQL-a.

Teraz tak... pierwszy problem z którym się spotkałem, to taki że podczas tworzenia nowego takiego zgłoszenia, jeśli w nazwie występują polskie znaki tudzież znaki specjalne typu "&" to całość się krzaczy, bo ... GET - o tym wcześniej nie pomyślałem. Już teraz takiej ilości danych nie chcę przepuszczać w GET-cie, i zdecydowałem się na POST-a. Generalnie zastanawiałem się jeszcze nad mechanizmem sesji, czyli przy każdym otwarciu nowego zlecenia jest generowany nowy identyfikator sesji przekazywany GET-em. Tylko jak teraz połączyć formularze żeby jedna cześć przekazywana była POST-em a identyfikator GET-em - tutaj mechanizm sesji, right ?
Formularz wygląda mniej więcej tak że wybiera się z listy po prostu materiały, po wyborze materiału strona się przeładowuje z listą cech dla tych materiałów i potem wypełnia się opcjonalnie opis, ilość i jednostkę miary. Klika się dodaj i leci do bazy. Strona się przeładowuje do "pierwotnego stanu" i już na ekranie widać od razu to co dodaliśmy. Jeśli całość przekażę POST-em to nie będę widział nic, bo najważniejsza zmienna identyfikująca konkretnie ten "dokument" zniknie.

Drugi problem jest taki, że musi to być uwierzytelnianie. Teraz chodzi to w oparciu o plik .htaccess a już chciałem zrobić uwierzytelnianie poprzez PHP, ale... teraz problem jest taki. Jeśli wezmę użyję sesji do dodawania nowych dokumentów, to jak użyć dwóch sesji na raz, bo użytkownik też będzie musiał być uwierzytelniony poprzez sesję.

Może jakieś inne pomysły ?
Na razie tylko tyle z problemów które mnie spotkają w niedalekiej przyszłości smile.gif. Jak sobie coś przypomnę to pozwolę sobie skonsultować z Wami.
Z góry dziękuję za każdą pomoc smile.gif.
bim2
Jak dwie sesje?
$_SESSION['userid'] = 1;
$_SESSION['dokument'] = 'nie rozumiem';

Co do posta?
Nie rozumiem troche, ale działać to by miało tak. Masz główną stronę i tam formularz a pod nim co już ktoś dziś dodał.
Wpisujesz dane do formularza, gość klika dodaj, dane do bazy lecą, a ty na stronie glównej je normalnie pobierasz (SELECT * FROM) :]
Cezar708
Myśl, że kolega JarekG trochę nie rozumie mechanizmu sesji.

Otóż nie jest Ci w tym przypadku potrzebne przekazywanie identyfikatora sesji w url, ba! nawet nie jest to wskazane (bezpieczeństwo).

każdy plik wykorzystujący mechanizm sesji musi być rozpoczęty funkcją: session_start();

dopiero po użyciu tej funkcji możesz używać zmiennych sessyjnych ($_SESSION), zmienna ta jest zwykłą tablicą, która ma tę właściwość, że jest widoczna w każdym miejscu Twojego systemu (oczywiscie wszędzie po użyciu session_start()).

Dlatego łatwo możesz zrobić tak:
  1. <?php
  2. if ( $_SESSION['zalogowany'] == true ){
  3. // tu wyświetlasz wywoływaną stronę
  4. } else {
  5. // tu wyswietlasz formularz logowania
  6. }
  7. ?>


jako, że $_SESSION jest tablicą możesz normalnie z niej korzystać jak z normalnej tablicy i zapisywać do niej wszystko co zapragniesz, na przykład wszelkie informacje o dodawanych dokumentach:

  1. <?php
  2. $_SESSION['dokument'] = array(
  3. 'nazwa' => 'tytul dokumentu',
  4. 'data_wprowadzenia' => '2008-04-29'
  5. );
  6. ?>


a następnie wszelkie dane z sesji możesz wpisywać do bazy danych (jeśli $_POST Ci nie wystarczy), mniej więcej tak:

  1. <?php
  2. // tu laczysz sie z baza mysql
  3. mysql_query($db, "INSERT INTO dokumenty VALUES(null, '".$_SESSION['dokument']['nazwa']."', '".$_SESSION['dokument']['data_wprowadzenia']."');");
  4. ?>



oczywiście tu Ci tylko naświetliłem o co mniej więcej chodzi (na pewno nie musisz używać dwóch sesji), więcej o sesjach poszukaj w google lub na tym forum.

Pozdrawiam
Cezar708
JarekG
Super. Dziękuję za rozświetlenie mi tego czarnego obszaru smile.gif. Non stop staram się rozwijać swoje umiejętności programistyczne hehe smile.gif, z różnym skutkiem smile.gif.
Fakt że nie do końca rozumiałem mechanizm sesji, nie wpadłem na to żeby zastosować w sesji tablice - tu moje niedoświadczenie - i fakt że na internecie przykładów jakiś jak dla mnie fajnych, niestety nie znalazłem sad.gif. Wszystko traktowało o logowaniu użytkowników itd. Bawiłem się dzisiaj trochę mechanizmami sesji i mniej więcej zczaiłem to na tyle na ile napisałem smile.gif.

Idąc dalej...
Mniej więcej jasne jest dla mnie to co napisaliście ale...
Jeśli mam formularz dodawania jakiś pozycji do bazy, to powiedzmy wypełniam go sobie, korzystając z sesji, dodaję jeden rekord do bazy i teraz muszę jakoś wyczyścić pamięć elementów $_SESSION['dokument']['elementy'], ponieważ mechanizm sesji mi je zapamięta chyba, prawda ? Czy po wpisaniu wartości do pól dopisze zupełnie inne - nowe rekordy do bazy ?
Jeśli będę chciał dodać zupełnie nowy dokument, to będę musiał również mieć jakiś unikalny identyfikator którym ten dokument będzie się identyfikował. Wymyśliłem sobie żeby to była wartość właśnie session_id(); ale generalnie z tej sytuacji która przedstawiliście mi tutaj może to być poprostu numer id dokumentu i wtedy session_id(); nie będzie wartością zapisywaną w bazie.

Dodatkowo chciałem wystartować na głęboką wodę i użyć elementów javy script żeby przy pomocy jakby jednej sesji stworzyć cały dokument do dodania poprzez dynamiczne dodawanie poszczególnych edytowalnych elementów, znalazłem sobie nawet skrypt do tego, ale niestety póki co za wysoko mierzę smile.gif. Może za 30 lat smile.gif...
Nie wiem czy w ogóle dobrze myślę ale tak czy inaczej dziękuję za naprowadzanie na dobrą drogę smile.gif.
Cezar708
tak, zmienne w sesji zawsze będą, (oczywiście w szerszym sensie), a do usuwania zmiennych z sesji służy po prostu funkcja: unset(), za jej pomocą usuniesz wszelkie nipotrzebne dane z sesji.


a jeśli chodzi o javaScript proponuję abyś poczytał sobie na temat ajaxa. Mogę Ci polecić advAJAX. Myślę, że do Twoich potrzeb będzie idealny.

Pozdrawiam
Cezar708
JarekG
Cytat(Cezar708 @ 28.04.2008, 20:15:14 ) *
tak, zmienne w sesji zawsze będą, (oczywiście w szerszym sensie), a do usuwania zmiennych z sesji służy po prostu funkcja: unset(), za jej pomocą usuniesz wszelkie nipotrzebne dane z sesji.

Czyli generalnie jeśli zrobię sobie dodawanie danych do bazy to najpierw muszę zrobić insert into... a zaraz po nim unset('zmienna1)... itd. ?

Cytat(Cezar708 @ 28.04.2008, 20:15:14 ) *
a jeśli chodzi o javaScript proponuję abyś poczytał sobie na temat ajaxa. Mogę Ci polecić advAJAX. Myślę, że do Twoich potrzeb będzie idealny.

Pozdrawiam
Cezar708

Fajne i ciekawe smile.gif. AJAX-a znałem już wcześniej - w sensie co to takiego jest - ale nigdy nie używałem. Chyba czas będzie się bardziej zainteresować, chociaż szczerze, to bardziej wierzyłem w perl-a, którego się już zacząłem uczyć i jakoś bardziej do mnie przemawiał. Może nie do konstrukcji stron www, bo zajmuję się trochę innymi rzeczami również, gdzie perl był dla mnie po prostu idealny smile.gif.

A co do moich zastosowań to ten skrypt który miałem to byłby ok, tylko problem pojawia się w momencie dodawania do bazy, ponieważ wszystkie pola w sensie ze ich tag NAME musi być taki sam, więc jak dodać wszystko na raz ?

Hm... foreach ?
Cezar708
Cytat(JarekG @ 29.04.2008, 08:23:58 ) *
Czyli generalnie jeśli zrobię sobie dodawanie danych do bazy to najpierw muszę zrobić insert into... a zaraz po nim unset('zmienna1)... itd. ?

lub zamiast usuwać możesz ewentualnie nadpisywać nowymi wartościami
Cytat(JarekG @ 29.04.2008, 08:23:58 ) *
Fajne i ciekawe smile.gif. AJAX-a znałem już wcześniej - w sensie co to takiego jest - ale nigdy nie używałem. Chyba czas będzie się bardziej zainteresować, chociaż szczerze, to bardziej wierzyłem w perl-a,

no niekoniecznie... perl również jest językiem, który ewentualnie byłby wykonywany po stronie serwera (podobnie jak PHP, popraw mnie jak się mylę) a do komunikacji z tym serwerem może być użyty również ajax, bo on jest oparty o JavaScript i działa po stronie przeglądarki internetowej
Cytat(JarekG @ 29.04.2008, 08:23:58 ) *
Hm... foreach ?


dokładnie.. foreach byłby idealny, oczywiście musisz inaczej zapisywać dane do bazy, coś na styl:

  1. <?php
  2. $dukument = array('tytul', 'data_wydania');
  3. $_SESSION['dokumenty'][] = $dukument;
  4. ?>


a następnie wrzucając do bazy danych:

  1. <?php
  2. foreach( $_SESSION['dokumenty'] as $dokument ){
  3. query("INSERT...... VALUES (...".$dokument['tytul']. "', '". $dokument['data'];
  4. }
  5. ?>
JarekG
Dziękuję Ci za pomoc smile.gif.

W razie pytań będę je po prostu zadawał smile.gif

Witam smile.gif.

W końcu przysiadłem do tego co miałem napisać i odświeżam swój temat.

Już na samym początku pracy z sesjami [chyba jednak nie do końca to rozumiem sad.gif], pojawił się problem.

Otóż mam taką sytuację, że podczas tworzenia nowego dokumentu chciałbym żeby była tworzona sesja i w niej zapisywane wartości o identyfikatorze sesji, oraz nazwie wybranej z listy "SELECT".

Na początek tworzę sesję oraz generuję identyfikator.
  1. <?php
  2.  
  3. $sid=session_id();
  4. ?>



Teraz łączę się z bazą danych, wyciągam informację i chcę je przekazać dalej, zapisując w zmiennej $_SESSION['nazwa_firmy'] informację z tego co wyciągnę z SELECT-a.

  1. <?php
  2.  
  3. include_once "funkcje.php";
  4.  
  5.  
  6. polacz();
  7.  
  8.  
  9. echo "<form action=\"dodawanie_faktury2.php\" method=\"GET\">";
  10. $query="select id, nazwa_firmy from firmy order by nazwa_firmy;";
  11. $result=mysql_query($query,polacz());
  12. echo "<select name=\"id_firmy\">";
  13. while ($row = mysql_fetch_array($result))
  14. {
  15.  $_SESSION['nazwa_firmy'] = $nazwa_firmy = $row['nazwa_firmy'];
  16.  $id = $row['id'] ;
  17.  echo "<option value=\"$id\">$nazwa_firmy</option>";
  18. }
  19. echo "<INPUT TYPE=\"SUBMIT\" VALUE=\"ZATWIERDŹ\"";
  20. echo "</form>";
  21. ?>


No i teraz pobierana jest zmienna z select name i ... no właśnie nie mam pomysłu jak to wymyślić żeby było tak jak chcę, a chcę tak, że jak wybiorę sobie z listy pozycję to ma ona być zapisana w zmiennej [najlepiej] $_SESSION['firma']['id_firmy'] oraz $_SESSION['firma']['nazwa_firmy'].

Dokument z form action to dokument który ma za zadanie wyświetlić dane z sesji, i wyświetla... ale cały czas to samo :/, bez względu na to co wybiorę z listy.

Proszę o pomoc.

Dziękuję.
Landon
Tak trochę an offtopie ale jako ciekawostka dla młodych.

ogólnie zasada działania sesji polega na tym że dane są zapisywane gdzieś przeważnie do pliku o nie znanym rozszerzeniu na twoim serwerku. Lecz większość firm hostingowych blokuje dostęp do nich. Przykładowym plikiem będzie

lang|s:2:"pl";id|s:1:"1";login|s:6:"costam";haslo|s:3:"lul";
Przyjmijmy że wyślemy $_SESSION['lang'] = 'pl';
i zostaje zapisane: lang|s:2:"pl";

Pewnie wielu z was zastanawia się dlaczego to jest tak zbudowane, a więc

lang - nazwa elementu tablicy
| - separator oddzielający dane o nazwie elementu tablicy ($_SESSION) od przypisanej wartości
s:2 - oznacza że będzie składać się z 2 liter
: - a po tym treść treść
"..." - w miejsce kropek jest wpisane wartość przypisana.

Napisałem to przy okazji by młodzi szybciej zrozumieli jak to działa
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.