Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: rozdzielenie danych przechowywanych w $_SESSION
Forum PHP.pl > Forum > PHP
misty
witam!
mam maly problem, przedstawia sie on nastepujaco:
mam pewna tablice $_SESSION['aa'] w ktorej przechowuje rozne dane (tzn tablica ta moze ale nie musi zawieraz jedna lub wiecej danych);
w dalszej czesci skryptu musze dane z tej tablicy wyciagnac i wstawic do bazy (postgres).. i tu zaczynaja sie schody, gdyz jesli moja tablica $_SESSION['aa'] zawiera wiecej niz 1 dana, wszystkie one sa wstawiane do jednej komorki..
przyklad:
  1. <?php
  2. $tablica=implode($_SESSION['aa']); //powiedzmy ze zawiera ona kilka danych, np. 'xx', 'yy', 'zz'
  3. $policz_elementy=count($_SESSION['aa']);
  4. //wstawiamy dane
  5.  
  6. for ($i=1; $i<$policz_dane+1; $i++)
  7. {
  8. $zapytanie="insert into testowa (wartosci) values ('$tablica');";
  9. $wynik=pg_query($polaczenie, $zapytanie);
  10. }
  11. ?>


w takim wypadku do bazy dodana zostanie jedna komorka zawierajaca (w tym wypadku jedna dana..) 'xxyyzz';
no ale 'xx', 'yy' i 'zz' to trzy rozne dane przechowywane tylko w tej samej tablicy..
jak zrobic by dane zostaly rozdzielone i kazde z nich z osobna dodane do swojej wlasnej komorki?

z gory dzieki za sugestie!
pzdr!
babejsza
  1. <?php
  2. foeach($_SESSION['aa'] as $value)
  3. {
  4.  $zapytanie="insert into testowa (wartosci) values ('$value')";
  5. $wynik=pg_query($polaczenie, $zapytanie);
  6. }
  7. ?>


Oczywiście przy założeniu, że dane w sesji są w tablicy.

czyli np.:

  1. <?php
  2. $_SESSION['aa'] = array(1, 2, 3, 4);
  3. ?>
starach
Super i wykonujesz dzięki temu 5 zapytań jeśli jest 5 pól w tablicy.
<?php
Kod
$values ='';
foreach($_SESSION['aa'] as $value)
{
  $values .= "'$value',";
}
// i trzeba jeszcze usunac ostatni przecinek z $values
$values = substr($values, 0, strlen($values)-1);
$zapytanie="insert into testowa (nazwa_pola) values($values)";
$wynik=pg_query($polaczenie, $zapytanie);
?>
misty
babejsza-dziekuje:)

orglee, wystarczy:
  1. <?php
  2. foreach ($_SESSION['aa'] as $data)
  3. {
  4. $zapytanie="insert into testowa (wartosci) values ('$data');";
  5. $wynik=pg_query($polaczenie, $zapytanie);
  6. }
  7. ?>


i chodzi ladnie i bez problemow.
a co do tego ze wczesniej zliczalam elementy tablicy to po prostu myslalam ze moze zrobic jakas petle ktora bedzie rozdzielac dane w tablicy $_SESSION i bedzie je wrzucac do bazy az do momentu < wielkosc_tablicy + 1.
no ale moj pomysl nie byl najlepszy, po prostu probowalam cos wykombinowac;) za to babejszy smiga:)
starach
Faaaajnie (ironia)
Wyobraź sobie tylko kiedy na stronę wejdzie powiedzmy 1 K użytkowników
i nagle będzie trzeba wywołać to dla nich wszystkich. Ile będzie zapytań do bazy ? 1000 * 5 =
Owszem są to rozważania czysto teoretyczne,
ale jak już się pisze skrypty to powinno się zwracać uwagę na wydajność.
Przynajmniej tak mi się wydaje...
misty
ej no wyluzuj..
przeciez zdaje sobie z tego sprawe ze moj pomysl nie jest dobry, dlatego poszukalam porady na tym forum.
a to ze wczesniej na wlasna reke probowalam znalezc jakies wlasne rozwiazanie (w tym przypadku zle mi wyszlo) to chyba nic haniebnego?


