Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [json + php] Maximum call stack size exceeded
shpaque
post 20.12.2020, 10:06:49
Post #1





Grupa: Zarejestrowani
Postów: 638
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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


no i html
  1. <div class="row" id="provincesRow" style="display: <?php echo $displayProvincesRow; ?>;">
  2. <div class="col">
  3. <div class="form-group">
  4. <label class="label-form">Województwo</label>
  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. <select 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. <option class="form-control" hidden <?php echo $selected; ?>>Wybierz...</option>
  12. <?php foreach ($c['province'] as $p): ?>
  13. <?php if ($config['main']['owner']['province']['value'] === $p['@attributes']['id']) {$thisSelected = 'selected';} else {$thisSelected = '';} ?>
  14. <option class="form-control" value="<?php echo $p['@attributes']['id']; ?>" <?php echo $thisSelected; ?>><?php echo $p['@attributes']['name']; ?></option>
  15. <?php endforeach ?>
  16. </select>
  17. <?php endif ?>
  18. <?php if ($foundCountry == 1) {break;} ?>
  19. <?php endforeach ?>
  20. <?php if ($foundCountry == 0): ?>
  21. <input 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. </div>
  24. </div>


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


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





Grupa: Zarejestrowani
Postów: 5 932
Pomógł: 1018
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
shpaque
post 20.12.2020, 10:35:24
Post #3





Grupa: Zarejestrowani
Postów: 638
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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...
Go to the top of the page
+Quote Post
viking
post 20.12.2020, 10:50:31
Post #4





Grupa: Zarejestrowani
Postów: 5 932
Pomógł: 1018
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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

dataType: 'xml'


--------------------
Go to the top of the page
+Quote Post
shpaque
post 20.12.2020, 11:19:53
Post #5





Grupa: Zarejestrowani
Postów: 638
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


duzo mi to nei mowi
Go to the top of the page
+Quote Post
viking
post 20.12.2020, 11:26:18
Post #6





Grupa: Zarejestrowani
Postów: 5 932
Pomógł: 1018
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


A z google umiesz korzystać?
https://medium.com/dailyjs/how-to-read-xml-...ax-ecb54ffbd5bb


--------------------
Go to the top of the page
+Quote Post
shpaque
post 20.12.2020, 11:43:57
Post #7





Grupa: Zarejestrowani
Postów: 638
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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?

Ten post edytował shpaque 20.12.2020, 11:44:58
Go to the top of the page
+Quote Post
viking
post 20.12.2020, 11:52:40
Post #8





Grupa: Zarejestrowani
Postów: 5 932
Pomógł: 1018
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
shpaque
post 20.12.2020, 13:20:03
Post #9





Grupa: Zarejestrowani
Postów: 638
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


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

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


Ten post edytował shpaque 20.12.2020, 13:38:50
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.01.2021 - 03:41