Przesyłanie JSON'a do kolejnego pliku

0

Cześć,
mam prosty formularz modal żeby pobrać dane

<div class='bg-modal' id='bg-modal'>
   <div class='modal-content'>
      <div class='close'>+</div>
      <br>
      <h3>Podaj adres email</h3>
      <br>
      <form name="myFormRes" action="checkReserv.php" method="post">
         <input type="email" placeholder="e-mail" name="emailModal" id="emailModal" required>
         <input type='submit' class='confirm' id='confirm' value='Dalej'>
      </form>
   </div>
</div>

<script>
   document.getElementById('reservButton').addEventListener('click', function()
   {
      document.querySelector('.bg-modal').style.display = "flex";
      document.querySelector('.close').addEventListener('click', function()
      {
         setTimeout(function() 
         {
            document.querySelector('.bg-modal').style.display = "none";
         }, 600);
      });      
      document.querySelector('.confirm').addEventListener('click', function()
      {
         $('myFormRes').submit();
      });
      return false;
   });
</script>

w pliku checkReserv.php tworzę JSON w oparciu o zapytanie do bazy, w którym wykorzystuję zmienną przekazaną przez formularz

$query = "SELECT * FROM rezerwacje WHERE userEmail = '$_POST[emailModal]'";
        $stmt = $dbo->query($query);

        foreach($stmt as $row)
        {
            $dane[] = $row;
        }
        $dbo = null;
        $dbo2 = null; 
        echo json_encode($dane);

i teraz moje pytanie. Jak przesłać tak powstałego JSON'a dalej, do następnej strony? Próbowałem coś takiego

header("Location: index.php?act=firma&action=userReserv&json=".urlencode(json_encode($dane)));

ale nie dostaję żadnego wyniku, a po sprawdzeniu JSON.parse(this.responseText) dostaję w konsoli całą stronę (tagi html, skrypt JS itp) zamiast JSON'a. Jak zrobić tak, żeby po utworzeniu JSON'a przejść do następnej strony i go tam otrzymać?

0

Nie dostajesz wyniku bo dane przesyłasz GET'em a czytasz tablicę post. Możesz:

  1. Nie wysyłać danych do checkReserv.php tylko do strony gdzie rzeczywiście mają się wyświetlać
  2. Zamiast czytać POST'a sparsować sobie GET'a.
  3. Wygenerować json'a, zapisać go, po zakończeniu requestu z poziomu js wymusić przekierowanie i a następnie odczytać i zwrócić plik
  4. To samo co wyżej tylko zamiast zapisać po stronie serwera to zwrócić go i zapisać w np localStorage a po przekierowniu odczytać.

3 i 4 są średnie, raczej staraj się zawsze operować na danych tam gdzie chcesz je zwrócić. Czyli checkReserv.php powinien zwrócić widok. No chyba że generowanie trwa długo i chcesz tylko powiedzieć userowi że zacząłeś przetwarzać jego żądanie, ale to raczej nie ten przypadek.

1

Co chcesz uzyskać? Może rozwiązaniem jest Ajax?
W skrypcie masz odwołanie do elementu o id
reservButton którego w przedstawionym kodzie nie widać.
Najpierw sprawdź sobie czy dane faktycznie przechodzą POSTem robiąc var_dump i die. Potem zobacz co zwraca Ci zapytanie SQL.

0

NickOver - robiłem tak jak w 1. ale to kompletnie nie działa, muszę wysłać POST[emailModal] żeby pobrać dane z bazy, bez tego ani rusz.
2. Co masz na myśli? :)
3. i 4. Chyba właśnie wydają się być najbardziej rozsądne, tak mi się wydaje, tylko jak to zrobić?

Jurek - mam plik checkReserv.php który generuje mi JSON'a na podstawie danych z formularza. Problem polega na tym, że chcę po wygenerowaniu przejść do następnej strony, tam go dostać i wyświetlić w tabelce. Albo właśnie zwrócić widok i przekazać go do wyświetlenia.
reservButton to przycisk na stronie który powoduje pokazanie się okna modalnego z formularzem, nie zamieściłem go bo samo wywołanie formularza nie jest tutaj istotne i ładnie działa :P
jeśli zatrzymam się na echo json_encode($dane); to dane są ładnie wyświetlone, 4 wiersze, zgodnie z oczekiwaniem danych testowych, wszystko się zgadza. Natomiast chcę to podać dalej, do widoku. W widoku mam Ajax który czyta JSON'a ale nic nie zwraca, bo po konsoli de facto nie dostaję JSON'a