btw. wiesz moze jak zrobic zlaczenie 2ch foreach?
tzn tych tablic sesyjnych mam wiecej.. czyli w wiekszej ilosci tabel musze rozdzielic dane nim je wprowadze do bazy. chodzi mi o cos takiego:

  1. <?php
  2. foreach (($_SESSION['aa'] as $data) && ($_SESSION['bb'] as $value))
  3. {
  4. $pyt="insert into tabela (wartosc_jeden, wartosc_dwa) values ('$data', '$value');";
  5. $wynik=pg_query($polaczenie, $pyt);
  6. }
  7. ?>


tzn oczywiscie ten warunek zlaczenia '&&' tu jest zle, chodzi mi o to jak uzyskac taki efekt jak za pomoca 'and' (rozdziel jedno i drugie wtedy wstaw do bazy)
starach
Ja jestem całkowicie wyluzowany, natomiast ironizowanie wypowiedzi zdarzeń etc. to mój specyficzny styl bycia - taki znak firmowy winksmiley.jpg

Pozwól że uściślę swoją wypowiedź.
Wykonujecie zapytanie w pętli zamiast posłużyć się składnią alternatywną polecenia SQL co może skutkować spadkiem wydajności.

Mam nadzieję że to napisałem mniej .... nieuprzejmym sposobem tongue.gif

edit>
I jak edytujesz posta to nie wykorzystuj błędu forum IPB tongue.gif
misty
spoko nie gniewam sie prawie winksmiley.jpg
a bede jeszcze mniej sie gniewac jak mi podpowiesz jak te foreach polaczyc winksmiley.jpg
starach
  1. <?php
  2. $array1 = array(1,2,3,4,5);
  3. $array2 = array('jeden','dwa','trzy','cztery','piec');
  4. $values='';
  5. for($i=0; $i<count($array1); $i++)
  6. {
  7. $values .= "('{$array1[$i]}','{$array2[$i]}'),";
  8. }
  9.  
  10. $pyt="INSERT INTO `tabela` (`wartosc_jeden`, `wartosc_dwa`) values$values";
  11. $pyt=substr($pyt,0,strlen($pyt)-1).';';
  12. echo "<hr>$pyt<hr>";
  13. ?>

Nie da się łączyć dwóch tablic w jednej instrukcji foreach()
aha nawiasy klamrowe {,} są do tego żeby ich zawartość została odczytana jako wyrażenie.
Bez nich zostało by to odczytane jako $array1 a [$i] było by potraktowane jako tekst.
Hmm co jeszcze. No chyba to wszystko co do wyjaśnienia.
Pięć złotych zadość uczynienia proszę tongue.gif
misty
ciezki ten Twoj zapis..
gdzie on rozdziela jedna tablice od drugiej?
a zapytanie w postaci:
  1. <?php
  2. $pyt="INSERT INTO `tabela` (`wartosc_jeden`, `wartosc_dwa`) values ($values)";
  3. ?>

przeciez nie przejdzie, bo bedzie krzyczal ze ma wiecej kolumn niz podales mu wartosci..

no i bez sensu ze sie nie da laczyc dwoch tabel w foreac winksmiley.jpg

przerobilam to mniej wiecej na cos takiego:
  1. <?php
  2. $tablica_jeden=array($_SESSION['bb']);
  3. $tablica_dwa=array($_SESSION['cc']);
  4.  
  5. $values='';
  6. for($i=0; $i<count($tablica_jeden); $i++)
  7. {
  8. $values .="('{$tablica_jeden[$i]}' , '{$tablica_dwa[$i]}')";
  9. }
  10.  
  11. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values (1, $values, $values);";
  12. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  13. $wynik02=pg_query($polaczenie, $zapytanie02);
  14. ?>

no ale ni w cholere.. zreszta jakos nie do konca do mnie przemawia ten kod :/
starach
Przetestuj to co ci napisałem bo to co podałem jest składnią alternatywną polecenia INSERT w SQL'u i nie ma mowy żeby nie działało.
Jak to gdzie rozdziela jedną tablicę od drugiej ?
Jeżeli masz string w postaci 1,2,3,4,5,6,7,8 to zastosuj na nim funkcję explode() żeby każda z liczb znalazła się w osobnym elemencie tablicy.

