从php获取用Ajax发送的数据?

时间:2019-05-20 14:03:29

标签: javascript php json ajax

很抱歉,是否已被多次询问,但我无法正常工作。 我正在尝试建立一个宁静的网站,我有一个简单的表格:

<form action="/my/path" method="post" id="myformid">
Name <input type="text" name="name">
<input type="submit" value="Test">
</form>

我使用Javascript转换用户输入的数据,然后使用Ajax将它们发送到我的php文件中:

function postData() {
    $('#myformid').on('submit', function(event) {
        event.preventDefault();
        const json = JSON.stringify($("#myformid").serializeArray());
        $.ajax({
            type: "POST",
            url: "/my/path",
            data: json,
            success: function(){},
            dataType: "json",
            contentType : "application/json"
        });
    });
}

我试图像这样读取php上的数据:

$data = json_decode(file_get_contents('php://input'), true);
$name = $data["name"];

如果我使用Postman之类的工具在请求正文中发送JSON,则代码可以正常工作,但是从我使用Ajax测试的结果来看,JSON数据作为POST数据到达,并且可以使用$ _POST [“ name”]进行读取,但不能像我一样使用'php:// input'。

我该如何解决它,以便即使通过Javascript发送也可以接受JSON?

4 个答案:

答案 0 :(得分:0)

嗨,您可以这样尝试:

首先,我对每个输入都使用id属性,我确实不希望序列化内容,但是那是我,您可以按照自己的方式来做,这里是文件。 您的index.php:

 <form method="post" id="myformid">
  Name :<input type="text" id="name" name="name">
  <input type="submit"  value="Test">
  </form>
  <br>
  <div id="myDiv">
  </div>

您的JavaScript:

  //ajax function return a deferred object
    function _ajax(action,data){
      return $.ajax({
        url: 'request.php',
        type: 'POST',
        dataType: 'JSON',
        data: {action: action, data: data}
      })
    }
    //your form submit event
    $("#myformid").on('submit', function(event) {
      //prevent post
      event.preventDefault();
      //validate that name is not empty
      if ($("name").val() != "") {
        //parameters INS is insert data is the array of data yous end to the server
        var action = 'INS';
        var data = {
          name: $("#name").val()
        };
        console.log(data);
        //run the function and done handle the function
        _ajax(action,data)
        .done(function(response){
          console.log(response);
          //anppend name to the div
          $("#myDiv").append("<p>"+response.name+"</p>");
        });
      }
    });

您的request.php文件:

<?php
//includes and session  start here
//validate that request parameters are set
if (isset($_POST["action"]) && isset($_POST["data"])) {
  //getters
$action = $_POST["action"];
$data = $_POST["data"];
//switch to handle the action to perfom maybe you want to update with the form too ?
switch ($action) {
  case 'INS':
    // database insert  here..
    //return a json object
    echo json_encode(array("name"=>$data["name"]));
    break;
}
}
 ?>

结果:

enter image description here

希望对您有帮助=)

答案 1 :(得分:-1)

您可以直接在ajax请求中设置表单序列化以发送参数

function postData() {
    $('#myformid').on('submit', function(event) {
        event.preventDefault();

        $.ajax({
            type: "POST",
            url: "/my/path",
            data: $("#myformid").serialize(),
            success: function(){},
            dataType: "json",
            contentType : "application/json"
        });
    });
}

您可以使用 $ _ POST

在您的PHP中获得POST
print_r($_POST);

答案 2 :(得分:-1)

来自.serializeArray()的{​​{3}}。

  

.serializeArray()方法创建一个JavaScript对象数组,准备将其编码为JSON字符串。

在同一页中给出的示例中,很明显,您将在php中获得一个数组, 要访问元素,您应该尝试-

`$data[0]['name']`

另外,您是否尝试过print_r($ data),它是否为NULL?

答案 3 :(得分:-1)

更改您的Ajax代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/drawer2"
        android:fitsSystemWindows="true"
        tools:context="com.example.myproject.ContentActivity">
    <android.support.design.widget.CoordinatorLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
    >
    <android.support.design.widget.AppBarLayout
            android:id="@+id/appBar"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:theme="@style/AppTheme.AppBarOverlay"
            android:fitsSystemWindows="true">

        <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsingToolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_scrollFlags="scroll|exitUntilCollapsed"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginStart="48dp"
                app:expandedTitleMarginEnd="64dp"
                app:title="Устройство автомобиля">

            <ImageView
                    android:id="@+id/toolbarImage"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="centerCrop"
                    android:fitsSystemWindows="true"
                    android:src="@drawable/b320382"
                    app:layout_collapseMode="parallax" />

            <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:minHeight="?attr/actionBarSize"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin" />
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:id="@+id/texttest"
              android:paddingStart="14dp"
              android:paddingEnd="14dp"
              android:textSize="16sp"
              android:textColor="@android:color/black"
              android:textAppearance="@android:style/TextAppearance.Small"/>
    </android.support.v4.widget.NestedScrollView>
    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@color/white"
            app:itemIconTint="@color/darkgray"
            app:itemTextColor="@color/darkgray"
            app:menu="@menu/drawermenu"
            android:fitsSystemWindows="true"
            android:id = "@+id/nav2"
            android:layout_gravity = "start"
            app:headerLayout="@layout/header"
            tools:ignore="MissingConstraints">
    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

还需要对表单进行一些更改

$('#btnSubmit').on('click', function(event) {
    event.preventDefault();
    $.ajax({
        type: "POST",
        url: "/new.php",
        data: $("#myformid").serialize(),
        dataType: "json",
        success: function(response) {
            console.log(response);
        }
    });
});

您可以在<form action="new.php" method="post" id="myformid"> Name <input type="text" name="name"> <input id="btnSubmit" type="button" value="Test"> 这样的php文件中获取POST数据