PHP tar inte emot något data från react.js fetch.

Permalänk

PHP tar inte emot något data från react.js fetch.

Jag skickar formulär data från react.js till MySQL databasen med hjälp av fetch och PHP men PHP-filen verkar inte ta emot något data.

Register.php

<?php //header('Access-Control-Allow-Origin: *'); //header('Content-type: application/json'); include("connect.php"); $rest_json = file_get_contents("php://input"); $_POST = json_decode($rest_json, true); $email = $_POST['email']; $password = $_POST['password']; $county = $_POST['county']; //$date = date("Y-m-d"); if(!empty($email) || !empty($password) || !empty($county)) { http_response_code(200); $email = mysqli_real_escape_string($connect, $_POST['email']); $password = mysqli_real_escape_string($connect, $_POST['password']); $county = mysqli_real_escape_string($connect, $_POST['county']); //$date = date("Y-m-d"); $sql = " INSERT INTO user ( email, county) VALUES ('$email', '$county'); INSERT INTO password (userid, password) VALUES ((SELECT userid FROM user WHERE email= '$email'), '$password')"; if($connect -> query($sql) === TRUE) { echo "New record created successfully"; echo $sport; } else { echo "Error: " .$sql . "<br>" . $connect-> error; } mysqli_close($connect); }else{ echo 'saknas uppgifter'; } ?>

Får felkoden saknas uppgifter.

