[php/jquery/ajax] post request slaat session niet op

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 04-07 11:33

Saven

Administrator

Topicstarter
Hi there, ik heb een probleem met een AJAX post request waarvan ik niet meer weet wat ik nog kan proberen.

Het gaat om het updaten van een winkelmandje, hiervoor post ik via AJAX een aantal values naar een pagina op dezelfde subdomain.

Mijn code voor het opslaan van de sessie
PHP:
1
2
3
4
5
6
7
$_SESSION['cart'] = 'winkelmandje inhoud';

if( isset($_POST['ajax']) )
{
    session_write_close();
    debug($_SESSION['cart']); //die() icm print_r() functie
}


Mijn html icm javascript:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    <form method="post" action="url.xx/winkelmandje/toevoegen">
        <input type="hidden" name="product_id" id="product_id" value="23" />
        <input type="text" name="qty" id="qty" value="1" maxlength="2" style="width:30px;" class="text" />
        <input type="submit" name="submit" id="btn_addtocart" value="Plaats in winkelmandje" class="button-blue" />
        <input type="hidden" name="ajax" value="1" id="ajax" />
    </form>

<script>

    $("#btn_addtocart").click(function()
    {
        var post_data =
        {
            product_id:  $("#product_id").val(),
            qty: $("#qty").val(),
            submit: true,
            ajax: true
        }
        
        $.ajax(
        {
            type: "POST",
            url: url + 'winkelmandje/toevoegen',
            data: post_data,
            success: function(data)
            {
                alert(data) //ik krijg dus wel gewoon de inhoud van mijn $_SESSION['cart']
            }
        });
        
        return false;
    });

</script>

In de form heb ik 'ajax' als hidden input gedaan zodat ik het ook even kon testen als ik zelf de request stuur via de browser ipv javscript. die hoort er natuurlijk normaal niet in :)

Oke het probleem:
Mijn php script slaat de sessie niet op als ik via AJAX het product in de winkelwagen wil zetten. Als ik javascript uitzet, en dus zelf de request uitvoer via de browser als het ware, lukt dit wel.

Mijn AJAX request geeft in een alert wel gewoon de waarde van $_SESSION['cart'] maar wordt niet opgeslagen. Terwijl als ik een directe request doe vanuit de browser de sessies wel opgeslagen worden.

Ik kom er niet meer uit, blijkbaar gaat er iets niet helemaal goed met de ajax post, maar wat? Kan iemand mij helpen of weet iemand een oplossing? Alvast enorm bedankt voor het meedenken,

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 02-07 15:18
Een stomme vraag misschien, maar moet je niet session_start (); gebruiken voordat je iets met je sessie kan doen?

Dat de var_dump werkt is niet raar, de globale $_session is natuurljk wel gezet, maar deze is iet in je daadwerkelijke sessie opgeslagen omdat je geen session_start hebt gebruikt.
Op dit moment in jouw script is $_session niets meer dan een gewone array.

[ Voor 53% gewijzigd door aaajeetee op 31-03-2013 22:35 ]


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 04-07 11:33

Saven

Administrator

Topicstarter
session_start() gebeurt way daarvoor al :) en anders deed ie het via een directe browser request ook niet toch? :P

[ Voor 88% gewijzigd door Saven op 31-03-2013 22:47 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Saven schreef op zondag 31 maart 2013 @ 22:45:
session_start() gebeurt way daarvoor al :) en anders deed ie het via een directe browser request ook niet toch? :P
Toon dan graag een volledig, doch minimaal, code-voorbeeld.

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 02-07 15:18
Saven schreef op zondag 31 maart 2013 @ 22:45:
session_start() gebeurt way daarvoor al :)
Dat laatste is natuurljjk niet waar, in het ajax script output je de session array. Als deze niet aanwezig is, maakt PHP die aan voor je. Het vardumpen werkt daarom wel.

Dit is dus blijkbaar niet alle code, ik stel voor dat je die eens neerzet?

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 04-07 11:33

Saven

Administrator

Topicstarter
De hele code is erg veel gezien het framework. het komt er op neer dat session_start() altijd wordt aangeroepen door mijn session class, die ook altijd wordt aangeroepen in mijn index.php

mijn index.php laadt de controller, winkelmandje in dit geval

