PHP és JS segítségével Ajax-on JSON válasz
2017-05-15T16:29:46+02:00
2017-05-16T14:50:12+02:00
2022-08-10T16:00:30+02:00
Janos67
Sziasztok!

Valamiért eddig nem volt szükségem a JSON-féle Ajax-válaszokra.
De, most eljött az idő :)

JS-ben előkészítem és meghívom a PHP-ben írt Ajax feldolgozót, az visszaküldve a választ ismét JS-ben kellene feldolgozni azt. Én eddig a min-ajax.js-t használtam, de - mivel nem működött - most kipróbáltam a jQuery-féle módszert, ám azzal is ugyanaz a probléma.

Íme a PHP:

include("parameterek.php"); include("functions/functions.php"); $valaszTomb = array(); // Adtak meg mod értéket? if (isset($_REQUEST["mod"])) { // Igen -> Milyen módot kértek? if ($_REQUEST["mod"] == 1) { // 1-es, azaz vissza kell küldeni az elérhető gépjárműtípusok adatait // Nyissuk meg a MySQL kapcsolatot MysqlKapcsolodas(); // Adjuk ki a parancsot és dolgozzuk fel a válaszokat $sql = SqlBetoltes('0009'); $query = mysql_query($sql) or die ('Hiba (0009): ' . mysql_error()); while($result = mysql_fetch_array($query)) { array_push($valaszTomb, array("id" => $result['id'], "megnevezes" => $result['megnevezes'], "dokkolhato" => $result['dokkolhato']) ); } // Zárjuk le a MySQL kapcsolatot MysqlZaras(); // Küldjük el a választ Debug(serialize($valaszTomb)); print json_encode($valaszTomb); } }

Itt a JS:

$.ajax({ url: "portaajax.php", dataType: 'json', type: "POST", data: { mod: 1 }, error: function (xhr, ajaxOptions, ErrorMessage) { alert(ErrorMessage, "true"); }, success: function(data) { alert(data); $.each(JSON.parse(data), function (index, value) { alert(value.id); }); } });
A PHP-ben lévő Debug(...) sor eredményre vezet, azaz ő elküldené a helyes végeredményt.
Ám amikor a JS alert(...) sora lefut, ez jelenik meg:

SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data

Azt is kipróbáltam már, hogy a $.ajax(...)-ban a dataType értékét 'html'-re írtam át. Dettó...

Segítsetek, legyetek kedvesek!