import React from 'react'; import {Redirect} from 'react-router-dom'; import { PostData } from './PostData'; import MySide from './MySide'; import './Login.css'; class Login extends React.Component { constructor() { super(); this.state = { email: '', password: '', //redirectToReferrer:false }; this.register = this.register.bind(this); this.registerSubmit = this.registerSubmit.bind(this); this.onChange = this.onChange.bind(this); } onChange(e) { this.setState({ [e.target.name]:e.target.value }) } register(e) { e.preventDefault(); console.log('registrerad'); this.setState({ display: false }) } addActiveClassregister(e) { this.setState({active: false}); } registerSubmit(e) { e.preventDefault(); console.log(this.state); const data = { email: this.refs.email.value, password: this.refs.password.value, county: this.refs.county.value } console.log(this.refs.email.value); console.log(this.refs.password.value); console.log(this.refs.county.value); console.log(data); fetch('http://localhost/test/src/api/register.php/', { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json; charset=utf-8; text/html', 'Access-Control-Allow-Origin': 'localhost:test', }, body: JSON.stringify(data) }) .then(resp => resp.text()) .then(data => console.log(data)) if( this.state.redirectToReferrer || sessionStorage.getItem('userData')){ return(<Redirect to={'/mySide'}/>) } } render () { return( <div className="Register active"> <h2>Registrera ny användare</h2> <form className="Register-form" onSubmit={this.registerSubmit}> <input type="text" name="email" ref="email" placeholder="mailadress" onChange={this.onChange} /> <input type="password" name="password" ref="password" placeholder="lösenord" onChange={this.onChange} /> <input type="county" name="county" ref="county" placeholder="Län" onChange={this.onChange} /> <input type="submit" value="Registrera"/> <button className="loginButton" onClick={this.login} onClick={this.addActiveClassRegister}> Logga in</button> </form> </div> </div> </div> ); } } export default Login;

Någon som kan se vad som saknas?
Tack på förhand!

Permalänk
Medlem
Skrivet av Snillet71:

Register.php

if(!empty($email) || !empty($password) || !empty($county)) { ... }

Nu räcker det med att en av $email, $password och $county inte är tom för att resten ska köras. Du vill troligen byta ut "||" mot "&&".

Skrivet av Snillet71:

JS-filen:

fetch('http://localhost/test/src/api/register.php/', {

Avslutande snedstreck ("/") ska troligen inte vara där. Dessutom ser din `return()` ut att vara trasig.

Visa signatur

WS: MSI B350M Mortar | AMD Ryzen 7 1700 | PH-TC14PE | 32GB DDR4 3000MHz | 1TB Kingston NV2 | Intel Arc A750 8GB | 2*BenQ G2420HDB
Router: Gigabyte GA-870-UD3 | AMD Phenom II x6 1055t @ 2600MHz, 1.25V | 12GB DDR3 | 2*250GB HDD @ RAID1 | 4TB HDD
Laptop: Thinkpad X220 4291-QF6

Permalänk
Medlem

Testa vilka data du får ut vid json-hämtningen genom att lägga till det fetstilta:

$rest_json = file_get_contents("php://input");
var_dump(json_decode($rest_json, true));
exit;

$_POST = json_decode($rest_json, true);

Du bör nog heller inte lägga till egna saker direkt i den inbyggda $_POST. Använd egna variabler istället.

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk

@Joppis: Får ut NULL av var_dump.
Hur går jag vidare?
Är ganska så ny på PHP.

Permalänk
Medlem
Skrivet av Snillet71:

@Joppis: Får ut NULL av var_dump.
Hur går jag vidare?
Är ganska så ny på PHP.

Då är det ju med största sannolikhet detta som returnerar NULL:

file_get_contents("php://input");

Vad är det du hämtar där egentligen?

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem
Skrivet av Snillet71:

@Joppis: Får ut NULL av var_dump.
Hur går jag vidare?
Är ganska så ny på PHP.

Skickar du en POST eller GET request när du testar detta?

Visa signatur

WS: MSI B350M Mortar | AMD Ryzen 7 1700 | PH-TC14PE | 32GB DDR4 3000MHz | 1TB Kingston NV2 | Intel Arc A750 8GB | 2*BenQ G2420HDB
Router: Gigabyte GA-870-UD3 | AMD Phenom II x6 1055t @ 2600MHz, 1.25V | 12GB DDR3 | 2*250GB HDD @ RAID1 | 4TB HDD
Laptop: Thinkpad X220 4291-QF6

Permalänk
Medlem
Skrivet av Joppis:

Då är det ju med största sannolikhet detta som returnerar NULL:

file_get_contents("php://input");

Vad är det du hämtar där egentligen?

file_get_contents("php://input");
Är en av flera sätt att läsa input som skickas till en php fil. Detta kan tex vara POST, PUT, DELETE osv.
Oftast använder man $_POST om man har skickat information som form-data,

Skrivet av Snillet71:

Register.php

$sql = " INSERT INTO user ( email, county) VALUES ('$email', '$county'); INSERT INTO password (userid, password) VALUES ((SELECT userid FROM user WHERE

Viktigt att du saniterar din input annars kan andra göra injektioner av kod mot din databas. Rekommenderar att läsa igenom följande artikel.
https://www.w3schools.com/php/php_mysql_prepared_statements.a...

Visa signatur

Node 304 White | Asus Strix X470-I | R5 2600 @ 3.85Ghz | 16GiB DDR4-3000Mhz CL15 | Sapphire Radeon RX 5700 PULSE | 512GiB 860 EVO M.2 | 1TiB 970 EVO Plus NVMe | Corsair SF450

Permalänk

@Joppis: Har faktiskt ingen aning om vad jag hämtar. Hittade en lösning som någon gjort och detta tog bort felkoden jag hade.

Permalänk

@Dracc: Jag skickar en POST.

Permalänk

Har ändrat lite i fetch-funktionen och får nu denna felkod.
Error: SyntaxError: Unexpected end of input för den här raden .then(res => res.json())

fetch('http://localhost/test/src/api/register.php/', { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json; charset=utf-8; text/html', 'Access-Control-Allow-Origin': 'localhost:test', }, body: JSON.stringify(data) }) .then(res => res.json()) .then(response => console.log('Success:', JSON.stringify(response))) .catch(error => console.error('Error:', error));

Det verkar inte som något skickas ifrån react-filen.

Permalänk
Medlem

@Snillet71: Du kan inte köra mode = no-cors om du vill läsa ifrån resulterande body med t.ex. res.json()

Här har du lite relevant information:

https://stackoverflow.com/questions/43262121/trying-to-use-fe...

Det du gör när du använder 'no-cors' är att du får tillbaka ett "opaque" response och då kan du inte accessa något i body-delen. Se till att fixa så att CORS kan köras på backend genom att skicka rätt HTTP-headers i en s.k. "pre-flight", alternativt köra backend och front-end på samma host (inklusive portnummer då).

Permalänk

@toj_ts: Tack, nu funkar det!!