Dit is mijn toevoegen method.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    //----------------------------------------------------------------
    // site.nl/winkelmandje/toevoegen
    //----------------------------------------------------------------
    public function toevoegen()
    {
        if( isset($_POST['submit']) )
        {
            //-------------------------------------
            // Check some values
            //-------------------------------------
            $qty = isset($_POST['qty']) ? $_POST['qty'] : 1;
            
            $qty = ctype_digit($qty) && ($qty > 0) ? round($qty) : 1;
            $qty = ($qty > 10) ? 10 : $qty;
            
            //-------------------------------------
            // Load products model
            //-------------------------------------
            $this->core->load->model('products_model');
            
            //-------------------------------------
            // Get products, if exist
            //-------------------------------------
            $product = $this->core->products_model->get_by_id( $_POST['product_id'] );
            
            //-------------------------------------
            // Product exists?
            //-------------------------------------
            if( $product !== false )
            {
                $cart           = array();
                $cart['id']     = $product['id'];
                $cart['name']   = $product['name'];
                $cart['price']  = $product['price'];
                $cart['qty']    = $qty;
                
                $this->core->cart->update($cart);
                
                //-------------------------------------
                // If it's an AJAX request json encode some stuff and die
                //-------------------------------------
                if( isset($_POST['ajax']) )
                {
                    session_write_close();
                    debug($this->core->session->get('cart'));
                }
            }
            elseif( isset($_POST['ajax']) )
            {
                //-------------------------------------
                // Product doesnt exists.
                // Send json error because this is AJAX call
                //-------------------------------------
                die( json_encode(false));
            }
            else
            {
                //-------------------------------------
                // Product doesnt exists
                // Redirect because normal call
                //-------------------------------------
                header('HTTP/1.0 302 Found', true, 302);
                location( url.'winkelmandje' );
                die();
            }
        }
        else
        {
            header('HTTP/1.0 302 Found', true, 302);
            location( url.'winkelmandje' );
            die();
        }


mijn session laag over php's session systeem. De init() functie fungeert als __construct() (die wordt dus altijd aangeroepen)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
class session
{
    //-----------------------------------------
    // Core object
    //-----------------------------------------
    public $core;
    
    //-----------------------------------------
    // store fingerprint
    //-----------------------------------------
    private $fingerprint = '';
    
    /*----------------------------------------------------*/
    // Init our handler
    // set session handler and start session
    /*----------------------------------------------------*/
    public function init()
    {
        session_set_save_handler
        (
            array(&$this, 'open'),
            array(&$this, 'close'),
            array(&$this, 'read'),
            array(&$this, 'write'),
            array(&$this, 'destroy'),
            array(&$this, 'gc')
        );
        
        session_start();
    }
    
    /*----------------------------------------------------*/
    // Get a user's fingerprint
    /*----------------------------------------------------*/
    private function fingerprint()
    {
        $print = @$_SERVER['HTTP_USER_AGENT'].'@';
        
        return sha1($print);
    }
    
    /*----------------------------------------------------*/
    // Get a session so we don't have to check everytime
    // If session is set
    /*----------------------------------------------------*/
    public function get($key)
    {
        if( isset($_SESSION[$key]) )
        {
            return $_SESSION[$key];
        }
        else
        {
            return false;
        }
    }
    
    /*----------------------------------------------------*/
    // Delete session cookie
    // Maybe useful sometime
    /*----------------------------------------------------*/
    public function delete_cookie()
    {
        setcookie(session_name(), '', -99999);
    }
    
    public function open($path, $name)
    {
        return true;
    }
    
    public function close()
    {
        return true;
    }
    
    public function read($sid)
    {
        $query = $this->core->db->prepare(
        "
            SELECT
                data, fingerprint
            FROM
                sessions
            WHERE
                id = :sess_id
            AND
                fingerprint = :print
            LIMIT 1
        ");
        
        $query->bindParam(':sess_id', $sid, PDO::PARAM_INT);
        $query->bindParam(':print', $this->fingerprint(), PDO::PARAM_STR);
        
        $query->execute();
        
        if( $query->rowCount() == 1 )
        {
            $fetch = $query->fetch(PDO::FETCH_ASSOC);
            
            return $fetch['data'];
        }
        else
        {
            return '';
        }
    }
    
    /*----------------------------------------------------*/
    // Write / update our session
    /*----------------------------------------------------*/
    public function write($sid, $data)
    {
        $get = $this->core->db->prepare(
        "
            SELECT
                id, fingerprint
            FROM
                sessions
            WHERE
                id = :sess_id
            LIMIT
                1
        ");
        
        $get->bindParam(':sess_id', $sid, PDO::PARAM_STR);
        
        $get->execute();
        
        if( $get->rowCount() == 1 )
        {
            $upd = $this->core->db->prepare(
            "
                UPDATE
                    sessions
                SET
                    data = :sess_data,
                    last_access = UNIX_TIMESTAMP(),
                    page = :page
                WHERE
                    id = :sess_id
                AND
                    fingerprint = :print
                LIMIT
                    1
            ");
            
            $upd->bindParam(':sess_id', $sid, PDO::PARAM_STR);
            $upd->bindParam(':print', $this->fingerprint(), PDO::PARAM_STR);
            $upd->bindParam(':sess_data', $data, PDO::PARAM_STR);
            $upd->bindParam(':page', request_uri(), PDO::PARAM_STR);
            
            $upd->execute();
        }
        else
        {
            $ins = $this->core->db->prepare(
            "
                INSERT INTO
                    sessions
                SET
                    id = :sess_id,
                    data = :sess_data,
                    last_access = UNIX_TIMESTAMP(),
                    fingerprint = :print,
                    ip = :ip,
                    page = :page
            ");
            
            $ins->bindParam(':sess_id', $sid, PDO::PARAM_STR);
            $ins->bindParam(':sess_data', $data, PDO::PARAM_STR);
            $ins->bindParam(':print', $this->fingerprint(), PDO::PARAM_STR);
            $ins->bindParam(':ip', $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR);
            $ins->bindParam(':page', request_uri(), PDO::PARAM_STR);
            
            $ins->execute();
        }
    }
    
    public function destroy($sid)
    {
        $query = $this->core->db->prepare(
        "
            DELETE FROM
                sessions
            WHERE
                id = :sess_id
            LIMIT
                1
        ");
        
        $query->bindParam(':sess_id', $sid, PDO::PARAM_STR);
        
        return $query->execute();
    }
    
    public function gc($lifetime)
    {
        $time = time() - $lifetime;
        
        $query = $this->core->db->prepare(
        "
            DELETE FROM
                sessions
            WHERE
                last_access < :time
            LIMIT
             1
        ");
        
        $query->bindParam(':time', $time, PDO::PARAM_INT);
        
        return $query->execute();
    }
}

[ Voor 4% gewijzigd door Saven op 31-03-2013 22:56 ]


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 02-07 15:18
Ah een eigen session handler. Ik heb daar nog nooit mee gewerkt, maar komt het misschien omdat de write() method geen return value heeft?

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 04-07 11:33

Saven

Administrator

Topicstarter
aaajeetee schreef op zondag 31 maart 2013 @ 23:04:
Ah een eigen session handler. Ik heb daar nog nooit mee gewerkt, maar komt het misschien omdat de write() method geen return value heeft?
Return value is niet verplicht bij die functie, werkt voor de rest ook zonder problemen. Bedacht me net dat session_start() sowieso moet aangeroepen zijn, anders zou ik niet buiten functies de sessie aan kunnen roepen. Ook als ik session_start() aanroep in mijn toevoegen() method krijg ik een php notice error dat de session al is gestart.

Ik heb ondertussen ook gecontroleerd of de sessie_id voor de ajax request misschien anders is, maar die is hetzelfde

Mocht het nog nodig zijn is hieronder ook mijn cart update functie
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    public function update($item=array())
    {
        //-----------------------------------------
        // Check if all required vars are set
        //-----------------------------------------
        if( isset($item['id']) && isset($item['name']) && isset($item['price']) && isset($item['qty']) )
        {
            //-----------------------------------------
            // Make a unique id
            //-----------------------------------------
            if( isset($item['options']) && count($item['options'] > 0) )
            {
                $rowid = sha1( $item['id'].implode('', $item['options']) );
            }
            else
            {
                $rowid = sha1($item['id']);
            }
            
            //-----------------------------------------
            // Check for quantity
            //-----------------------------------------
            $qty = round($item['qty']);
            
            if( $item['qty'] < 1 )
            {
                if( isset($this->cart[$rowid]) )
                    unset($this->cart[$rowid]);
                    
                if( isset($_SESSION['cart'][$rowid]) )
                    unset($_SESSION['cart'][$rowid]);
            }
            else
            {
                //-----------------------------------------
                // Check if the key already exists in our carts
                //-----------------------------------------
                foreach($item as $key => $val)
                {
                    $_SESSION['cart'][$rowid][$key] = $val;
                }
            }
            
            $this->cart = $this->core->session->get('cart');
            $this->parse(); //totaalproducten en prijs berekenen
            
            return true;
        }
        else
        {
            trigger_error("Update cart failed: id, name, price and qty have to be set", E_USER_WARNING);
            return false;
        }
    }

[ Voor 11% gewijzigd door Saven op 31-03-2013 23:50 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:49

MueR

Admin Tweakers Discord

is niet lief

Je cookie wordt niet meegestuurd bij een ajax request.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 19:34

Matis

Rubber Rocket

Waarschijnlijk staat withCredentials niet aan in je request.
JavaScript:
1
XMLHttpRequest.withCredentials = "true" 

Of doe je een crossdomain request?

[ Voor 13% gewijzigd door Matis op 01-04-2013 11:16 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 04-07 11:33

Saven

Administrator

Topicstarter
Ik lock mijn sessies aan de user-agent, maar blijkbaar gaat er iets niet goed met het verzenden van de user agent en ajax request. Voorlopig de user-agent lock erafgehaald en nu werkt t :) Zal later nog even dieper gaan graven. Thanks voor het meedenken iig!
Pagina: 1