Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ AJAX _ [json + php] Maximum call stack size exceeded

Napisany przez: shpaque 20.12.2020, 10:06:49

Witam serdecznie, mam taki problem jak w tytule, nie wiem gdzie leży błąd, ogólne założenie na razie takie:
robie php, jsonem wracają dane, jeśli są pełne to włączam pole... ale wywala blad po dluzszym mieleniu:

skrypt:

  1. function getValue(id) {
  2. $.ajax({
  3. type: 'GET',
  4. url: './php/changeCountry.php',
  5. dataType: 'json',
  6. data: {'action': 'changeCountry', 'country': id}
  7. }).done(function(json) {
  8. var found = json.found;
  9. var provinces = json.provinces;
  10.  
  11. if (found == 0) {$('#provincesRow').css('display', 'none');}
  12. else {
  13. $('#provincesRow').css('display', 'flex');
  14. }
  15. console.log(found);
  16. });
  17. }


plik php
  1. http://www.php.net/error_reporting(E_ALL);
  2. http://www.php.net/ini_set('display_errors', 1);
  3.  
  4. // Funkcja konwertująca plik xml do tablicy (co ważne, z atrybutami)
  5. function xmlToArray(SimpleXMLElement $xml) {
  6. $parser = function (SimpleXMLElement $xml, http://www.php.net/array $collection = []) use (&$parser) {
  7. $nodes = $xml -> children();
  8. $attributes = $xml -> attributes();
  9. if (0 !== http://www.php.net/count($attributes)) {
  10. foreach ($attributes as $attrName => $attrValue) {
  11. $collection['@attributes'][$attrName] = http://www.php.net/strval($attrValue);
  12. }
  13. }
  14. if (0 === $nodes -> http://www.php.net/count()) {
  15. if ($xml -> attributes()) {$collection['value'] = http://www.php.net/strval($xml);}
  16. else {$collection = http://www.php.net/strval($xml);}
  17. return $collection;
  18. }
  19. foreach ($nodes as $nodeName => $nodeValue) {
  20. if (http://www.php.net/count($nodeValue -> xpath('../' . $nodeName)) < 2) {
  21. $collection[$nodeName] = $parser($nodeValue);
  22. continue;
  23. }
  24. $collection[$nodeName][] = $parser($nodeValue);
  25. }
  26. return $collection;
  27. };
  28. return [$xml -> getName() => $parser($xml)];
  29. }
  30.  
  31. http://www.php.net/header("Content-Type: application/json;charset=utf-8");
  32.  
  33. $countryId = http://www.php.net/isset($_GET['country']) ? $_GET['country'] : '';
  34. $pathToProvincesDataBase = './../db/provinces.xml';
  35. $loadProvincesDataBase = simplexml_load_file($pathToProvincesDataBase);
  36. $provinces = xmlToArray($loadProvincesDataBase);
  37. $provinces = $provinces['provinces'];
  38. $fId = $fName = '';
  39. $fProvinces = http://www.php.net/array();
  40. $found = 0;
  41.  
  42. if ($_GET['action'] === 'changeCountry' && $countryId !== '') {
  43. foreach ($provinces['country'] as $p) {
  44. if ($p['@attributes']['id'] === $countryId) {
  45. $found = 1;
  46. $fId = $p['@attributes']['id'];
  47. $fName = $p['@attributes']['name'];
  48. foreach ($p['province'] as $attr) {
  49. $fProvinces[] = ['id' => $attr['@attributes']['id'], 'name' => $attr['@attributes']['name']];
  50. }
  51. break;
  52. }
  53. }
  54. $done = ['found' => $found, 'id' => $fId, 'name' => $fName, 'provinces' => $fProvinces];
  55. http://www.php.net/echo json_encode($done);
  56. }


no i html
  1. <http://december.com/html/4/element/div.html class="row" id="provincesRow" style="display: <?php echo $displayProvincesRow; ?>;">
  2. <http://december.com/html/4/element/div.html class="col">
  3. <http://december.com/html/4/element/div.html class="form-group">
  4. <http://december.com/html/4/element/label.html class="label-form">Województwo</http://december.com/html/4/element/label.html>
  5. <?php $foundCountry = 0; ?>
  6. <?php foreach ($provinces['country'] as $c): ?>
  7. <?php if ($config['main']['owner']['country']['value'] === $c['@attributes']['id'] || strtoupper(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)) === $c['@attributes']['id']): ?>
  8. <?php $foundCountry = 1; ?>
  9. <http://december.com/html/4/element/select.html class="form-control text-center" name="config[main][owner][province]" id="config[main][owner][province]">
  10. <?php if (!empty($config['main']['owner']['province']['value'])) {$selected = 'selected';} else {$selected = '';} ?>
  11. <http://december.com/html/4/element/option.html class="form-control" hidden <?php echo $selected; ?>>Wybierz...</http://december.com/html/4/element/option.html>
  12. <?php foreach ($c['province'] as $p): ?>
  13. <?php if ($config['main']['owner']['province']['value'] === $p['@attributes']['id']) {$thisSelected = 'selected';} else {$thisSelected = '';} ?>
  14. <http://december.com/html/4/element/option.html class="form-control" value="<?php echo $p['@attributes']['id']; ?>" <?php echo $thisSelected; ?>><?php echo $p['@attributes']['name']; ?></http://december.com/html/4/element/option.html>
  15. <?php endforeach ?>
  16. </http://december.com/html/4/element/select.html>
  17. <?php endif ?>
  18. <?php if ($foundCountry == 1) {break;} ?>
  19. <?php endforeach ?>
  20. <?php if ($foundCountry == 0): ?>
  21. <http://december.com/html/4/element/input.html class="form-control text-center" type="text" id="config[main][owner][province]" name="config[main][owner][province]" value="<?php echo $config['main']['owner']['province']['value']; ?>"/>
  22. <?php endif ?>
  23. </http://december.com/html/4/element/div.html>
  24. </http://december.com/html/4/element/div.html>


@EDIT

Właściwie niepotrzebnie zafiksowałem się na php i json skoro wszystko można zapiąc w jednym skrypcie bo przecież wystarczy tablicę przerobić na json i w skrypcie walidować... Tylko czy mi ktoś może pomóc w tym, wtedy chodziłoby o coś takiego:

  1. <http://december.com/html/4/element/script.html>
  2. function getValue(countryCode) {
  3. var provinces = [<?php json_encode($provinces['country']); ?>];
  4. var getCountry = countryCode;
  5. var found = 0;
  6.  
  7. teraz trzeba zrobic petle i zobaczyc czy znajdzie id = getCountry - wtedy found = 1 i robimy tablice jsona tylko z wybranym id
  8.  
  9.  
  10. if (found == 0) {$('#provincesRow').css('display', 'none');}
  11. else {
  12. $('#provincesRow').css('display', 'flex');
  13. $('#config[main][owner][province] option').each(function() {
  14. $(this).addClass('form-control').val(provinces['id']);
  15. });
  16. }
  17. console.log(found);
  18. });
  19. }
  20. </http://december.com/html/4/element/script.html>


