Как проверить, существует ли пользователь в базе данных, используя ReactJs, PHP и MySQL? - PullRequest
0 голосов
/ 13 февраля 2020

Я создал страницу входа в систему Reactjs, и у меня есть код login_check в PHP. Теперь я должен проверить, существует ли пользователь в базе данных, и если он существует, я хочу создать токен, иначе нет. Я использовал jquery для публикации данных, когда пользователь вводит свои данные. Но каждый раз, когда в консоли выдается сообщение с сожалением, не знаю, публикуются ли данные на PHP или нет. Вот мой код.

Sigin. js

import React, { Component } from 'react';
import { Redirect } from 'react-router-dom'
import axios from 'axios'
import $ from 'jquery'
class Signin extends Component {
constructor(props)
{
    super(props);
    const token = localStorage.getItem("token")

    let loggedIn = true
    if(token == null)
    {
        loggedIn = false
    }

    this.state = {
        email: '',
        password: '',
        loggedIn
    }

    this.onChange = this.onChange.bind(this)
    this.submitForm = this.submitForm.bind(this)
}

onChange(e){
    this.setState({
        [e.target.name] : e.target.value
    })
}


submitForm(e){
    e.preventDefault();
    // const { email, password } = this.state

    // if(email === "admin@123" && password === "admin")
    // {
    //     localStorage.setItem("token", "loggedIn")
    //     this.setState({
    //         loggedIn: true
    //     })
    //     console.log("Logged In!")
    // }
    // else
    // {
    //     alert("Invalid email or password!");
    //     console.log("Invalid email or password!")
    // }


        $.post("http://localhost/php-react-rest-api-crud/login_check.php", function(data){
                if(data === "1")
                {
                    localStorage.setItem("token", "loggedIn")
                    console.log("success!");
                }
                else if(data === "0")
                {
                    console.log("sorry!");
                }
            })

}
render() {
    if(this.state.loggedIn)
    {
        return <Redirect to = "/admin" /> 
    }
    return (

        <div>
            <h1>Login</h1>

            <form onSubmit={this.submitForm}>
                <input type="email" name="email" placeholder="Enter email" value={this.state.email} onChange={this.onChange}/>
                <input type="password" name="password" placeholder="Enter Password" value={this.state.password} onChange={this.onChange}/>
                <br />
                <input type="submit"/>
            </form>
        </div>
    );
  }
}

export default Signin;

login_check. php

<?php

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, Content-Type, Authorization, X-Auth-Token');
header("Access-Control-Allow-Methods: GET, POST");

$conn = mysqli_connect("localhost", "root", "", "farmer_portal");
if(!$conn)
{
    die('Connection error'.mysqli_connect_errno());
}


if((!isset($_POST['email'])) && (!isset($_POST['password'])))
{
   echo "0"; 
   exit();
}

$myemail = $_POST['email'];
$mypassword= $_POST['password'];


$email = "SELECT * FROM signup WHERE email='$myemail' ";
$pass = "SELECT * FROM signup WHERE password='$mypassword' ";

$myemail = stripslashes($email);
$mypassword = stripslashes($password);

$res_e = mysqli_query($conn,$myemail);
$res_p = mysqli_query($conn,$mypassword);

if(mysqli_num_rows($res_p) > 0 && mysqli_num_rows($res_e) > 0)
{
echo "1";
}
else
{
  echo "0";
}

?>

1 Ответ

1 голос
/ 13 февраля 2020

Сначала немного о вашем коде, если я могу

Я вижу, что вы импортируете Ax ios, но никогда не используете его, вместо этого используете jQuery для отправки вашего ajax запроса. Если это все, что вы используете jQuery, я настоятельно рекомендую сбросить его и придерживаться Ax ios. Замечательно в том, что он делает.

Во-вторых, когда это возможно, избегайте множественных запросов SQL, если вы можете избежать неприятностей с меньшим количеством или, что еще лучше, с одним. Эти два запроса:

$email = "SELECT * FROM signup WHERE email='$myemail' ";
$pass = "SELECT * FROM signup WHERE password='$mypassword' ";

Должны быть объединены в один:

$user_info = "SELECT * FROM signup WHERE email='$myemail' AND password='$mypassword'";

Вы также должны проверить содержимое $myemail и $mypassword. stripslashes() недостаточно для предотвращения mysql инъекций. Подробнее об этом здесь .

Никогда не доверяйте вводу пользователя. Всегда проверяйте, что вы получаете то, что ожидаете, в вашем случае, что $myemail действительно адрес электронной почты и password действительно строка. PHP предоставляет две функции для этой цели, filter_var($myemail, FILTER_VALIDATE_EMAIL) и is_string($mypassword).

Наконец, и, возможно, самый важный момент: не хранить нехэшированные пароли . PHP предоставляет password_hash($mypassword) для хранения паролей и password_verify($mypassword) для проверки ваших пользовательских данных в базе данных.

Теперь, чтобы ответить на ваш вопрос

Ответ заключается в вашем JS коде:

$.post("http://localhost/php-react-rest-api-crud/login_check.php", function(data) {
    // ...
});

И в Ax ios и jQuery вторым параметром функции post() должны быть ваши данные, то есть адрес электронной почты и пароль пользователя. , Но здесь вы не отправляете никаких данных, вы сразу переходите к обработке ответа на ваш запрос AJAX. Следовательно, почему PHP возвращает "0".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...