Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][PHP]Problem z przekazaniem zmiennej z sesji
Forum PHP.pl > Forum > Przedszkole
qbas-s
W głównej klasie do sesji wczytuję pewną wartość:
  1. $_SESSION['user_id'] = $user_id;


następnie po kliknięciu w button za pomocą JQuery pobieram inną klasę w której próbuję pobrać wartość z sesji - niestety nic mi się nie wyświetla. Dodanie w drugiej klasie session_start() nie pomaga.
Pomyślałem, że sprawę może załatwi dziedziczenie po pierwszej klasie ale wyrzuca: Internal Server Error

Z pewnością problem by rozwiązało przekazanie wartości sesji w polu typu hidden ale zależy mi aby uniknąć tego sposobu.
Jakieś pomysły?smile.gif
Damonsson
Co to ma wspólnego z AJAXem?
qbas-s
w tagach nie było JQuery, dla jednego i drugiego wspólne słowo to asynchroniczność wink.gif
!*!
Wartości nie biorą się z kosmosu. Ajax to nic innego jak odwołanie w tle, takie samo jak każde inne. Jak chcesz aby było widoczne, musisz je tak samo wywołać.
qbas-s
do dziś myślałem, że jeśli coś wrzucam do sesji to w pewnym przedziale czasu jest dostępne w całym skrypcie - tak min działają niektóre koszyki w sklepach, więc nie rozumiem dlaczego ta wartość nie jest dostępna w pliku wczytanym asynchronicznie?
nospor
A startujesz sesję w pliku wczytanym asynchronicznie?
!*!
skrypt.php
  1. //deklaracja sesji
  2. if(isset(post))
  3. {
  4.  
  5. //cokolwiek
  6.  
  7. if(is_ajax())
  8. {
  9. /// WOW odwolanie przez ajax
  10. return true; // zwracasz dane, czy co tam chcesz
  11. }
  12. else
  13. {
  14. // tu skrypt dziala normalnie gdy nie ma odwolania przez ajax
  15. }
  16.  
  17. }


Jak robisz to inaczej, to robisz coś źle wink.gif
qbas-s
@nospor tak deklaruję session_start() w kontstruktorze klasy którą asynchronicznie wczytuje, dla pewności ustawiam też session_save_path($katalog). @!*! JQuery dba o to aby plik pobierany był tak jak napisałeś
nospor
A konstruktor tej klasy się odpala...? Może pokaż kod, bo to nie ma co wróżyć z fusów.
qbas-s
odpala się.
Buduję aplikację z użyciem Kohany 3.2 a w niej odpalam skrypt do upload'u plików graficznych:
http://blueimp.github.com/jQuery-File-Upload/
klasa która się wczytuje w tle znajduję się w server/php/UploadHandler.php

