Js fetch üres $_POST
2021-04-18T12:59:53+02:00
2021-04-18T14:42:27+02:00
2022-08-12T02:05:35+02:00
AlterEgo_2
Sziasztok!

Környezet (ha esetleg számít): Win10, XAMPP. Sok desktop után ismerkedem a js és a web világával. Megnéztem pár js tutorialt és gondoltam kipróbálom egy egyszerű loginnal. HTML formon felhasználói név és jelszó bekérés. Gombnyomásra js-ben szeretném a jelszót ellenőrizni egy php-s rész hívással:

function login(e) { e.preventDefault(); fetch('login.php', { method: 'POST', body: JSON.stringify({ f_userid: 'BBBB', f_username: 'walaki', f_password: 'pass' }), headers: { 'Accept': 'application/json' } }) .then(response => response.json()) .then(response => { console.log(response); }) .catch(error => console.log('Hiba: ' + error)); }

A php-ben:
...

if (isset($_POST)) { if (isset($_POST['f_userid'])) { $user = $_POST['f_userid']; } else { $user = 'AAAA'; } } else { $user = 'AAAA'; }
...

$result = $stmt->fetch(PDO::FETCH_ASSOC);
..

echo json_encode($result);

A db-ben létrehoztam az AAAA azonosítójú usert. A program lefut, a választ rendben megkapom az AAAA-hoz tartozó adatokkal. Viszont a php-nél a $_POST mindig üres. Ha a php-ben ki akarom íratni a $_POST-ot, akkor az mindig üres tömböt ad vissza.
A google-n látom, hogy nem vagyok egyedül ezzel a problémával. Kipróbáltam sokféle verziót, de semmi nem segített. Mielőtt letörlöm az egészet, valaki tud esetleg segíteni, hogy miért üres a POST?
Előre is köszönöm!
Mutasd a teljes hozzászólást!
Sz@r ez az egesz ajax. Mindjart kuldok egy normalisat