Hol rontom el?
Mutasd a teljes hozzászólást!
Be tudod másolni a Debug() függvényt is (lehet van egy exit a végén)?
Mekkora php verzióval próbálod (lehet nincs is json_encode függvényed - php 5.2+)?
Ha minden van, akkor a json encode után le tudod kérni a hibaüzenetet is (ha van) a json_last_error() függvénnyel.
Mutasd a teljes hozzászólást!

  • Egy tesztoldal-t nézz meg és értelmezd a kódokat...
    Mutasd a teljes hozzászólást!
  • Ha a jQuery.ajax() metódusnak megmondod, hogy JSON választ vársz, akkor ő már elintézi neked a JSON parse-olást, és egy mezei JS objektumot fogsz tőle visszakapni. Ezt a JSON.parse() metódusnak átadni nem csak felesleges, hanem hibához is vezet, mivel a JS objektumot először sztringgé fogja alakítani, aminek az eredménye valami olyasmi lesz, hogy "[Object object]", ami meg nyilván nem érvényes JSON sztring.

    Szóval a megoldás: dolgozz közvetlenül a data-n, ne próbáld rá meghívni a JSON.parse()-ot.
    Mutasd a teljes hozzászólást!
  • Szia Feri bátyám!

    Mindenek előtt köszi szépen a segítséget!

    A PHP részhez nem nyúltam hozzá.
    A JS részt emígy módosítottam:

    var data = { 'mod': 1 }; data = $(this).serialize() + "&" + $.param(data); alert("Itt vagyok."); $.ajax({ type: "POST", dataType: 'json', url: "portaajax.php", data: data, success: function(data) { alert("data: '" + data['id']+ "'"); } });

    Kiírja, hogy "Itt vagyok.", de a succes részben lévő alert már le sem fut, pedig a PHP-ben lévő kód lefut az ott elhelyezett Debug tanusága szerint. JS hiba sincs.

    Fogalmam sincs, most mi a baj :(
    Mutasd a teljes hozzászólást!
  • Szia Feri bátyám!

    Ez félrement, az én nevem nem Feri...

    Kiírja, hogy "Itt vagyok.", de a succes részben lévő alert már le sem fut, pedig a PHP-ben lévő kód lefut az ott elhelyezett Debug tanusága szerint. JS hiba sincs.

    A böngészőben is van debugger, többek között listázza azt is, hogy milyen HTTP kérések mentek el és milyen válaszok jöttek vissza rá. Ott kéne megnézni, azt a választ kapod-e, amire számítasz. De az se ártana, ha a success kezelő függvény mellé egy error kezelő függvényt is megadnál, mert akkor meg tudnád vizsgálni, milyen hibát ad vissza a jQuery.
    Mutasd a teljes hozzászólást!
  • Szia Csaboka2!

    Azóta az error-t is beillesztettem:

    $.ajax({ type: "POST", dataType: 'html', url: "portaajax.php", data: data, error: function(xhr, ajaxOptins, ErrorMessage) { alert(ErrorMessage); }, success: function(data) { console.log("xxx"); console.log(data); alert("data: '" + data+ "'"); } });
    És nem fogod elhinni mi jön ki onnan:

    SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data

    :(

    Hát, de komolyan: miért nem mentem cukrásznak?!
    Mutasd a teljes hozzászólást!
  • És ami még a legdurvább, hogy hallgatva rád, megnéztem a böngésző debugerét és a csatolt képet látom: 0 byte a válasz.
    A PHP-ben használt Debug függvény véeredménye pedig ez:

    a:10:{i:0;a:3:{s:2:"id";s:1:"1";s:10:"megnevezes";s:13:"1-3 t Tranzit";s:10:"dokkolhato";s:1:"N";}i:1;a:3:{s:2:"id";s:1:"2";s:10:"megnevezes";s:15:"3,5 t Teherautó";s:10:"dokkolhato";s:1:"I";}i:2;a:3:{s:2:"id";s:1:"3";s:10:"megnevezes";s:15:"7,5 t Teherautó";s:10:"dokkolhato";s:1:"I";}i:3;a:3:{s:2:"id";s:1:"4";s:10:"megnevezes";s:11:"12 t Kamion";s:10:"dokkolhato";s:1:"I";}i:4;a:3:{s:2:"id";s:1:"5";s:10:"megnevezes";s:20:"12 t Kamion + Tandem";s:10:"dokkolhato";s:1:"I";}i:5;a:3:{s:2:"id";s:1:"6";s:10:"megnevezes";s:11:"24 t Kamion";s:10:"dokkolhato";s:1:"I";}i:6;a:3:{s:2:"id";s:1:"7";s:10:"megnevezes";s:15:"Személygépkocsi";s:10:"dokkolhato";s:1:"N";}i:7;a:3:{s:2:"id";s:1:"8";s:10:"megnevezes";s:4:"Taxi";s:10:"dokkolhato";s:1:"N";}i:8;a:3:{s:2:"id";s:1:"9";s:10:"megnevezes";s:5:"Motor";s:10:"dokkolhato";s:1:"N";}i:9;a:3:{s:2:"id";s:2:"10";s:10:"megnevezes";s:8:"Gyalogos";s:10:"dokkolhato";s:1:"N";}}

    Huhh!! Ilyenkor mi van?
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Hello,

    Böngészőn nyomj egy F12-t ami előhozza a debuggert, ott a hálozati tabon látod az ajax hívásokat minden paraméterrel és persze a válasszal. Amennyiben helyes a válasz, akkor esetleg próbáld még meg ezzel:

    var response = $.parseJSON(ajax_response);
    Mutasd a teljes hozzászólást!
  • A paraméterek megfelelőek? A PHP kódod szerint ha nincs mod akkor üres a válasz.
    Mutasd a teljes hozzászólást!
  • Hali drichee!

    Az előzőben csatoltam be az általad (is) javasolt debuger képernyőjén, ahol látszik a sajnálatos 0 byte válasz.
    Mutasd a teljes hozzászólást!
  • Drichee!

    Igaz, de ott van az a bizonyos

    Debug(serialize($valaszTomb));

    PHP sor, ami a logs/test.log fájlba kiírja a serializált $valaszTomb tartalmát, vagyis tutira belefut a PHP ebbe a programrészbe.
    Mutasd a teljes hozzászólást!
  • Csak pusztán a próba kedvéért az Ajax hívás dataType-ját az eddigi 'json' helyett lecseréltem 'html'-re. Ugyanúgy 0 byte érkezik válaszként, de ekkor nem fut bele az error részbe.
    Mutasd a teljes hozzászólást!
  • A böngésző debuggon nézd meg a kérés paramétereit, hogy tényleg benne van-e az adott paraméter.

    Továbbá próbáld meg GET-esre megcsinálni a hívást és majd a linket böngészőből nézd meg.

    A 0 méretű válaszból nekem nagyon úgy tűnik, hogy még a PHP részen akad el a dolog.
    Mutasd a teljes hozzászólást!
  • Be tudod másolni a Debug() függvényt is (lehet van egy exit a végén)?
    Mekkora php verzióval próbálod (lehet nincs is json_encode függvényed - php 5.2+)?
    Ha minden van, akkor a json encode után le tudod kérni a hibaüzenetet is (ha van) a json_last_error() függvénnyel.
    Mutasd a teljes hozzászólást!
  • Szia Frostech0!

    Nálad a pont!

    A json_encode "megmakkant".
    Ki kellett egészíteni a programot úgy, hogy a json_encode előtt a $valaszTomb összes elemét rá kellett szalajtani egy mb_convert_encoding-ra, mert e nélkül "5"-ös hibát adott.

    Lásd még:

    json_encode() throwing an error: "Invalid UTF-8 sequence in argument"

    és

    Changing character encoding of multidimensional array

    Nagyon szépen köszönöm a türelmeteket és a segítségeteket!!
    Mutasd a teljes hozzászólást!
  • PHP oldalról elsőnek egy tuti jóval nézd meg, mint ilyesmivel:

    <?php
    $myArr = array("John", "Mary", "Peter", "Sally");
    $myJSON = json_encode($myArr);
    echo $myJSON;
    ?>
    Mutasd a teljes hozzászólást!
  • Ezekkel a PHP kódokkal is van sok baj, tegnap én is egy sima w3school példát próbáltam, és az is hibás volt, azt hittem pedig az tuti jó lesz, de egy sor kellett elé annak is, a PHP verzió miatt.
    Mutasd a teljes hozzászólást!
abcd