【问题标题】:AJAX form wont postAJAX 表单不会发布
【发布时间】:2012-01-19 21:29:13
【问题描述】:

大家好,我正在尝试在不重新加载页面的情况下提交表单,这对于 AJAX 来说似乎很简单,但我似乎无法对我的数据库进行任何更改。如果 AJAX 成功,我在我的 javascript 中设置了一个警报,它似乎每次都会触发,所以我认为变量确实是从 AJAX 发送出去的,但是当我进入 join.php 时,我不要认为它记得,因此不能正确处理。

首先,这里是相关的script.js:

$(document).ready(function () {
    //----SUBMIT---//
    $(".submit").click(function () {
        // validate and process form here  

        $('.error').hide();
        var studentEmail = $("input#studentEmail").val();
        if (studentEmail == "") {

            $("label#studentEmail_error").show();
            $("input#studentEmail").focus();
            return false;
        }

        var studentPassword = $("#studentPassword").val();
        var parentEmail = $("#parentEmail").val();
        var parentPassword = $("#parentPassword").val();
        var studentFirstName = $("#studentFirstName").val();
        var studentLastName = $("#studentLastName").val();
        var studentPhone = $("#studentPhone").val();
        var parentFirstName = $("#parentFirstName").val();
        var parentLastName = $("#parentLastName").val();
        var parentPhone = $("#parentPhone").val();


        var dataString = 'studentEmail=' + studentEmail 
                         + '&studentPassword=' + studentPassword 
                         + '&parentEmail=' + parentEmail 
                         + '&parentPassword=' + parentPassword 
                         + '&studentFirstName=' + studentFirstName 
                         + '&studentLastName=' + studentLastName 
                         + '&studentPhone=' + studentPhone 
                         + '&parentFirstName=' + parentFirstName 
                         + '&parentLastName=' + parentLastName 
                         + '&parentPhone=' + parentPhone;

        alert(dataString);

        $.ajax({
            type: "POST",
            url: "join.php",
            data: dataString,
            success: function () {
                alert("success");
            }
        });
        return false;
    });
});

然后加入.php

if($_POST) {
    $studentEmail=$_POST['studentEmail'];
    $studentPassword=$_POST['studentPassword'];
    $parentEmail=$_POST['parentEmail'];
    $parentPassword=$_POST['parentPassword'];
    $studentFirstName=$_POST['studentFirstName'];
    $studentLastName=$_POST['studentLastName'];
    $studentPhone=$_POST['studentPhone'];
    $parentFirstName=$_POST['parentFirstName'];
    $parentLastName=$_POST['parentLastName'];
    $parentPhone=$_POST['parentPhone'];

    //create database connection
    $connection = mysql_connect("localhost","XXXX","XXXX"); 
        //in case database connection fails
        if(!$connection) {
            die("Database connection failed: ".mysql_error());
        }

        else{

        //select database to use
        $db_select = mysql_select_db("XXXX",$connection); 
            //in case database selection fails
            if (!$db_select) { 
                die("Database selection failed: " . mysql_error()); 
            } 

            else {

            //make sql query
              $sql = "INSERT INTO clients (`studentEmail`, 
                                                   `studentPassword`, 
                                                   `parentEmail`, 
                                                   `parentPassword`,
                                                   `studentFirstName`, 
                                                   `studentLastName`, 
                                                   `studentPhone`, 
                                                   `parentFirstName`, 
                                                   `parentLastName`, 
                                                   `parentPhone`)
                    VALUES ('".$studentEmail."', 
                            '".$studentPassword"', 
                            '".$parentEmail."', 
                            '".$parentPassword."', 
                            '".$studentFirstName."', 
                            '".$studentLastName."', 
                            '".$studentPhone."', 
                            '".$parentFirstName."', 
                            '".$parentLastName."', 
                            '".$parentPhone."')";

                //set results to variables
                $result = mysql_query($sql);

                //in case query fails
                if (!$result) { 
                    die("Database query failed: " . mysql_error()); 
                } 
            }
        }

}

else {
    echo "FAIL";
}

【问题讨论】:

  • 我知道这并不能回答您的问题,但是在 jQuery 中获取表单数据的一种简单方法是使用 $('yourForm').serialize()。以为我会传递小费。

标签: php javascript mysql ajax post


【解决方案1】:

尝试将$.post() 调用更改为:

$.ajax({
    type: "POST",
    url: "join.php",
    data: dataString,
    success: function(data) {
      alert ("Success: "+ data);
    }
});

并且,在 PHP 代码的开头,放置:

var_dump($_POST);

这样,警报消息将显示从 PHP 接收到的数据。

更新:

由于我看到这里没有人看到该代码存在最大的安全风险,因此我在此处添加它:

在将其添加到查询中之前,请务必将帖子中的每个字符串都传递到mysql_real_escape_string()

如果有人将此作为他的电子邮件地址发布怎么办??:

'); DROP TABLE clients; -- 

更新:

我仔细检查了 jQuery.ajax()jQuery.post() 的文档。虽然.post() 只是.ajax() 的快捷方式,但它们的语法不同:

jQuery.post( url [, data] [, success(data, textStatus, jqXHR)] [, dataType] )
jQuery.ajax( settings )

(上面也更新了代码)。

更新:

试试这个代码,它应该“开箱即用”:

JavaScript:

$(document).ready(function(){
    $(".submit").click(function() {  

        $('.error').hide();  
        var studentEmail = $("input#studentEmail").val();  
        if (studentEmail == "") {  
            $("label#studentEmail_error").show();  
            $("input#studentEmail").focus();  
            return false;  
        }

        var dataString = {
            studentEmail : studentEmail,
            studentPassword : $("#studentPassword").val(),
            parentEmail : $("#parentEmail").val(),
            parentPassword : $("#parentPassword").val(),
            studentFirstName : $("#studentFirstName").val(),
            studentLastName : $("#studentLastName").val(),
            studentPhone : $("#studentPhone").val(),
            parentFirstName : $("#parentFirstName").val(),
            parentLastName : $("#parentLastName").val(),
            parentPhone : $("#parentPhone").val(),
        };

        $.ajax({
            type: "POST",
            url: "join.php",
            data: dataString,
            success: function(data) {
                alert ("success: "+ data);
            }
        });

        return false;
    });
});

PHP 代码

var_dump($_POST);
echo "\n\n"; // Some white space here

if($_POST) {
    $connection = mysql_connect("localhost","XXXX","XXXX"); 
    if(!$connection) {
        die("Database connection failed: ". mysql_error());
    }
    if (!mysql_select_db("XXXX",$connection)) { 
        die("Database selection failed: " . mysql_error()); 
    }

    // Read data from POST
    $studentEmail       = mysql_real_escape_string($_POST['studentEmail']);
    $studentPassword    = mysql_real_escape_string($_POST['studentPassword']);
    $parentEmail        = mysql_real_escape_string($_POST['parentEmail']);
    $parentPassword     = mysql_real_escape_string($_POST['parentPassword']);
    $studentFirstName   = mysql_real_escape_string($_POST['studentFirstName']);
    $studentLastName    = mysql_real_escape_string($_POST['studentLastName']);
    $studentPhone       = mysql_real_escape_string($_POST['studentPhone']);
    $parentFirstName    = mysql_real_escape_string($_POST['parentFirstName']);
    $parentLastName     = mysql_real_escape_string($_POST['parentLastName']);
    $parentPhone        = mysql_real_escape_string($_POST['parentPhone']);

    $sql = "INSERT INTO clients ".
        "(`studentEmail`, `studentPassword`, `parentEmail`, `parentPassword`, ".
        "`studentFirstName`, `studentLastName`, `studentPhone`, `parentFirstName`, ".
        "`parentLastName`, `parentPhone`) ".
        " VALUES ('$studentEmail', '$studentPassword', '$parentEmail', ".
        "'$parentPassword', '$studentFirstName', '$studentLastName', ".
        "'$studentPhone', '$parentFirstName', '$parentLastName', '$parentPhone')";

    $result = mysql_query($sql);
    if ($result) { 
        echo "Database query successful!";
    }
    else {
        die("Database query failed: " . mysql_error()); 
    } 
}

【讨论】:

  • 这不仅是一个安全漏洞,而且在将撇号提交到表单字段的任何地方都可能导致随机问题。这就是为什么绝对强制转义值的原因。无论如何,您是否按照我的建议尝试添加调试代码?
  • 很抱歉回复缓慢。由于某种原因,Stackoverflow 不允许我登录。无论如何,这行得通!非常感谢您的帮助,这个问题已经让我发疯了好几天。我也很欣赏额外的安全信息。我还是不太确定我做错了什么,你能再解释一下吗?
  • 我猜这是 mysql 查询由于某种原因失败(缺少引号将是一个有效的原因!)所以记录不会被存储。无论如何,现在它也更容易调试,因为来自 php 脚本的所有回显数据都返回到 JavaScript,所以你可以在警报中显示它/在某个地方的 div 内/...现在,作业:尝试使用类似for 循环,以便在 php 脚本的中心部分删除所有这些重复..
【解决方案2】:

你有一个mysql错误,没有引号:

更正:

$sql = "INSERT INTO clients (`studentEmail`, `studentPassword`, `parentEmail`, `parentPassword`, `studentFirstName`, `studentLastName`, `studentPhone`, `parentFirstName`, `parentLastName`, `parentPhone`)
                        VALUES ('".$studentEmail."', '".$studentPassword"', '".$parentEmail."', '".$parentPassword."', '".$studentFirstName."', '".$studentLastName."', '".$studentPhone."', '".$parentFirstName."', '".$parentLastName."', '".$parentPhone."')";

【讨论】:

  • 是的,说得好。。这更可能是与服务器端相关的问题,而不是客户端问题。。
  • 顺便说一句,我希望您知道如何在查询中使用字符串之前对其进行清理..
  • 我在不久前的某个时候做过这个,但这不是问题。我已经用这个新的 sql 更新了它
  • 我的sql是在mysql工作台上工作的,所以我真的觉得是别的东西。
【解决方案3】:

您是否尝试过使用虚拟值的脚本以确保其正常工作。

您可以从 sql 中删除引号 ("") 并替换为 '$variable',这会将整个查询转换为字符串。

join.php是否在同一目录下?

您是否在开发者工具中抛出了跨域错误?如果是这样,您可能必须使用 jQuery 解决方法。

【讨论】:

  • 是的,我尝试删除引号并输入实际值,但它仍然没有通过它们。此外,它位于同一目录中。我不确定你对上一个问题的看法。
  • ajax 有时无法发布到同一服务器上的文件,并可能引发异常 101 错误。如果您有像 firebug 或 chrome 内置的开发人员工具。当你触发函数时,你可以观察 js 端发生了什么。它将记录错误。如果这是问题,jQuery 有一个解决方法。 (不过我不熟悉。)
【解决方案4】:

无论实际 PHP 代码是否执行,只要收到响应,您的警报都应该触发。

我会尝试在您的 if($_POST) 语句之前放置一个 'echo "TEST"' 语句以进行调试。继续弄乱这个方法,直到你弄清楚你的代码到底在哪里失败。如果它仍然没有执行 POST,请检查 join.php 的文件路径并确保它在同一目录中。

另外,您是尝试在本地执行此操作还是托管在 Web 服务器上?

另一个注意事项,您应该在发布之前在用户输入上使用 encodeURI(..),这是一种良好的做法。

这是生成数据字符串的方式的重构,请考虑:

//create an object
var dataObj = {};

//get inputs from form with id = formID
//for each input, add a property matching the input id to the dataObj and store the value of the field as the value for that property.
$("#formID :input").each( function (this) {

    var id = this.attr(id); //might be a bit off
    var val = this.val();   //same here

    dataObj[id] = encodeURI(val);

});

语法可能有点不对劲,有一段时间没有这样做了。

【讨论】:

  • 是的,也可以迭代一些东西来清理一下代码。代码应该是这样的:$('#formID').find('input,select,textarea').each(function(){ var id=$(this).attr('id'); var val=$(this).val(); dataObj[id] = val; })encodeURI() 是自动应用的)
  • 更好的是,你可以使用 jQuery 的 Serialize 函数。 api.jquery.com/serialize
  • 我不太确定在哪里放置警报,因为用户从来没有看到 join.php,数据只是通过那里处理的。如果我无处可呼,我怎么能看到那个时候有哪些变量?
  • 另外,这是托管在网络服务器上,而不是本地
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
相关资源
最近更新 更多