Opslaan & Ophalen jQuery "named" array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dennis WhoCares

Dennis WhoCares

06/09/2019 08:22:02
Quote Anchor link
Goede morgen allemaal,

Ik heb problemen met het ophalen van een array in met jQuery.
Met jQuery 'POST' ik data zoals
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
currentCookies = [];

//for loop
var tCookie = {
function: tFunc,
name: tName,
val: tVal
};
currentCookies.push(tCookie);

//...

var tRow = lastRow + 1;
var tProfile = ['val1','val2','val3'];
var tCookies = currentCookies;

};

var postData = {
curRow: tRow,
profile: tProfile,
cookies: tCookies
}

Deze data wordt opgeslagen in m'n database mbv. json_encode()

Nou heb ik op mijn backend geen problemen, ook het genereren van formulieren en tabellen geen probleem.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
if(array_key_exists('cookies',$profile)) {
    if(is_array($profile['cookies']) && count($profile['cookies']) > 0) {

Het probleem zit m in het weer ophalen in jQuery.
Ik heb weer een POST actie met jQuery en het resultaat vanuit php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
PHP:
die(
    json_encode(
        array(
            'result' => true,
            'cookies' => $curProfile[$myKey]['cookies']
        )
    )
);

---
jQuery
---
console.log(tResult);

JSON:
result: true
cookies: {...}
0 : {
    function: 'analytic'
    name: '_ga'
    value: 'asdasdasd'
}
1 : {
    function: 'analytic'
    name: '_ga'
    value: 'asdasdasd'
}


Zo ver zo goed dus...

Nou is het probeel: $.isArray(tResult['cookies']) => false...
console.log(typeof(tResult['cookies'])); => Object
console.log(tResult['cookies'].length; => undefined


Wie kan mij hiermee helpen, het enige wat ik wil is dat 'currentCookies' deze cookies weer inlaad zoals ik ze voorheen opgebouwd heb in jQuery om weer te kunnen toevoegen of verwijderen vanuit jQuery en daarna sla ik t weer terug op.

Ik gebruik ook 'unnamed' array en dat werkt wel perfect.
Gewijzigd op 06/09/2019 08:25:01 door Dennis WhoCares
 
PHP hulp

PHP hulp

18/11/2019 04:25:55
 
Ivo P

Ivo P

06/09/2019 09:13:02
Quote Anchor link
beetje lang verhaal, maar uit je laatste 2 alinea's begrijp ik dat je de 2e parameter in json_decode() had moeten gebruiken:

https://www.php.net/manual/en/function.json-decode.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php json_decode($jsonstring, true); ?>
 
Dennis WhoCares

Dennis WhoCares

06/09/2019 10:13:49
Quote Anchor link
Hi Ivo,

ja ik weet het, maar weet niet goed hoe ik het anders moet uitleggen.
Het probleem zit m in de frontend, en ik gebruik json_encode() om de data in json te hebben zodat de jQuery m kan lezen. (heb ook de 2e param gebruikt bij de encode, maar helaas, precies hetzelfde)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//ajax POST request
complete: function (data) {
var tResult = JSON.parse(data.responseText);

console.log(tResult)
if("cookies" in tResult) {
    console.log('has cookies!');

console.log('Type of tResult: ' + typeof(tResult));

console.log(Type of cookies: ' + typeof(tResult['cookies']);

console.log(tResult['cookies']);

var tmpCookies = tResult['cookies'];
console.log('Amount : ' + tmpCookies.length);

if($.isArray(tResult['cookies'])) {
///
} else {
console.log('cookies seems not to be an array');
}


Console output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
JSON:
result: true
cookies: {...}
0 : {
    function: 'analytic'
    name: '_ga'
    value: 'asdasdasd'
}
1 : {
    function: 'analytic'
    name: '_ga'
    value: 'asdasdasd'
}

has cookies!

Type of tResult: Object

Type of cookies: object

Object { 0: {}, 1: {} }
//opengeklapt
0: Object { function: "analytic", name: "_ga", value: "asdasdasd" }
1: Object { function: "analytic", name: "_ga", value: "asdasdasd" }
<prototype>: Object { ... }

Amount : undefined

cookies seems not to be an array


Zoals ik zie: is het nu geen normale 'array'
De cookies heb ik opgebouwd als test:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
var tmpTest = [];
    tmpTest.push({ function: "cookie1", name: "asdasd", value: "asdasdasd" });
    tmpTest.push({ function: "cookie2", name: "qweqwe", value: "qweqweqwe" });
    console.log(tmpTest);
    if($.isArray(tmpTest)) { console.log('tmpTest is array! Amount: ' + tmpTest.length); }

Console output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
Array [ {...},{...} ]
tmpTest is array! Amount: 2


In de data die ik later ophaal zoals voorheen omschreven is het geen 'Array' maar 'Object' en heeft geen omsluitende [ ] maar { }
Gewijzigd op 06/09/2019 10:20:01 door Dennis WhoCares
 
Ivo P

Ivo P

06/09/2019 10:19:26
Quote Anchor link
Wat zit er in "data"

Wat is de output als je tussen regel 2 en 3 plaatst:

console.log(data);
 
Dennis WhoCares

Dennis WhoCares

06/09/2019 10:23:04
Quote Anchor link
Ivo P op 06/09/2019 10:19:26:
Wat zit er in "data"

Wat is de output als je tussen regel 2 en 3 plaatst:

console.log(data);

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
responseText: "{\"result\":\"true\",\"subject\":\"testingiCookies\",\"desc\":\"\",\"cookies\":{\"0\":{\"function\":\"analytic\",\"name\":\"_ga\",\"value\":\"asdasdasd\"},\"2\":{\"function\":\"analytic\",\"name\":\"_ga\",\"value\":\"asdasdasd\"}},\"gegevens\":\"[{\\\"value\\\":\\\"testingiCookies\\\",\\\"bijzonder\\\":0,\\\"uitzonderingen\\\":[]}]\"}"


Ik gebruik dit vrijwel overal, maar is de eerste keer dat ik echt 'named' index gebruik in een array, welke vervolgens als array opgeslagen is.
Aan de PHP kant gaat alles prima, zit nu alleen hiemee te klooien en ligt denk ik aan de omringende {} van cookies, dat die eigenlijk [] horen te zijn
Gewijzigd op 06/09/2019 10:25:54 door Dennis WhoCares
 
- Ariën -
Beheerder

- Ariën -

06/09/2019 10:24:56
Quote Anchor link
Dat is duidelijk een JSON-string. Daarom moet je dat in PHP uitlezen met:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$content
= json_decode($_POST['data'], true); // geen idee waar je data vandaan komt in je AJAX.
print_r($content);
?>
Gewijzigd op 06/09/2019 10:26:41 door - Ariën -
 
Dennis WhoCares

Dennis WhoCares

06/09/2019 10:29:56
Quote Anchor link
@Ivo, bedankt voor je debug hulp!
Ik zie in de responseText dat de 'array' van cookies de index niet klopt en lijkt nu alsof de 'hoofd' array, nu index heeft gekregen.
Waarschijnlijk door testen van het verwijderen van tussenliggende cookies en heeft het een indexnr gekregen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$cookies = array(
"1" => array (
        function: "functie hier",
        name: "name hier",
        value: "value hier"
    ),
"2" => array(
        function: "functie hier",
        name: "name hier",
        value: "value hier"
    )
)


Hoort natuurlijk te zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$cookies = array(
    array (
        function: "functie hier",
        name: "name hier",
        value: "value hier"
    ),
    array(
        function: "functie hier",
        name: "name hier",
        value: "value hier"
    )
)
 
- Ariën -
Beheerder

- Ariën -

06/09/2019 10:40:52
Quote Anchor link
Maar een array hoort een key te hebben, en dat is in jouw geval niet zo.
 
Ivo P

Ivo P

06/09/2019 10:43:19
Quote Anchor link
volgens mij heb je de openingspost ontdaan van het oorspronkelijke php-script.

Wat ik daar nog meen te missen: een header.

als je meegeeft

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php header('Content-Type: application/json'); ?>


Herkent je browser het beter als een json output.

Voordeel is dan ook dat je als je de betreffende url aanroept in je browser, je ook overzichtelijk json op je scherm krijgt (in elk geval bij mijn FireFox en Chrome)
 
Dennis WhoCares

Dennis WhoCares

06/09/2019 11:01:17
Quote Anchor link
Hi Ivo,

Ik heb niks weg gehaald uit de posts :)
Ik heb idd geen header aangegeven in m'n php. Zal dat eens ff overal toevoegen daar waar ik json response terug geef.

@Arien,
een array heeft inderdaad altijd een key/index, en je kan eventueel zelf een 'named' key/index maken inderdaad.
Als je m'n vorige bericht doorneem, zie je het verschil, en bij de 'named' key/index gaat het fout in jQuery, dan ziet jQuery het als een object en geen array.
Dan moet ik met een .each() loop werken, wat ik niet wil.

Die named index komt verwacht ik omdat ik simpelweg een unset() doe op de cookies array op index 1 en niet terug sorteerde.
Heb net klein foutje gemaakt in m'n php script en nou zit ik heel ff tegen 'resource limit' te hikken en kan ik eventjes niet verder :'-D

Gaat goed komen, heb met jullie hulp t probleem gevonden!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.