【问题标题】:React Native Expo - can't send data to php fileReact Native Expo - 无法将数据发送到 php 文件
【发布时间】:2019-11-13 10:51:43
【问题描述】:

我在 React Native Expo 上,我尝试使用现有 MySql 数据库中的数据构建用户登录。我可以连接到数据库,如果我的 php 文件中有硬编码的用户名和密码,我会收到正确的反馈给我的应用程序。

我的登录类(重要部分)

class LoginActivity extends Component {

  // Setting up Login Activity title.
  static navigationOptions =
   {
      title: 'LoginActivity',
   };

constructor(props) {

    super(props)

    this.state = {

      username: '',
      password: '',
      isLoading: true

    }
  }

UserLoginFunction = async () => {

 const { username }  = this.state ;
 const { password }  = this.state ;
 let body = JSON.stringify({username, password})
const formData = new FormData();
 formData.append('username', username);
  formData.append('password', password);
console.log("formData: " + body);
await fetch('https://example.com/User_Login.php', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    //'Content-Type': 'application/json',
    'Content-Type': 'multipart/form-data'
  },
  body: formData

  /* JSON.stringify({ // Here's the fun part. Put your data here.
      "username": this.state.username,
      "password": this.state.password
  }) */

}).then((response) => response.text()) //.json()
      .then((responseJson) => { console.log("response: " + responseJson);
        // If server response message same as Data Matched
       if(responseJson === 'ok')
        {
            alert('YEAH!');
            //Then open Profile activity and send user email to profile activity.
            //this.props.navigation.navigate('Home', { username: username });
        }
        else{
          Alert.alert(responseJson);
        }

      }).catch((error) => {
        console.error(error);
      });
  }

  render() {
    return (

<View style={styles.MainContainer}>

        <Text style= {styles.TextComponentStyle}>Login</Text>
        <TextInput
          placeholder="Enter User Name"
onChangeText={username=>this.setState({username})}
          underlineColorAndroid='transparent'
          style={styles.TextInputStyleClass}
        />

        <TextInput
          // Adding hint in Text Input using Place holder.
          placeholder="Enter User Password"
          onChangeText={TextInputValue=>this.setState({password:TextInputValue})}
          underlineColorAndroid='transparent'
          style={styles.TextInputStyleClass}
          secureTextEntry={true}
        />

我的User_Login.php

<?php
header("allow-control-access-origin: *, Content-Type: application/json");
include 'DBConfig.php';

// Creating connection.
 $conn = new mysqli($HostName,$HostUser,$HostPass,$DatabaseName);
//echo json_encode($con);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$json = file_get_contents('php://input'); // this part not seems to work.
$obj = json_decode($json,true);

// Populate User email from JSON $obj array and store into $email.
$username = $obj['username'];
//$username = $obj['opb'];
//$username = 'opb';// Populate Password from JSON $obj array and store into $password.
$password = $obj['password'];
//$password = '123456';
//Applying User Login query with email and password match. username password
$sql = ("SELECT * FROM fe_users_app where username='$username' and password='$password'");
// Executing SQL Query.
$result = $conn->query($sql);

if($username != null){
if($result->num_rows==0){
  echo json_encode('Wrong Details');
}
else{
  echo json_encode('ok');
}

}
else{
  echo json_encode('Keine Daten');
}

$conn->close();

?>

部分

$json = file_get_contents('php://input');

似乎不起作用。没有来自输入字段的数据。 您知道如何将我的文本从inputfields 发送到php 文件吗?

【问题讨论】:

    标签: javascript php html react-native expo


    【解决方案1】:

    问题是您想发送 JSON 请求,但实际上发送的是 FormData 请求,而 php://input 不适用于 FormData 请求。

    要解决此问题,请删除 formData 并更改您的获取请求,如下所示:

    await fetch('https://example.com/User_Login.php', {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        'username': username,
        'password': password
      })
    })
    

    【讨论】:

    • 您好,错误,感谢您的帮助。正如您在我的代码中看到的那样,您的想法实际上是我的第一次尝试(该部分已被注释掉)。当我输入硬编码的 $username 和 $password 时,这也可以正常工作并且我得到响应。只有当我做 $username = $obj['username']; $password = $obj['密码'];我得到了一个空的结果。所以我认为传输 $json = file_get_contents('php://input');不管用。不在模拟器上,也不在设备上。还有其他想法吗?
    • 鉴于这应该是正确的方法,请尝试在两侧调试主体,确保在将 usernamepassword 传递给 fetch 之前填充它们并查看您收到的内容在$obj。如果您设法从 PHP 解析正文,但用户名和密码为空,我认为即使您获取它们也是空的。
    【解决方案2】:

    问题是您正在使用表单数据请求发送数据,对于 JSON 请求,请在 fetch config 中使用以下内容并删除表单数据。

    body: JSON.stringify({
     'username': username,
     'password': password
    })
    

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 2018-12-15
      • 2020-03-16
      • 1970-01-01
      • 2017-08-06
      • 2021-08-10
      • 2022-01-21
      • 2022-11-30
      相关资源
      最近更新 更多