$tablica = explode(',' , '1,2,3,4,5,6,7,8');
I masz to co ja napisałem czyli:
$array1 = array(1,2,3,4,5);
starach
Wyświetl zapytanie jakie wykonujesz przez pg_query() przed wysłaniem.
I wklej tutaj na forum.
misty
  1. <?php
  2. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values (1, $values, $values);"
  3. ?>


gdzie zadanie_id to jest cos co na razie wpisuje na sztywno (wartosc=1), zrodlo_finansowania to elementy tablicy $_SESSION['cc'], zas kwota to elementy tablicy $_SESSION['bb']..
starach
Ehh no i źle robisz skoro wartości są generowane dynamicznie to jak w pozostałych nawiasach ma się znaleźć 1 ?
  1. <?php
  2. $tablica_jeden=array($_SESSION['bb']);
  3. $tablica_dwa=array($_SESSION['cc']);
  4.  
  5. $values='';
  6. for($i=0; $i<count($tablica_jeden); $i++)
  7. {
  8. $values .="('{$tablica_jeden[$i]}' , '{$tablica_dwa[$i]}')";
  9. }
  10.  
  11. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values (1, $values, $values);";
  12. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  13. echo '<b>'.$zapytanie02.'</b>';
  14. ?>

i napisz tutaj wynik.
misty
wkleilam dokladnie to co podales, nie zmieniajac zupelnie nic. a oto wynik:

insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values (1, ('Array' , 'Array'), ('Array' , 'Array'));" title="Zobacz w manualu PHP" target="_manual

no a w bazie pusto..
z tego co rozumiem ( a przynajmniej probuje winksmiley.jpg ) to w $values sa obie tablice.. i nie sa one rozdzielane..

tzn rozdzielic te 2 tablice, to nie problem wystarczy zamiast samego $values dac np. $values1 i $values2 i kazda tablice do osobnej zmiennej. tylko ze on nie widzi wartosci tych tablic, tzn tego co w nich jest. wie tylko ze to 'array'..
starach
echo '<b>'.$_SESSION['cc'].'<br>';
echo $_SESSION['bb'].'</b><br>';
To jeszcze ten kod wykonaj i podaj na forum,
lub jeśli dane są ważne (nie do upubliczniania) to je zmień,
ale niech struktura jaka była taka pozostanie. smile.gif
misty
obie zwrocily Array..
no wlasnie po to potrzebne foreach.. by mi elementy pokazalo tablicy..
co za dziadostwo!
starach
Tfu źle pomyliłem się.
Zamiast echo daj print_r()
a dokładnie:
  1. <?php
  2. echo '<hr><pre>'.print_r($_SESSION['cc'],true).'<hr>'.print_r($_SESSION['bb'],true).'</pre><hr>';
  3. ?>
misty
otrzymalam:


insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values (1, ('Array'), ('Array'));
------------------------------------------------------
Array
(
[0] => 1
[1] => 2
)
-------------------------------------------
Array
(
[0] => 111
[1] => 666
)
" title="Zobacz w manualu PHP" target="_manual


i wiesz, to by sie nawet zgadzalo. tzn pierwsza tablica przechowuje id pewnych elementow ktore wybieram z listy rozwijanej, wybralam elementy o id 1 i 2 wiec wyswietlilo ok. co do drugiej tablicy tez sie zgadza, bo wyswietlila wpisane przeze mnie przykladowe kwoty, czyli 111 i 666..
tylko czemu w takim razie nie dziala to wstawianie do bazy?
starach
  1. <?php
  2. $tablica_jeden=$_SESSION['bb'];
  3. $tablica_dwa=$_SESSION['cc'];
  4.  
  5. $values='';
  6. for($i=0; $i<count($tablica_jeden); $i++)
  7. {
  8. $values .="(1,'{$tablica_jeden[$i]}' , '{$tablica_dwa[$i]}')";
  9. }
  10.  
  11. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values$values";
  12. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  13. echo '<b>'.$zapytanie02.'</b>';
  14. ?>