tablica wyglada tak:
  1. http://www.php.net/array
  2. (
  3. [0] => http://www.php.net/array
  4. (
  5. [@attributes] => http://www.php.net/array
  6. (
  7. [id] => DE
  8. [name] => Deutschland
  9. )
  10.  
  11. [province] => http://www.php.net/array
  12. (
  13. [0] => http://www.php.net/array
  14. (
  15. [@attributes] => http://www.php.net/array
  16. (
  17. [id] => BW
  18. [name] => Baden-Württemberg
  19. )
  20.  
  21. [value] =>
  22. )
  23.  
  24. [1] => http://www.php.net/array
  25. (
  26. [@attributes] => http://www.php.net/array
  27. (
  28. [id] => BY
  29. [name] => Bayern
  30. )
  31.  
  32. [value] =>
  33. )
  34.  
  35. ...
  36.  
  37. [15] => http://www.php.net/array
  38. (
  39. [@attributes] => http://www.php.net/array
  40. (
  41. [id] => TH
  42. [name] => Thüringen
  43. )
  44.  
  45. [value] =>
  46. )
  47.  
  48. )
  49.  
  50. )
  51.  
  52. [1] => http://www.php.net/array
  53. (
  54. [@attributes] => http://www.php.net/array
  55. (
  56. [id] => PL
  57. [name] => Polska
  58. )
  59.  
  60. [province] => http://www.php.net/array
  61. (
  62. [0] => http://www.php.net/array
  63. (
  64. [@attributes] => http://www.php.net/array
  65. (
  66. [id] => D
  67. [name] => dolnośląskie
  68. )
  69.  
  70. [value] =>
  71. )
  72.  
  73. ...
  74.  
  75. [15] => http://www.php.net/array
  76. (
  77. [@attributes] => http://www.php.net/array
  78. (
  79. [id] => Z
  80. [name] => zachodniopomorskie
  81. )
  82.  
  83. [value] =>
  84. )
  85.  
  86. )
  87.  
  88. )
  89.  
  90. )

