login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[AJAX-PHP] Array versturen via POST

Offline finduilas - 07/03/2014 15:38
Avatar van finduilasPHP gevorderde Beste

Ik probeer een grote array te versturen via ajax naar een .php document.
  1. xhr = $.ajax({
  2. type: "POST",
  3. url: "/createPDF/pdf/",
  4. data: {data: route},
  5. context: document.body,
  6. success: function(data){
  7. console.log("GELUKT");
  8. }
  9. });


Route is een array met de indexen bounds,legs,... Ik wil in mijn PHP bestand deze array gebruiken. Maar dat lukt mij niet.

  1. if($_SERVER['REQUEST_METHOD'] == 'POST')
  2. {
  3. $data = json_decode($_POST['data']);
  4. var_dump($_POST['data']);
  5. }


Als ik data = route gebruik (in Ajax-call) dan krijg ik de error.

Als ik JSON.stringify doe kan ik $_POST['data'] wel lezen, maar als een string. Het lukt mij niet om hem terug als Array te krijgen. JSON_decode() geeft niets als resultaat.

Iemand een idee hoe of wat ik kan doen?

12 antwoorden

Gesponsorde links
Offline Martijn - 07/03/2014 15:52
Avatar van Martijn Crew PHP Misschien is jQuery's .serialize() iets voor je:
  1. var data = $('form').serialize();
  2. console.log( data );
Offline Thomas - 07/03/2014 16:27
Avatar van Thomas Moderator En als je in PHP een string hebt, kun je deze heel eenvouding omzetten naar een array met parse_str().

Let wel op:
- mogelijke character encodings, weet niet of dit goed gaat met exotische karakters
- magic_quotes_gpc, mogelijk moet je slashes strippen als dit aanstaat
- elementen die meerdere waarden kunnen selecteren, zoals bijvoorbeeld multiple selects, de namen van deze elementen moeten array-haken bevatten, anders blijft in je string enkel het laatst geselecteerde element over

  1. <?php
  2. // @see https://api.jquery.com/serialize/
  3. function dump($a) {
  4. echo '<pre>'.print_r($a, true).'</pre>';
  5. }
  6.  
  7. $in = 'single=Single2&multiple[]=Multiple&multiple[]=Multiple2&multiple[]=Multiple3&check=check1&check=check2&radio=radio2';
  8. // vergelijk met &multiple=... (zonder array haken)
  9. $out = array();
  10. parse_str($in, $out);
  11.  
  12. array_map('stripslashes', $out);
  13. }
  14.  
  15. dump($out);
  16. ?>
Offline finduilas - 10/03/2014 18:39
Avatar van finduilas PHP gevorderde Hmmz, Dat van Fangorn werkt het best..