początek konstruktora na moje potrzeby w tej klasie zmodyfikowałem tak:
  1. function __construct($options = null, $initialize = true) {
  2. $this->options = array(
  3. 'script_url' => $this->get_full_url() . '/',
  4. 'upload_dir' => '/var/www/www.pl/web/sc/public/static/profil_photo/' . $_SESSION['user_id'] . '/', //dirname($_SERVER['SCRIPT_FILENAME']).'/files/',
  5. 'upload_url' => '/public/static/profil_photo/' . $_SESSION['user_id'] . '/',


Wszystko działa pięknie prócz przemycenia id użytkownika w sesji - pliki mają być ładowane do folderu o nazwie $_SESSION['user_id']
!*!
To jest konstruktor który odpala się też przez ajax? Pokaż jeszcze kod JS.
qbas-s
pliki ładują się na serwer w pełni asynchronicznie - gdyby ajax nie odpalał konstruktora to skrypt nie miałby dostępu do indexu 'upload_dir' tablicy w konstruktorze co skutkowało by błędem w uploadzie a tak nie jest.

  1.  
  2. /*jslint nomen: true, unparam: true, regexp: true */
  3. /*global $, window, document */
  4.  
  5. $(function () {
  6. 'use strict';
  7.  
  8. // Initialize the jQuery File Upload widget:
  9. $('#fileupload').fileupload({
  10. // Uncomment the following to send cross-domain cookies:
  11. //xhrFields: {withCredentials: true},
  12. url: 'server/php/'
  13. });
  14.  
  15. // Enable iframe cross-domain access via redirect option:
  16. $('#fileupload').fileupload(
  17. 'option',
  18. 'redirect',
  19. window.location.href.replace(
  20. /\/[^\/]*$/,
  21. '/cors/result.html?%s'
  22. )
  23. );
  24.  
  25. if (window.location.hostname === 'blueimp.github.com') {
  26. // Demo settings:
  27. $('#fileupload').fileupload('option', {
  28. url: '//jquery-file-upload.appspot.com/',
  29. maxFileSize: 5000000,
  30. acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
  31. process: [
  32. {
  33. action: 'load',
  34. fileTypes: /^image\/(gif|jpeg|png)$/,
  35. maxFileSize: 20000000 // 20MB
  36. },
  37. {
  38. action: 'resize',
  39. maxWidth: 1440,
  40. maxHeight: 900
  41. },
  42. {
  43. action: 'save'
  44. }
  45. ]
  46. });
  47. // Upload server status check for browsers with CORS support:
  48. if ($.support.cors) {
  49. $.ajax({
  50. url: '//jquery-file-upload.appspot.com/',
  51. type: 'HEAD'
  52. }).fail(function () {
  53. $('<span class="alert alert-error"/>')
  54. .text('Upload server currently unavailable - ' +
  55. new Date())
  56. .appendTo('#fileupload');
  57. });
  58. }
  59. } else {
  60. // Load existing files:
  61. $.ajax({
  62. // Uncomment the following to send cross-domain cookies:
  63. //xhrFields: {withCredentials: true},
  64. url: $('#fileupload').fileupload('option', 'url'),
  65. dataType: 'json',
  66. context: $('#fileupload')[0]
  67. }).done(function (result) {
  68. $(this).fileupload('option', 'done')
  69. .call(this, null, {result: result});
  70. });
  71. }
  72.  
  73. });


w folderze server/php/ jest index.php który odpala klasę wyżej
!*!
Użyj odpowiednich tagów na forum.
Zmieniłeś te wartości na swoje?
JS to tylko dodatek, masz przez ajax odwołać się do skryptu dokładnie tak samo jakbyś to robił wpisując adres w przeglądarce.
qbas-s
nie ma tagu JS więc początkowo ustawiłem na Manual a teraz na HTML:)

jedyne co zmieniłem w tym JS to ścieżkę do klasy w:
  1. $('#fileupload').fileupload({
  2. // Uncomment the following to send cross-domain cookies:
  3. //xhrFields: {withCredentials: true},
  4. url: 'server/php/'
  5. });


i wszystko działa ślicznie prócz odczytu wartości z sesji - nawet nie mogę użyć wbudowanego systemu obsługi sesji Kohany bo dziedziczenie po innej klasie wywala Internal Server Error
!*!
Jest tag JavaScript.

Podaj pełną ścieżkę do skryptu. Opierasz to tylko JS? IMO nie ustalasz sesji w ogóle, tylko inicjujesz klasę asynchronicznie bezpośrednio.
qbas-s
mam tylko 5 tagów i żaden z nich nie jest JS. Podałem pełną ścieżkę do klasy i to samo

Cytat
IMO nie ustalasz sesji w ogóle, tylko inicjujesz klasę asynchronicznie bezpośrednio

co masz na myśli?

sesje inicjuję wcześniej w klasie kohany i tam też następuje zapisanie user id do niej.
!*!
To wpisuj z palca [javascript].

Skrypt ma działać tak jak opisałem wyżej. Spróbuj zrobić do niego odwołanie na czysto w JQuery.ajax, aby sprawdzić czy działa. Jak tak, to problem leży po stronie tamtego kodu, a jak nie, to wina leży po Twojej wink.gif

Sesje inicjujesz w klasie kohany, ale czy ją wywołujesz razem ze skryptem do którego odwołujesz się asynchronicznie?
qbas-s
Cytat
Sesje inicjujesz w klasie kohany, ale czy ją wywołujesz razem ze skryptem do którego odwołujesz się asynchronicznie?


jak takie odwołanie wygląda?
!*!
Ścieżka do skryptu == odwołanie do niego.
qbas-s
skrypt uploadu jest wczytywany do widoku właśnie przez kontroler w którym jest zapisywana wartość do sesji. Dziedziczenie po tej klasie tak jak już wspominałem wyrzuca Internal Server Error - wywołanie bezpośrednio w tle tej nadrzędnej klasy chyba by nie było dobrym pomysłem



EDIT:
skrypt ładowany w tle nie odczytuje też cookies
!*!
Moim zdaniem robisz to źle, nie tak jak napisałem wyżej, dlatego nie otrzymujesz żadnych danych. Zrób to jak należy, ewentualnie zapytaj na forum kohany, lub sprawdź to na czystym PHP bez JS.
qbas-s
ok tylko nie wiem jak ja mam Twoją podpowiedź wdrożyć w moim przypadku. To o czym pisałeś obsługuje domyślnie silnik JQuery...(chyba)

Może to coś pomoże: w firebugu podczas wczytywania zdjęcia wyrzuca mi takie nagłówki:

Kod
Nagłówki odpowiedzi
Date    Tue, 05 Mar 2013 21:05:45 GMT
Server    Apache/2.2.16 (Debian)
X-Powered-By    PHP/5.3.20-1~dotdeb.0
Expires    Thu, 19 Nov 1981 08:52:00 GMT
Pragma    no-cache
Cache-Control    no-store, no-cache, must-revalidate
Content-Disposition    inline; filename="files.json"
X-Content-Type-Options    nosniff
Access-Control-Allow-Orig...    *
Access-Control-Allow-Cred...    false
Access-Control-Allow-Meth...    OPTIONS, HEAD, GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Head...    Content-Type, Content-Range, Content-Disposition
Vary    Accept,Host
Keep-Alive    timeout=15, max=100
Connection    Keep-Alive
Transfer-Encoding    chunked
Content-Type    application/json

Nagłówki zapytania
Host    mojadomena.pl
User-Agent    Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept    application/json, text/javascript, */*; q=0.01
Accept-Language    pl,en-us;q=0.7,en;q=0.3
Accept-Encoding    gzip, deflate
Connection    keep-alive
X-Requested-With    XMLHttpRequest
Referer    http://mojadomena.pl/index.php/profilsettings/add_photo
Content-Length    108179
Content-Type    multipart/form-data; boundary=---------------------------41184676334
Cookie    session=5ap35e9a7ruot715ekg8k56hc5; PHPSESSID=rh54v57hdcju4gf7q2bj943320
!*!
Cytat(qbas-s @ 5.03.2013, 22:09:35 ) *
ok tylko nie wiem jak ja mam Twoją podpowiedź wdrożyć w moim przypadku. To o czym pisałeś obsługuje domyślnie silnik JQuery...(chyba)


Masz link
Cytat


Który odpala kontroler Jakistam. W nim masz metodę w której umieszczasz coś takiego http://forum.php.pl/index.php?s=&showt...t&p=1029855

I tak:

1. Sprawdzaj czy jest sesja, a jak nie to ja utwórz
2. sprawdź czy wysyłanie POST działa
3. jak powyższe są na TAK to wrzuć gdzieś IF (po sprawdzeniu czy jest sesja i czy dane przyszły z POST) i czy zapytanie przyszło z AJAX

Prościej się nie da tego wytłumaczyć.
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.