var formData = new FormData(); $.ajax({ url: "https://example.com/email.php", type: "POST", contentType: false, dataType: "json", data: formData, cache: false, processData: false, async: true, timeout: 5000, beforeSend: function(data) { formData.append("object", JSON.stringify({"email": $("#email").val(), "password": $("#password").val() } ) ); }, success: function(data) { console.log("success"); }, error: function(data) { console.log("error"); ; console.log('status: ' + data.status); console.log('statusText: ' + data.statusText); console.log('readyState: ' + data.readyState); console.log('error: ' + JSON.stringify(data)); }, complete: function(data) { if(data.status === 200) { //console.log("complete"); }; }; }); <?php $microtime = microtime(true); //1392574639.0631 $microtime = number_format($microtime, 3, '.', ''); //1392574639.063 $microtime_explode = explode(".", $microtime); $microtime_explode_before = $microtime_explode[0]; //1392574639 $microtime_explode_after = $microtime_explode[1]; //063 $db = mysqli_connect("localhost", "root", "", ""); $json = json_decode($_POST["object"], true); $emailInsert = $json["email"]; $passwordInsert = $json["password"]; if (filter_var($emailInsert, FILTER_VALIDATE_EMAIL)) { //$import = mysqli_query($db,"INSERT INTO `emailtest` (email, sent, unsubscribe) //SELECT * FROM (SELECT '$emailInsert' AS email, '$microtime_explode_before' AS sent, '0' AS unsubscribe) AS tmp //WHERE NOT EXISTS ( //SELECT `email` FROM `emailtest` WHERE email = '$emailInsert') LIMIT 1"); //echo $emailInsert."<br>"; //$import = mysqli_query($db,"INSERT INTO `emailtest` (email) SELECT * FROM (SELECT '$emailInsert' AS email) AS tmp WHERE NOT EXISTS (SELECT `email` FROM `emailtest` WHERE email = '$emailInsert') LIMIT 1"); //echo $emailInsert."<br>"; $data = array( "email" => $emailInsert ); echo json_encode($data, true); }; ?>
Mutasd a teljes hozzászólást!

  • Decode, encode

    (valami, true) 

    A true van nalam a php ban. Viszont, ha js akkor hasznalj node.js-t php val mar ne szenvedj 2021 ben. Megelni mar ugyse fogsz belole, ha meg hobbi akkor hasznalj korszeru nyelvet. Websocket stb.persze kell sajat vas vagy vps, de megeri az elmeny felbecsulhetetlen.
    Mutasd a teljes hozzászólást!
  • Köszönöm a választ és a tanácsokat. Igazából utána React, vagy Angular lenne a köv. cél (ha el nem megy addig a kedvem az egésztől). Ill. a Laravelt is nézegetem.

    Decode, encode. Kiegészítem, de nem ezzel van bajom. HTML-ből meghívom a php-t. Az FF-es vizslatóban látom, hogy a fejléc ok, a kérésben az van, aminek lennie kell. Viszont a válaszban mindig csak a default user dolgai jönnek.

    Ha a php-t egy print_r($_POST)-tal kezdem, akkor a válaszban üres tömböt kapok. Ebből, meg a sok google bejegyzésből gondolom azt, hogy a $_POST valahol elvész az éterben.
    Mutasd a teljes hozzászólást!
  • Sz@r ez az egesz ajax. Mindjart kuldok egy normalisat

    var formData = new FormData(); $.ajax({ url: "https://example.com/email.php", type: "POST", contentType: false, dataType: "json", data: formData, cache: false, processData: false, async: true, timeout: 5000, beforeSend: function(data) { formData.append("object", JSON.stringify({"email": $("#email").val(), "password": $("#password").val() } ) ); }, success: function(data) { console.log("success"); }, error: function(data) { console.log("error"); ; console.log('status: ' + data.status); console.log('statusText: ' + data.statusText); console.log('readyState: ' + data.readyState); console.log('error: ' + JSON.stringify(data)); }, complete: function(data) { if(data.status === 200) { //console.log("complete"); }; }; }); <?php $microtime = microtime(true); //1392574639.0631 $microtime = number_format($microtime, 3, '.', ''); //1392574639.063 $microtime_explode = explode(".", $microtime); $microtime_explode_before = $microtime_explode[0]; //1392574639 $microtime_explode_after = $microtime_explode[1]; //063 $db = mysqli_connect("localhost", "root", "", ""); $json = json_decode($_POST["object"], true); $emailInsert = $json["email"]; $passwordInsert = $json["password"]; if (filter_var($emailInsert, FILTER_VALIDATE_EMAIL)) { //$import = mysqli_query($db,"INSERT INTO `emailtest` (email, sent, unsubscribe) //SELECT * FROM (SELECT '$emailInsert' AS email, '$microtime_explode_before' AS sent, '0' AS unsubscribe) AS tmp //WHERE NOT EXISTS ( //SELECT `email` FROM `emailtest` WHERE email = '$emailInsert') LIMIT 1"); //echo $emailInsert."<br>"; //$import = mysqli_query($db,"INSERT INTO `emailtest` (email) SELECT * FROM (SELECT '$emailInsert' AS email) AS tmp WHERE NOT EXISTS (SELECT `email` FROM `emailtest` WHERE email = '$emailInsert') LIMIT 1"); //echo $emailInsert."<br>"; $data = array( "email" => $emailInsert ); echo json_encode($data, true); }; ?>
    Mutasd a teljes hozzászólást!
  • Ok. Közben sikerült működésre bírni.

    Ha létrehozok egy FormData objektumot, abba pakolok minden posztolandó cuccot és az a body, akkor hibátlanul lefut.

    const formData = new FormData(); formData.set('f_userid','BBBB'); formData.set('f_password','pass'); ... body: formData, ...
    Már csak azt lenne jó tudni, hogy miért, hisz' a net is tele van FormData nélküli példákkal.
    Mutasd a teljes hozzászólást!
  • Ott a teljes kód. Használj jquery-t és a beforeSend elott ellenorizd a value-t a php oldalon meg rakd be a password-ot is. Azok alapján rendesen megvan a lekérdezés és mennek vissza a kliensre az adatok
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget! Ebből is kiderült volna, hogy FormData a kulcs. A miértjét továbbra sem értem és arra sem emlékszem, hogy valahol erre felhívták volna a figyelmet. (Hacsak nem felületesen olvastam.)
    Mutasd a teljes hozzászólást!
  • A php nem bejelntkezős ott csak az emailt írom be az adatbázisba, hogy létezik e a megadott email. Ha igen, akkor nem szúrja be. 

    Viszont ezek alapján megtudod csinálni csak a mysql ellenőrzés lesz

    A js success-be szurd be ezt:
    console.log('success: ' + JSON.stringify(data));

    Így látod, hogy mi jön vissza a php-tól. 

    data.email
    data.valami

    Click után a beforeSend-ben a jquery ellenőrzi az email, password input value-t és már megy is a szerverre az adat. 

    Ennyi az alap AJAX.
    Node.js-ben nem kell a formData.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd