【问题标题】:Return response from PHP to Jquery using Ajax使用 Ajax 从 PHP 向 Jquery 返回响应
【发布时间】:2016-01-20 11:46:33
【问题描述】:

我正在使用 Jquery/AJAX 和 PHP 提交要保存在 MySQL 数据库中的信息。 这是我到目前为止所做的:

function Addinfo() {
    var ew = document.getElementById("ew").value;
    var mw = document.getElementById("mw").value;
    var dataString = 'ew1=' + ew + '&mw=' + mw;
    if (ew == '' || mw == '') {
        alert("Please Fill All Fields");
    } else {
        $.ajax({
            type : "POST",
            url : "ajaxadd.php",
            data : dataString,
            dataType : 'text',
            cache : false,
        })
        .done(function (data) {
            $('#message1').html(data);
        })
    }
    return false;
}

还有我的 PHP 代码:

<?php
$ew2 = $_POST['ew1'];
$mw2 = $_POST['mw1'];
$connection = mysql_connect("localhost", "root", "");
$db = mysql_select_db("tp", $connection);
if (isset($_POST['ew1'])) {
    $query = mysql_query("insert into table(ew, mw) values ('$ew2', '$mw2')");
    $addresult = mysql_query("SELECT * FROM `table` WHERE `ew` = '" . $_POST['ew1'] . "' ORDER BY `id` DESC LIMIT 1");
    $aircraft = mysql_fetch_assoc($addresult);
    echo $aircraft;
}
mysql_close($connection); // Connection Closed
?>

它成功地将信息保存到数据库中,但我什至无法获得成功消息,更不用说来自 PHP 的变量了。我已经阅读了无数关于异步调用、回调函数和承诺的帖子,但不知何故我无法让它工作。任何帮助将不胜感激。

【问题讨论】:

  • $aircraft 将是一个数组,您使用的是echo 而不是print_r()。试试print_r();
  • @AnkiiG 谢谢。我刚才试过了,但我仍然无法得到回应。
  • 只使用简单的成功消息而不是 print_r。
  • 你真的应该为你的 SQL 使用准备好的语句。就你现在的代码而言,你很容易受到 SQL 注入攻击
  • @RoryMcCrossan 我明白了,我是一个完整的初学者,所以我完全忽略了任何安全问题。谢谢,我会在稍后阶段研究它。

标签: javascript php jquery mysql ajax


【解决方案1】:

Jquery:(main.js 文件)

$(document).ready(function(){

    $('.ajaxform').on('submit', function(e){
        e.preventDefault();

        $.ajax({
            // give your form the method POST
            type: $(this).attr('method'),
            // give your action attribute the value ajaxadd.php
            url: $(this).attr('action'),
            data: $(this).serialize(),
            dataType: 'json',
            cache: false,
        })
        .success(function(response) {
            // remove all errors
            $('input').removeClass('error').next('.errormessage').html('');

            // if there are no errors and there is a result
            if(!response.errors && response.result) {
                // success
                // loop through result and append values in message1 div
                $.each(response.result, function( index, value) {
                    $('#message1').append(index + ': ' + value + '<br/>');
                });

            } else {

                // append the error to the form
                $.each(response.errors, function( index, value) {
                    // add error classes
                    $('input[name*='+index+']').addClass('error').after('<div class="errormessage">'+value+'</div>')
                });

            }
        });

    });

});

PHP(ajaxadd.php 文件)

<?php
    // assign your post value
    $inputvalues = $_POST;

    // assign result vars
    $errors = false;
    $returnResult = false;

    $mysqli = new mysqli('host', "db_name", "password", "database");

    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }

    // escape your values
    foreach ($inputvalues as $key => $value) {
        if(isset($value) && !empty($value)) {
            $inputvalues[$key] = htmlspecialchars( $mysqli->real_escape_string( $value ) );
        } else {
            $errors[$key] = 'The field '.$key.' is empty';
        }
    }

    if( !$errors ) {

        // insert your query
        $mysqli->query("
            INSERT INTO `table`(`ew`, `mw`) 
            values ('".$inputvalues['ew1']."', '".$inputvalues['mw']."')
        ");

        // select your query
        // this is for only one row result
        $addresult = "
            SELECT * 
            FROM `table` 
            WHERE `ew` = '".$inputvalues['ew1']."' 
            ORDER BY `id` DESC
            LIMIT 1
        ";

        if( $result = $mysqli->query($addresult) ) {
            // collect results
            while($row = $result->fetch_assoc())
            {
                // assign to new array
                // make returnResult an array for multiple results
                $returnResult = $row;
            }
        }
    }

    // close connection
    mysqli_close($mysqli);

    // print result for ajax request
    echo json_encode(['result' => $returnResult, 'errors' => $errors]);

    exit;
?>

HTML:

<!doctype html>
<html class="no-js" lang="">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>Ajax form submit</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>


        <form class="ajaxform" action="ajaxadd.php" method="POST">

            <input type="text" name="ew1" />
            <input type="text" name="mw" />

            <button type="submit">Submit via ajax</button>

        </form>

        <div id="message1"></div>

        <script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>
        <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.12.0.min.js"><\/script>')</script>
        <script src="main.js"></script>
    </body>
</html>

【讨论】:

  • 我刚试过这个,由于某种原因它抛出了“填写所有字段”错误。
  • @Rahkal 我不确定如何查看结果,因为它没有显示,所以我绕过了 ajax 部分并直接提交到 php 文件。它显示了:array (size=0) empty boolean false boolean false
  • 我更改了字段验证的答案,因为您输入表单字段的名称会失败,您可以再试一次吗?
  • @Bruno 顺便说一句,您可以在控制台中查看任何 ajax 请求。打开您的控制台,然后转到网络选项卡。在这里您可以查看所有请求。
  • 感谢您的回答。它不会将数据添加到数据库中。正如您所建议的,在 Network 下的控制台中的响应显示“{"result":false,"error":null}"
【解决方案2】:
 $.ajax({
        type: "POST",
        url: "ajaxadd.php",
        ew1:ew,
        mw1:mw,
        data: dataString,
        dataType: 'text',
        cache: false,
    })

【讨论】:

  • 试试这个你不能在 jquery ajax 中设置 ew1 和 mw1 的值
  • 我不明白你的意思。
  • 他的意思是ew1mw1不是$.ajax的属性
【解决方案3】:

在你的PHP代码的末尾

echo $aircraft 将其更改为 echo json_encode($aircraft); 并在您提到的 AJAX 功能中

cache:false 包括success:function(response){alert response;}

它将在 AJAX 函数中为您的飞机变量值。 祝你好运!

【讨论】:

  • 在 Ajax 中,您必须将 dataType 设置为 'json'
  • 哦,是的。 dataType: "json",
  • 当您在 PHP 中提及 echo json_encode($aircraft); 时,请在其后提及 die;。像这样echo json_encode($aircraft); die;
【解决方案4】:

你应该修改你的 php 代码,而不是直接返回 mysql_fetch_assoc,因为它只返回你的 SQL 结果的第一行。

<?php
$ew2 = $_POST['ew1'];
$mw2 = $_POST['mw1'];
$connection = mysql_connect("localhost", "root", "");
$db = mysql_select_db("tp", $connection);

if (isset($_POST['ew1']))
{
    $result = array();
    $query = mysql_query("insert into table(ew, mw) values ('$ew2', '$mw2')");
    $addresult = mysql_query("SELECT * FROM `table` WHERE `ew` = '" . $_POST['ew1'] . "' ORDER BY `id` DESC LIMIT 1");
    while($aircraft = mysql_fetch_assoc($addresult))
    {
        $result[] = $aircraft;
    }
    #echo $aircraft; // wait until whole result is collected
    echo json_encode($result);
}

mysql_close($connection); // Connection Closed

?>

您还应该如下编辑您的 javascript 代码;

function Addinfo() {
    var ew = document.getElementById("ew").value;
    var mw = document.getElementById("mw").value;
    var dataString = 'ew1=' + ew + '&mw=' + mw;
    if (ew == '' || mw == '') {
        alert("Please Fill All Fields");
    } else {
        $.ajax({
            type : "POST",
            url : "ajaxadd.php",
            data : dataString,
            dataType : 'text',
            cache : false,
            success: function(data)
            {
                //$('#message1').html(data);
                alert(data);
            },
            error: function(data)
            {
                alert("Error");
            }
        });
    }
    return false;
}

另外建议您可以检查 $connection 和 $db 是否成功初始化数据库连接和数据库选择,并再次建议您的 php 代码您应该使用 mysqli 扩展而不是已弃用的 mysql 扩展。您可以将调用方法的 mysql 部分替换为 mysqli。此外,@RakhalImming 的建议对代码的安全性非常有用。

【讨论】:

  • 请在您的答案中转义任何帖子值
  • 我现在试了一下,查询成功了,但是还是没有得到任何响应。
  • @RakhalImming 是的,它应该被转义,但它不是那个问题的答案
  • @Bruno 请问您能否通过 F12 从浏览器提供您的 ajax 请求的控制台输出?
  • @Bruno 我已经编辑了我的答案,这可能对您的问题有用的信息
猜你喜欢
  • 2018-09-11
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
相关资源
最近更新 更多