Wykonaj i wklej zapytanie które zostanie zwrócone.
Jeszcze jedna sprawa jeśli w twojej bazie danych pole zadanie_id jest ustawione na auto_increment to nie musisz go podawać a wydaje mi się że właśnie tak jest skoro za każdym razem chcesz podawać jeden więc powyższy kod może równie dobrze wyglądać tak:
  1. <?php
  2. $tablica_jeden=$_SESSION['bb'];
  3. $tablica_dwa=$_SESSION['cc'];
  4.  
  5. $values='';
  6. for($i=0; $i<count($tablica_jeden); $i++)
  7. {
  8. $values .="('{$tablica_jeden[$i]}' , '{$tablica_dwa[$i]}')";
  9. }
  10.  
  11. $zapytanie02="insert into t_przejsciowa (zrodlo_finansowania_id, kwota) values$values";
  12. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  13. echo '<b>'.$zapytanie02.'</b>';
  14. ?>
Daj tutaj kod który zostanie wyświetlony teraz będzie już prawdopodobnie dobrze i możesz zamienić kod wyświetlający zapytanie na ekranie na kod który wysyła je do bazy.
misty
zrobilam tak:
  1. <?php
  2. $tablica_jeden=$_SESSION['bb'];
  3. $tablica_dwa=$_SESSION['cc'];
  4.  
  5. $wartosc_jeden='';
  6. $wartosc_dwa='';
  7.  
  8. for($i=0; $i<count($tablica_jeden); $i++)
  9. {
  10.  
  11. $wartosc_jeden .="('{$tablica_jeden[$i]}')";
  12. $wartosc_dwa .="('{$tablica_dwa[$i]}')";
  13.  
  14. }
  15.  
  16. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values (1,$wartosc_jeden, $wartosc_dwa);";
  17. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  18. echo '<b>'.$zapytanie02.'</b>';
  19. ?>

sorki, ale troche mnie razi to wrzucanie tablic do jednej zmiennej, tzn jest dla mnie malo czytelne. efekt:

insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values (1,('898')('8888888'), ('1')('3'));" title="Zobacz w manualu PHP" target="_manual

z zerowym skutkiem w bazie:/

co do dalszej czesci Twojego posta zadanie_id nie jest identyfikatorem tej tablicy. id tej tablicy jest serial i sam sie zwieksza przy kazdym dodaniu. zadanie_id to bedzie pozniej pobierane skad inad jak sie z tym uporam, na razie dla swietego spokoju daje '1'. zreszta to i tak baza testowa..
starach
Zrozum dziewczyno, kobieto, babo czy jak tam wolisz żeby cię nazywano tongue.gif,
że nigdy tego nie wrzucisz do bazy w ten sposób.
To musi być w tej właśnie jednej zmiennej więc najpierw sprawdź jak ja to rozwiązałem a potem zacznij marudzić laugh.gif

insert into t_przejsciowa (zrodlo_finansowania_id, kwota) values ('898''8888888'), ('1','3'); Taki powinien być efekt końcowy.
Tak powinno wyglądać zapytanie żadnych dodatkowych nawiasów.
Zlituj się nad moderatorami forum bo będą wycinać, jak się obudzą 60 % naszej rozmowy tongue.gif Wykonaj kod który ci napisałem bo jest on dobrze napisany a jak uważasz inaczej to napisz PM do któregoś z opiekunów forum niech cię ochrzanią że im głowę zawracasz.

------- Jeżeli cię obraziłem swoją wypowiedzią to przepraszam,
ale ja staram się ci tylko pomóc ;(
misty
dobrze szefie, juz wrzucilam tak jak poprzednio pisales tongue.gif nic nie zmienialam!
i otrzymalam:

insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values(1,'9898' , '1')(1,'898' , '2');" title="Zobacz w manualu PHP" target="_manual


ps. nie obraziles mnie w zaden sposob, na prawde dziekuje ze probujesz mi pomoc bo ja tu strasznie utknelam i nie moge nic dalej robic :/
ps2. milo ze wreszcie ktos na tym forum zwraca sie do mnie w formie zenskiej biggrin.gif
starach
Hehe
No i w takiej postaci powinno się udać dodać do tabeli.
Trzeba tylko zamiast wyświetlania dać dodawanie do bazy.
---- Eee guzik. Nie wiem dlaczego ale zniknął przecinek między nawiasami ..
(1,'9898' , '1'),(1,'898' , '2'); - tak powinno być.
Zobacz czy nie wywaliłaś przez przypadek tego przecinka.
Cytat
ps2. milo ze wreszcie ktos na tym forum zwraca sie do mnie w formie zenskiej biggrin.gif

Bo to przecież takie nie kobiece zajęcie - do garów tongue.gif
misty
no nie mialam faktycznie, juz dodalam:
  1. <?php
  2. $tablica_jeden=$_SESSION['bb'];
  3. $tablica_dwa=$_SESSION['cc'];
  4.  
  5. $values='';
  6. for($i=0; $i<count($tablica_jeden); $i++)
  7. {
  8. $values .="(1,'{$tablica_jeden[$i]}','{$tablica_dwa[$i]}'),";
  9. }
  10.  
  11. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values$values;";
  12. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  13. $wynik02=pg_query($polaczenie, $zapytanie02);
  14. echo '<b>'.$zapytanie02.'</b>';
  15. ?>


tylko, tej, teraz to o jeden za duzo przecinek daje i dane sie i tak nie dodaja:


Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near ";" LINE 1: ...finansowania_id, kwota) values(1,'787','1'),(1,'7777','8'),; ^ in /var/www/htdocs/dodaj_zrodlov2.php on line 242
insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values(1,'787','1'),(1,'7777','8'),;" title="Zobacz w manualu PHP" target="_manual