skrypt Ajax + widok

<?php
echo "<div style='text-align: center; margin-top: 40px;'><h3>Twoje rezerwacje</h3></div>";
echo "<div><button onClick='ValuePlus(fv);' class='butR' id='butR'>>></button></div>";
echo "<div><button onClick='ValueMinus(fv);' class='butL' id='butL'><<</button></div>";
echo "<div class='fvTable'><table width = '55%' border='1' cellpadding = '2' cellspacing = '2' style ='margin: auto; text-align:center;'>";
echo "<tr><th>Rodzaj usługi</th><th>Data rezerwacji</th><th>Godzina rezerwacji</th></tr>";	 
echo "<tbody id='dane'> </tbody></table></div>";
?>

<script>
    var ajax = new XMLHttpRequest();
    var method = "GET";
    var url = "checkReserv.php";
    var asynchronous = true;
    var fv = {od: 0, do: 20};

    GetJason(ajax, method, url, asynchronous, fv);

    function GetJason(ajax, method, url, asynchronous, fv)
    {
        
        ajax.open(method, url, asynchronous);
        ajax.send();
        ajax.onreadystatechange = function()
        {
            if(this.readyState == 4 && this.status == 200)
            {
                console.log(this.responseText);            
                var dane = JSON.parse(this.responseText);
                console.log(dane);
                var html = "";                
                if(fv.od < 1)
                {
                    fv.od = 0;
                    fv.do = 20;
                    document.getElementById('butL').style.display = "none";
                }
                if(fv.od > 0)
                {
                    document.getElementById('butL').style.display = "block";
                }
                else
                {
                    document.getElementById('butL').style.display = "none";
                }
                if(fv.do > dane.length)
                {
                    document.getElementById('butR').style.display = "none";
                    fv.od = dane.length - 20;
                    fv.do = dane.length - 1;
                    if(dane.length < 20)
                    {                       
                        fv.od = 0;
                        fv.do = dane.length-1;
                    }
                }
                else
                {
                    document.getElementById('butR').style.display = "block";
                }
                //console.log("od = " + fv.od + ", do = " + fv.do);
                for(var i = fv.od; i <= fv.do; i ++)
                {
                    var dzien = dane[i].data;
                    var godzina = dane[i].godzina;
                    var usluga = dane[i].usluga;

                    html += "<tr tr style='text-align: center;'>";
                    html += "<td>" + usluga + "</td><td>" + dzien + "</td><td>" + godzina + "</td>";
                    html += "</tr>";
                }            
                document.getElementById("dane").innerHTML = html;
            }
        }
    }

    function ValuePlus(x)
    {
        x.od += 20;
        x.do += 20;
        GetJason(ajax, method, url, asynchronous, x);
    }

    function ValueMinus(x)
    {
        x.od -= 20;
        x.do -= 20;
        GetJason(ajax, method, url, asynchronous, x);
    }
</script>

0

Nie analizowałem całego kodu. Ale jeśli chcesz przejść do innej strony to może tego Jsona zapisz do sesji. Zrób przekierowanie, a na przekierowanej stronie wyświetl dane pobierając z sesji?

0

Ok, dzięki, zaraz zobaczę jak to będzie chodziło :)

0

Chyba jednak sobie z tym nie poradzę. Jak sparsować JSON'a do sesji i jak go potem pobrać w Ajax?

0

@rav89 Czemu chcesz robić to osobno? Czemu po prostu nie wygenerujesz go w miejscu gdzie jest zwracany widok?

A co do Twojego pytania o co chodzi z 2. Myślałem że $dane to formularz a nie wygenerowany json.

0

Nie chcę przekazywać do widoku, zawsze staram się oddzielić "mechanizmy" strony od widoków jakie się pojawiają. Poza tym nie wiem za bardzo jak sparsować widok z JSON'em, żeby się do niego odwoływać w Ajax. W sensie, co np. wpisać w URL, co zamiast XMLHttpRequest() itp :P Zawsze posługiwałem się taką wyuczoną praktyką, aż do teraz, kiedy napotkałem ten problem :) Już przesłałem JSON'a przez sesję, teraz staram się to jakoś obsłużyć w widoku, ale jakoś jeszcze mi nie wychodzi

1 użytkowników online, w tym zalogowanych: 0, gości: 1