Napisany przez: viking 20.12.2020, 10:26:40

A po co to w ogóle przerabiasz na json skoro w ajax możesz też xmla zwracać do którego potem dobierać się w jquery jak do wszystkich elementów dom.

Napisany przez: shpaque 20.12.2020, 10:35:24

przyblizysz mi to jakos? nawet nei wiedzialem szczerze mowiac, to dlatego ze w js najmniej sie bawie, stad takie problemy smile.gif

generalnie chce zrobic tak, zeby sprawdzic czy wybrany select(id kraju) istnieje w pliku xml z wojewodztwami i pokazal je jesli tak, a jesli nie - wygasil w ogole rowa z tym polem...

Napisany przez: viking 20.12.2020, 10:50:31

https://api.jquery.com/jquery.ajax/

dataType: 'xml'

Napisany przez: shpaque 20.12.2020, 11:19:53

duzo mi to nei mowi

Napisany przez: viking 20.12.2020, 11:26:18

A z google umiesz korzystać?
https://medium.com/dailyjs/how-to-read-xml-in-javascript-using-jquery-ajax-ecb54ffbd5bb

Napisany przez: shpaque 20.12.2020, 11:43:57

ok dzieki, tylko wlasciwie skoro mam i tak wszystkie dane w tablicy php to po co jeszcze raz parsowac xmla w js zamiasr skorzystac z istniejacej tablicy? podejrzewam, żeby to zadzialalo prz yzmianie - trzeba parsowac od nowa xml'a przy kazdej zmianie i sprawdzac warunki, miast zrobic to na gotowej tablicy..? cyz sie myle?

Napisany przez: viking 20.12.2020, 11:52:40

Ale po co w ogóle parsować w php. Zwróć ten xml tajemniczy bezpośrednio, jego obrób w przeglądarce. A do walidacji ewentualnej zrób cache.

Napisany przez: shpaque 20.12.2020, 13:20:03

i dziękuję i tylko o to mi chodzilo co ponizej:

  1. <http://december.com/html/4/element/script.html>
  2. $('#postCountry').change(function() {
  3. var provinces = <?php echo json_encode($provinces); ?>;
  4. var countries = provinces.country;
  5. var found = 0;
  6.  
  7. for (var c in countries) {
  8. var countryId = countries[c]['@attributes']['id'];
  9. if ($(this).val() === countryId) {
  10. found = 1;
  11. var foundCountry = countries[c]['province'];
  12. }
  13. }
  14.  
  15. $('#postProvince').attr('value', '').empty();
  16.  
  17. if (found == 0) {$('#provincesRow').hide();}
  18. else {
  19. $('#provincesRow').show();
  20. $('#postProvince').append('<http://december.com/html/4/element/option.html class="form-control" hidden selected>Wybierz...</http://december.com/html/4/element/option.html>');
  21. for (var p in foundCountry) {
  22. $('#postProvince').append('<http://december.com/html/4/element/option.html class="form-control" value="' + foundCountry[p]['@attributes']['id'] + '">' + foundCountry[p]['@attributes']['name'] + '</http://december.com/html/4/element/option.html>');
  23. }
  24. }
  25. });
  26. </http://december.com/html/4/element/script.html>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)