Nu krijg ik dit in PHP:
  1. array(1) {
  2. ["{"bounds":{"ta":{"d":50_00656000000001,"b":50_4962},"fa":{"b":2_9717900000000004,"d":3_7723400000000002}},"copyrights":"Kaartgegevens_©2014_Google","legs":"]=>
  3. array(1) {
  4. ["{"distance":{"text":"95,9 km","value":95865},"duration":{"text":"1 uur 8 min.","value":4065},"end_address":"Rue du Centième Anniversaire 75, 7334 Saint-Ghislain, België","end_location":{"d":50.4962003,"e":3.75895330000003},"start_address":"D43, 80760 Moislains, Frankrijk","start_location":{"d":50.00671699999999,"e":2.9728079999999864},"steps":[{"distance":{"text":"2,2 km","value":2156},"duration":{"text":"3 min.","value":174},"end_location":{"d":50.0251883,"e":2.9775337999999465},"polyline":{"points":"_}epHascQm@Gw@KqAUuAUcAK{@Gg@Ca@A_@?_@DYFu@RYJ[NYNWP[Tm@h@{@p@SNMJm@d@UJUJKBSBQ?k@A[AUCIAKCA?KEKEMKOKMMKGOKSKMCOC"]=>
  5. string(367642) "\"font-size:0.9em\">Ga rechtdoor over één rotonde</div>","start_point":{"d":50.0065628,"e":3.01877479999996},"end_point":{"d":50.068929,"e":3.1653433000000177}},{"distance":{"text":"0,4 km","value":410},"duration":{"text":"1 min.","value":28},"end_location":{"d":50.068501,"e":3.170751600000017


Helaas is het dus gedaan bij de \.. (string(367642) "\"font-size:0.9em\"). Dan wordt het weer een string. Even geprobeerd om ze te strippen, maar het lukt me niet..
Offline Thomas - 10/03/2014 19:31
Avatar van Thomas Moderator Uhm, waar krijg je deze data vandaan? Ik zie daar Google staan? Is dit een service van Google? Zoja, dan werk je via een API, en in de API staat toch wel gespecificeerd wat voor data je (terug)krijgt, en hoe je hier mee om kunt/moet gaan?
Het ziet er uit als een mengelmoes van JSON en geserialiseerde data?
Offline finduilas - 10/03/2014 20:10
Avatar van finduilas PHP gevorderde Ik maak gebruik van de maps API van google. Daar krijg ik altijd JSON terug in javascript. Dit gaat perfect, en kan er mee werken om alles in javascript te behandelen.

Nu wil ik echter nog een .PDF aanmaken via PHP. Maar daarvoor heb ik die array/JSON nodig. En ik wil dus die array uit javascript doorgeven naar PHP via Ajax.

Vandaar dus..
Offline Thomas - 11/03/2014 13:54
Avatar van Thomas Moderator Welke API calls gebruik je, van wat voor type is het resultaat, mogelijk kun je via JavaScript / de API nog e.e.a. omschrijven voordat je dit aan PHP doorgeeft?

Zou je eens een dump vanuit JavaScript kunnen doen (dus voordat je dit aan PHP doorstuurt), of anders aan kunnen geven welke API calls je doet om de informatie op te halen die je vervolgens doorgeeft aan PHP?

Misschien helpt het ook als je bij je AJAX POST aangeeft wat voor contentType (wat je naar de server stuurt, dus niet dataType (wat je van de server terug verwacht)) het betreft. Dit zou dan afgestemd moeten worden op wat je terugkrijgt van je API, in combinatie met eigen bewerkingen die je nog uitvoert voordat je het POST.
Offline finduilas - 11/03/2014 18:06 (laatste wijziging 11/03/2014 18:12)
Avatar van finduilas PHP gevorderde Ik communiceer in JSON met de Google Maps API DirectionService en krijg response terug. Dit wordt dan omgezet naar een javascript object..

Nu is die response zeer uitgebreidt. Normaal is het voldoende dat ik met de GET werk, maar nu moet ik dus met POST werken..

Ik stuur het javascript-object nu door in JSON via POST, JSON.stringify.. Maar in PHP wil ik die JSON string omzetten opnieuw naar een Array in PHP.. Het probleem bij de oplossing die ik kreeg van jou, FangorN, is dat ik er niet in slaag om die \ te escapen. Daar stopt het dus steeds en wordt de rest aanzien als string. Als dit zou lukken is mijn probleem opgelost.

Maar ik merk net, door nog even te zoeken in die API dat ik waarschjnlijk de info die ik nodig heb op een andere manier kan uithalen.

Ik wil namelijk de info van dit infopanel:
https://develop...anel?hl=nl in een PDF schrijven (met nog extra informatie uiteraard). Misschien is het gemakkelijker om daar alles uit te halen met JQUERY en enkel dit door te sturen naar PHP en op die manier een PDF maken..

EDIT: Ik zal een dump van javascript helaas pas morgen hier kunnen plaatsen..

EDIT 2: Of ik overloop ze eigenlijk gewoon in JS.. Het zal dan al veel overzichtelijker binnenkomen in PHP en veel data sparen..
  1. function showSteps(directionResult) {
  2. // For each step, place a marker, and add the text to the marker's
  3. // info window. Also attach the marker to an array so we
  4. // can keep track of it and remove it when calculating new
  5. // routes.
  6. var myRoute = directionResult.routes[0].legs[0];
  7.  
  8. for (var i = 0; i < myRoute.steps.length; i++) {
  9. var marker = new google.maps.Marker({
  10. position: myRoute.steps[i].start_location,
  11. map: map
  12. });
  13. attachInstructionText(marker, myRoute.steps[i].instructions);
  14. markerArray[i] = marker;
  15. }
  16. }
Offline Thomas - 12/03/2014 13:12 (laatste wijziging 12/03/2014 13:12)
Avatar van Thomas Moderator In je oorspronkelijke post zit ook geen HTML-openingstag (ik zie geen <div... ?), hoe dump jij data in PHP, ik neem aan dat je je output escaped? Anders wordt het nogal lastig om chocola te maken van hetgeen je retour krijgt.
Offline finduilas - 12/03/2014 18:47 (laatste wijziging 12/03/2014 18:56)
Avatar van finduilas PHP gevorderde Even duidelijk maken dus:

- Ik heb nog niets in PHP van layout, omdat ik nog gewoon mijn data niet heb. Ik wil eerst mijn array voor ik verdere bewerkingen doe.

Mijn probleem is dus om een deftige Array te krijgen in PHP..

Dit heb ik in Javascript: http://imageshack.com/a/img844/8008/rw8n.png

Hiervan heb ik de legs nodig. Maar in bepaalde waarden die ik dus krijg van Google Maps zitten html tags, geescapede slashes,... Hierdoor krijg ik ze dus niet in een array.

Ik stuur dus dat object door naar PHP. Dit krijg ik binnen:
http://www.heypasteit.com/clip/17Y7
Dit is dus 1 lange string.. Dit moet ik terug omzetten naar een array in PHP..

EDIT:

  1. for (var i = 0; i < myRoute.legs.length; i++) {
  2. console.log("LEG: " + i);
  3.  
  4. for (var j = 0; j < myRoute.legs[i].steps.length; j++) {
  5.  
  6. console.log(myRoute.legs[i].steps[j].instructions);
  7. }
  8.  
  9. }


  1. LEG: 0
  2. 6 (regel 215)
  3. Vertrek in <b>noordelijke</b> richting op de <b>D43</b> naar <b>Rue d'en Bas</b>
  4. 6 (regel 219)
  5. Sla <b>rechtsaf</b> naar de <b>D72</b>
  6. 6 (regel 219)
  7. Sla <b>linksaf</b> naar de <b>D917</b><div style="font-size:0.9em">Ga rechtdoor over één rotonde</div>
  8. 6 (regel 219)
  9. Flauwe bocht naar <b>rechts</b> richting <b>Chemin de Bonavis</b><div style="font-size:0.9em">Tolweg</div>
  10. 6 (regel 219)
  11. Ga rechtdoor op <b>Chemin de Bonavis</b><div style="font-size:0.9em">Tolweg</div>
  12. 6 (regel 219)
  13. Houd <b>links</b> aan bij de splitsing, volg de borden voor <b>A26/E17/Saint-Quentin/Reims</b> en voeg in op <b>A26/E17</b><div style="font-size:0.9em">Tolweg</div>
  14. 6 (regel 219)
  15. Neem de afslag op <b>A2/E19</b> richting <b>Cambrai/Valenciennes/Bruxelles</b><div style="font-size:0.9em">Gedeeltelijke tolweg</div><div style="font-size:0.9em">U gaat België binnen</div>
  16. 6 (regel 219)
  17. Weg vervolgen naar <b>E19</b>
  18. 6 (regel 219)
  19. Neem afslag <b>25-Tertre</b> richting <b>Hornu</b>
  20. 6 (regel 219)
  21. Voeg in op <b>N547</b>
  22. 6 (regel 219)
  23. Weg vervolgen naar <b>Rue de la Fontaine</b>
  24. 6 (regel 219)
  25. Sla <b>linksaf</b> naar de <b>Rue de Valenciennes/N51</b><div style="font-size:0.9em">Ga verder op de N51</div>
  26. 6 (regel 219)
  27. Sla <b>rechtsaf</b> naar de <b>Rue Sainte-Louise</b>
  28. 6 (regel 219)
  29. Sla <b>linksaf</b> om op de <b>Rue Sainte-Louise</b> te blijven<div style="font-size:0.9em">U vindt uw bestemming links</div>
  30. 6 (regel 219)
  31. LEG: 1
  32. 6 (regel 215)
  33. Vertrek in <b>westelijke</b> richting op de <b>Rue Sainte-Louise</b>
  34. 6 (regel 219)
  35. Neem de 1e afslag <b>rechts</b> om op <b>Rue Sainte-Louise</b> te blijven
  36. 6 (regel 219)
  37. Sla <b>linksaf</b> naar de <b>Rue de Mons/N51</b>
  38. 6 (regel 219)
  39. Sla <b>rechtsaf</b> naar de <b>Rue Traversière/N547</b><div style="font-size:0.9em">Ga verder op de N547</div>
  40. 6 (regel 219)
  41. Voeg in op de <b>E19/E42</b> via de oprit richting <b>Bruxelles/Mons</b>
  42. 6 (regel 219)
  43. Houd <b>rechts</b> aan, rij door op <b>E42</b> en volg de borden <b>Liège/La Louvière/Charleroi Aéroport</b>
  44. 6 (regel 219)
  45. Neem afslag <b>19-Manage</b> richting <b>N27</b>
  46. 6 (regel 219)
  47. Houd <b>links</b> aan bij de splitsing en volg de borden voor <b>Manage/Nivelles</b>
  48. 6 (regel 219)
  49. Sla <b>linksaf</b> naar de <b>Chaussée de Mons/N27</b><div style="font-size:0.9em">Ga verder op de N27</div><div style="font-size:0.9em">Ga rechtdoor over één rotonde</div>
  50. 6 (regel 219)
  51. Sla <b>rechtsaf</b> naar de <b>Rue Lintermans</b>
  52. 6 (regel 219)
  53. Weg vervolgen naar <b>Rue de l'Yser</b>
  54. 6 (regel 219)
  55. Weg vervolgen naar <b>Rue de Courcelles</b>
  56. 6 (regel 219)
  57. Sla <b>rechtsaf</b> om op de <b>Rue de Courcelles</b> te blijven
  58. 6 (regel 219)
  59. Houd <b>rechts</b> aan en blijf op <b>Rue de Courcelles</b>
  60. 6 (regel 219)
  61. Weg vervolgen naar <b>Rue de la Bête Refaite</b>
  62. 6 (regel 219)
  63. LEG: 2
  64. 6 (regel 215)
  65. Vertrek in <b>noordelijke</b> richting op de <b>Rue de la Bête Refaite</b> naar <b>Rue du Rossignol</b>
  66. 6 (regel 219)
  67. Neem de 2e afslag <b>rechts</b>, <b>Rue de Courcelles</b> op
  68. 6 (regel 219)
  69. Weg vervolgen naar <b>Rue des Culots</b><div style="font-size:0.9em">Ga rechtdoor over één rotonde</div>
  70. 6 (regel 219)
  71. Weg vervolgen naar <b>Rue du Castia</b>
  72. 6 (regel 219)
  73. Weg vervolgen naar <b>Rue des Culots</b>
  74. 6 (regel 219)
  75. Weg vervolgen naar <b>Rue Ferrer</b>
  76. 6 (regel 219)
  77. Sla <b>rechtsaf</b> naar de <b>Rue Picteur</b>
  78. 6 (regel 219)
  79. Neem op de rotonde de <b>3e</b> afslag de oprit naar <b>E42</b> op richting <b>Tournai/Mons</b>
  80. 6 (regel 219)
  81. Voeg in op <b>E42</b>
  82. 6 (regel 219)
  83. Voeg in op <b>E19/E42</b>
  84. 6 (regel 219)
  85. Houd <b>rechts</b> aan, rij door op <b>E42</b> en volg de borden <b>Lille/Tournai</b>
  86. 6 (regel 219)
  87. Houd <b>rechts</b> aan bij het knooppunt <b>Marquain</b> en volg de borden <b>E403/A17</b> richting <b>Gand/Bruges/Mouscron/Roubaix</b>
  88. 6 (regel 219)
  89. Houd <b>rechts</b> aan bij de splitsing, volg de borden voor <b>E403</b> en voeg in op <b>A17/E403</b>
  90. 6 (regel 219)
  91. Neem afslag <b>9-Lichtervelde</b> naar <b>N35</b> richting <b>Diksmuide/Koolskamp</b>
  92. 6 (regel 219)
  93. Sla <b>linksaf</b> naar de <b>Koolskampstraat/N35</b><div style="font-size:0.9em">Ga verder op de N35</div><div style="font-size:0.9em">Ga rechtdoor over één rotonde</div>
  94. 6 (regel 219)
  95. Sla <b>rechtsaf</b> naar de <b>Lichterveldestraat</b>
  96. 6 (regel 219)
  97. Neem op de rotonde de <b>1ste</b> afslag naar <b>Torhoutstraat</b>
  98. 6 (regel 219)
  99. Sla <b>linksaf</b> naar de <b>Processiestraat</b>
  100. 6 (regel 219)
  101. Weg vervolgen naar <b>Ichtegemstraat</b>
  102. 6 (regel 219)
  103. Sla <b>linksaf</b> naar de <b>Koekelarestraat</b>
  104. 6 (regel 219)
  105. LEG: 3
  106. 6 (regel 215)
  107. Vertrek in <b>zuidoostelijke</b> richting op de <b>Koekelarestraat</b> naar <b>Pastoor d. Vanhautestraat</b>
  108. 6 (regel 219)
  109. Sla <b>rechtsaf</b> naar de <b>Ichtegemstraat</b>
  110. 6 (regel 219)
  111. Weg vervolgen naar <b>Processiestraat</b>
  112. 6 (regel 219)
  113. Sla <b>rechtsaf</b> naar de <b>Torhoutstraat</b>
  114. 6 (regel 219)
  115. Neem op de rotonde de <b>2e</b> afslag naar <b>Lichterveldestraat</b>
  116. 6 (regel 219)
  117. Sla <b>linksaf</b> naar de <b>Staatsbaan/N35</b><div style="font-size:0.9em">Ga verder op de N35</div><div style="font-size:0.9em">Ga rechtdoor over één rotonde</div>
  118. 6 (regel 219)
  119. Sla <b>rechtsaf</b> de oprit op naar <b>Doornik/Kortrijk/Roeselare/Brussel</b>
  120. 6 (regel 219)
  121. Voeg in op <b>E403</b>
  122. 6 (regel 219)
  123. Houd <b>rechts</b> aan bij het knooppunt <b>Aalbeke</b> en volg de borden <b>E17</b> richting <b>Rijsel/Moeskroen/Lille</b><div style="font-size:0.9em">U gaat Frankrijk binnen</div>
  124. 6 (regel 219)
  125. Weg vervolgen naar <b>A22/E17</b>
  126. 6 (regel 219)
  127. Neem afslag <b>11</b> <b>links</b> richting <b>E17/Lille</b>
  128. 6 (regel 219)
  129. Voeg in op <b>N356</b>
  130. 6 (regel 219)
  131. Neem de afslag op <b>A1/E42</b> richting <b>Paris/Bruxelles/Valenciennes/Villeneuve d'Ascq/Aéroport Lesquin</b>
  132. 6 (regel 219)
  133. Houd <b>links</b> aan, rij door op <b>A1</b> en volg de borden <b>E17/Paris/Reims/Aéroport Lille Lesquin</b><div style="font-size:0.9em">Gedeeltelijke tolweg</div>
  134. 6 (regel 219)
  135. Neem afslag <b>14</b> richting <b>Bapaume/Albert</b><div style="font-size:0.9em">Tolweg</div>
  136. 6 (regel 219)
  137. Neem op de rotonde de <b>5e</b> afslag naar <b>D917</b>
  138. 6 (regel 219)
  139. Sla <b>linksaf</b> naar de <b>Av. Abel Guidet/D917</b><div style="font-size:0.9em">Ga verder op de D917</div>
  140. 6 (regel 219)
  141. Sla <b>linksaf</b> naar de <b>D19</b>
  142. 6 (regel 219)
  143. Sla <b>rechtsaf</b> om op de <b>D19</b> te blijven
  144. 6 (regel 219)
  145. Flauwe bocht naar <b>rechts</b> naar de <b>D20</b>
  146. 6 (regel 219)
  147. Weg vervolgen naar <b>D72</b>
  148. 6 (regel 219)
  149. Sla <b>rechtsaf</b> om op de <b>D72</b> te blijven
  150. 6 (regel 219)
  151. Sla <b>rechtsaf</b> naar de <b>D43</b>
  152. 6 (regel 219)


Dit wil ik dus hebben, maar het lukt me niet in PHP, omdat ik het niet correct kan doorsturen veronderstel ik.
Offline Thomas - 12/03/2014 19:27 (laatste wijziging 12/03/2014 19:28)
Avatar van Thomas Moderator Mogelijk bevat dit topic de oplossing. Je moet zowel je JSON data stringify-en en ook het contentType aangeven. Default is dit "application/x-www-form-urlencoded; charset=UTF-8" en die combinatie zorgt waarschijnlijk voor de problemen die jij beschrijft.

Een aantal reacties eerder had ik al het contentType aangehaald. Maar eerst maar even kijken of dit iets oplevert .
Offline finduilas - 12/03/2014 20:04
Avatar van finduilas PHP gevorderde Uhu, het lijkt te lukken.. Ik doe het nu op een eigen manier..

Hetgeen ik krijg van de API is veel te groot en bevat rare tekens, ...

Ik overloop het JS-object en maak er zelf een deftige array van, met enkel de gegevens die ik nodig heb. Als ik dit doorstuur kan ik zonder stringify enz werken en gewoon overlopen met een for-lus in PHP.

Met rotzooi terugkrijgen bedoel ik bijvoorbeeld het volgende:
  1. Sla <b>linksaf</b> naar de <b>Av. Abel Guidet/D917</b><div style="font-size:0.9em">Ga verder op de D917</div>


Er staat bijvoorbeeld geen punt in. Als ik de html er uit trim klopt de zin niet meer, net zoals (tolweg).

Maar ik kan verder.. Heel erg bedankt! Hopelijk krijg ik het vlug wat deftig.
Offline Thomas - 12/03/2014 21:28
Avatar van Thomas Moderator Bevat rare tekens? De character encoding die wordt gebruikt is UTF-8, zorg dat je die ook consequent toepast.

Volgens mij is het hele euvel de ontbrekende contenttype (naast die stringify, dus) ;).
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.503s