tej, no to juz zmeczenie;) mialam jakis srednik niepotrzebny.. chodzi i dodaje;) i powiem Ci ze jak na poczatku oporna bylam Twojemu pomyslowi tak wreszcie juz kumam co i jak. nie wiem jak Ci dziekowac chlopie:)
starach
  1. <?php
  2. $tablica_jeden=$_SESSION['bb'];
  3. $tablica_dwa=$_SESSION['cc'];
  4.  
  5. $values='';
  6. for($i=0; $i<count($tablica_jeden); $i++)
  7. {
  8. $values .="(1,'{$tablica_jeden[$i]}','{$tablica_dwa[$i]}'),";
  9. }
  10.  
  11. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values$values;";
  12. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  13. $wynik02=pg_query($polaczenie, $zapytanie02);
  14. echo '<b>'.$zapytanie02.'</b>';
  15. ?>
$zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
Ta linijka wycina łańcuch znaków zostawiając ostatni przecinek.
W zmiennej $zapytanie02 zostają nawiasy bez ostatniego przecinka.
Dlaczego to nie działa ? Bo dodałaś na końcu poniższej linijki średnik:
$zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values$values;";
Poniższy kod generuje poprawne zapytanie:
  1. <?php
  2. $tablica_jeden=$_SESSION['bb'];
  3. $tablica_dwa=$_SESSION['cc'];
  4.  
  5. $values='';
  6. for($i=0; $i<count($tablica_jeden); $i++)
  7. {
  8. $values .="(1,'{$tablica_jeden[$i]}','{$tablica_dwa[$i]}'),";
  9. }
  10.  
  11. $zapytanie02="insert into t_przejsciowa (zadanie_id, zrodlo_finansowania_id, kwota) values$values";
  12. $zapytanie02=substr($zapytanie02,0,strlen($zapytanie02)-1).';';
  13. $wynik02=pg_query($polaczenie, $zapytanie02);
  14. echo '<b>'.$zapytanie02.'</b>';
  15. ?>

------------------
Kto by pomyślał że we mnie tyle cierpliwości.
Typowa jedynaczka. Zawsze musi mieć ostatnie zdanie i coś zmienić tongue.gif
misty
to Cie zdziwie bo nie jestem jedynaczka:P i nic nie zmieniam tylko kombinuje:P cale zycie trzeba kombinowac;)
ps. a wogole to wyprzedzilam Twojego ost posta:

tej, no to juz zmeczenie;) mialam jakis srednik niepotrzebny.. chodzi i dodaje;) i powiem Ci ze jak na poczatku oporna bylam Twojemu pomyslowi tak wreszcie juz kumam co i jak. nie wiem jak Ci dziekowac chlopie:)" title="Zobacz w manualu PHP" target="_manual
nie czytasz moich postow dokladnie tylko ochrzaniasz;)
no nic, jeszcze raz dzieki za pomoc!!:) milego dnia!:)
starach
Nie ma za co właściwie to ja powinienem być wdzięczny nabiłem sobie dzięki tobie 1,2,3....14 postów O_O normalnie wytrzeszcz oczu.
laugh.gif
edit>
Pierwsze zdanie out.
Może faktycznie nie zwróciłem uwagi
Masz rodzeństwo ? ... biedaki tongue.gif
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.