Php 如果没有设置正确的action属性,下面的代码是如何工作的?

Php 如果没有设置正确的action属性,下面的代码是如何工作的?,php,jquery,ajax,Php,Jquery,Ajax,我有一个代码,在一个名为service.php的文件中,它的作用如下: if ((!empty($_POST)) && ($_POST['action'] == 'addRunner')) { // Code to add entry into database } function fail($message) { die(json_encode(array('status' => 'fail', 'message' => $message)))

我有一个代码,在一个名为
service.php
的文件中,它的作用如下:

if ((!empty($_POST)) && ($_POST['action'] == 'addRunner'))
{
    // Code to add entry into database
}

function fail($message) 
{
    die(json_encode(array('status' => 'fail', 'message' => $message)));
}
function success($message) 
{
    die(json_encode(array('status' => 'success', 'message' => $message)));
}
使用AJAX通过POST方法发送数据的文件为:

$("#btnSave").click(function() 
{
    var data = $("#addRunner :input").serialize();

    $.post($("#addRunner").attr('action'), data, function(json)
    {
        if(json.status == 'fail')
            alert(json.message);

        if(json.status == 'success')
        {
            alert(json.message);
            clearInputs();
        }
    },"json");
});
表单
#addRunner
的操作属性为:

<form action="service.php" id="addRunner" name="addRunner" method="POST">
    <!-- Form Elements -->
</form>
我的jQuery是:

$(document).ready(function(){

    var FREQ = 10000 ;
    var repeat = true;

    function showFrequency(){
        $("#freq").html( "Page refreshes every " + FREQ/1000 + " second(s).");
    }

    function startAJAXcalls(){

        if(repeat){
            setTimeout( function() {
                    getDBRacers();
                    startAJAXcalls();
                },  
                FREQ
            );
        }
    }

    function getXMLRacers(){
        $.ajax({
            url: "finishers.xml",
            cache: false,
            dataType: "xml",
            success:  function(xml){

                $('#finishers_m').empty();
                $('#finishers_f').empty();
                $('#finishers_all').empty();

                $(xml).find("runner").each(function() {
                    var info = '<li>Name: ' + $(this).find("fname").text() + ' ' + $(this).find("lname").text() + '. Time: ' + $(this).find("time").text() + '</li>';
                    if( $(this).find("gender").text() == "m" ){
                        $('#finishers_m').append( info );
                    }else if ( $(this).find("gender").text() == "f" ){
                        $('#finishers_f').append( info );
                    }else{  }
                    $('#finishers_all').append( info );
                });

                getTimeAjax();
            }
        });
    }

    function getDBRacers()
    {
        $.getJSON("service.php?action=getRunners", function(json)
        {
            if(json.runners.length > 0)
            {
                $('#finishers_m').empty();
                $('#finishers_f').empty();
                $('#finishers_all').empty();

                $.each(json.runners, function() 
                {
                    var info = '<li>Name: ' + this['fname'] + ' ' + this['lname'] + '. Time: ' + this['time'] + '</li>';
                    if(this['gender'] == 'm')
                    {
                        $('#finishers_m').append(info);
                    }
                    else if(this['gender'] == 'f')
                    {
                        $('#finishers_f').append(info);
                    }
                    else {}

                    $('#finishers_all').append(info);
                });
            }
        });
        getTimeAjax();
    }

    function getTimeAjax(){
        var time = "";
        $.ajax({
            url: "time.php",
            cache: false,
            success: function(data){
                $('#updatedTime').html(data);
            }
        });
    }

    $("#btnStop").click(function(){
        repeat = false;
        $("#freq").html( "Updates paused." );
    });

    $("#btnStart").click(function(){
        repeat = true;
        startAJAXcalls();
        showFrequency();
    }); 

    showFrequency();
    getDBRacers();
    startAJAXcalls();

    $("#btnSave").click(function() 
    {
        var data = $("#addRunner :input").serialize();

        $.post($("#addRunner").attr('action'), data, function(json)
        {
            if(json.status == 'fail')
                alert(json.message);

            if(json.status == 'success')
            {
                alert(json.message);
                clearInputs();
            }
        },"json");
    });

    function clearInputs()
    {
        $("#addRunner:input").each(function(){
            $(this).val('');
        });
    }

    $("#addRunner").submit(function() {
        return false;
    });

});
$(文档).ready(函数(){
var-FREQ=10000;
var repeat=true;
函数showFrequency(){
$(“#freq”).html(“页面每”+freq/1000+“秒刷新一次”);
}
函数startAJAXcalls(){
如果(重复){
setTimeout(函数(){
getDBRacers();
startAJAXcalls();
},  
频率
);
}
}
函数getXMLRacers(){
$.ajax({
url:“finishers.xml”,
cache:false,
数据类型:“xml”,
成功:函数(xml){
$('#finisher_m').empty();
$('#finisher_f')。空();
$(“#finisher_all”).empty();
$(xml).find(“runner”).each(函数(){
var info='
  • Name:'+$(this).find(“fname”).text()++'+$(this).find(“lname”).text()++'.Time:'+$(this.find(“Time”).text()++'
  • '; if($(this).find(“性别”).text()=“m”){ $('#finisher_m')。附加(信息); }else if($(this).find(“性别”).text()=“f”){ $('#finisher_f')。附加(信息); }else{} $('#finisher_all')。附加(信息); }); getTimeAjax(); } }); } 函数getDBRacers() { $.getJSON(“service.php?action=getRunners”,函数(json) { 如果(json.runners.length>0) { $('#finisher_m').empty(); $('#finisher_f')。空(); $(“#finisher_all”).empty(); $.each(json.runners,function() { var info='
  • 名称:'+this['fname']+'+this['lname']+'。时间:'+this['Time']+'
  • ; 如果(这个['gender']='m') { $('#finisher_m')。附加(信息); } else if(这个['gender']='f') { $('#finisher_f')。附加(信息); } else{} $('#finisher_all')。附加(信息); }); } }); getTimeAjax(); } 函数getTimeAjax(){ var-time=“”; $.ajax({ url:“time.php”, cache:false, 成功:功能(数据){ $('#updatetime').html(数据); } }); } $(“#btnStop”)。单击(函数(){ 重复=错误; $(“#freq”).html(“更新暂停”); }); $(“#btnStart”)。单击(函数(){ 重复=正确; startAJAXcalls(); showFrequency(); }); showFrequency(); getDBRacers(); startAJAXcalls(); $(“#btnSave”)。单击(函数() { var data=$(“#addRunner:input”).serialize(); $.post($(“#addRunner”).attr('action')、数据、函数(json) { 如果(json.status=='fail') 警报(json.message); 如果(json.status==“成功”) { 警报(json.message); clearInputs(); } }“json”); }); 函数clearInputs() { $(“#addRunner:input”)。每个(函数(){ $(this.val(“”); }); } $(“#addRunner”).submit(函数(){ 返回false; }); });
    最后,Service.php的内容是:

    <?php
    
        if ((!empty($_POST)) && ($_POST['action'] == 'addRunner'))
        {
            $fname = htmlspecialchars($_POST['txtFirstName']);
            $lname = htmlspecialchars($_POST['txtLastName']);
            $gender = htmlspecialchars($_POST['ddlGender']);
            $minutes = htmlspecialchars($_POST['txtMinutes']);
            $seconds = htmlspecialchars($_POST['txtSeconds']);
    
            if(preg_match('/[^\w\s]/i', $fname) || preg_match('/[^\w\s]/i', $lname)) 
            {
                fail('Invalid name provided.');
            }
            if( empty($fname) || empty($lname) ) 
            {
                fail('Please enter a first and last name.');
            }
            if( empty($gender) ) 
            {
                fail('Please select a gender.');
            }
            if( empty($minutes) || empty($seconds) ) {
                fail('Please enter minutes and seconds.');
            }
    
            $time = $minutes.":".$seconds;
            $query = "INSERT INTO runners SET first_name='$fname', last_name='$lname', gender='$gender', finish_time='$time'";
            $result = db_connection($query);
    
            if ($result) 
            {
                $msg = "Runner: ".$fname." ".$lname." added successfully" ;
                success($msg);
            } 
            else 
            { 
                fail('Insert failed.');
            } 
            exit;
        }
        else if($_GET['action'] == 'getRunners')
        {
    
            $query = "SELECT first_name, last_name, gender, finish_time FROM runners ORDER BY finish_time ASC";
            $result = db_connection($query);
    
            $runners = array();
    
            while($row = mysqli_fetch_array($result))
            {
                array_push($runners, array('fname' => $row['first_name'], 'lname' => $row['last_name'], 'gender' => $row['gender'], 'time' => $row['finish_time']));
            }
    
            echo json_encode(array("runners" => $runners));
            exit;
        }
    
        function db_connection($query)
        {
            $dbc = mysqli_connect('127.0.0.1','runner_db_user','runner_db_password','race_info')
                or die('Error connecting to Database');
    
            return mysqli_query($dbc,$query);
        }
    
        function fail($message) 
        {
            die(json_encode(array('status' => 'fail', 'message' => $message)));
        }
        function success($message) 
        {
            die(json_encode(array('status' => 'success', 'message' => $message)));
        }
    
    ?>
    

    它将起作用,原因是
    操作
    是隐藏字段中
    名称
    属性的值。这不是您的
    表单
    标记的操作。如果出于测试目的而想使其失败,则应在
    表单中将隐藏字段的值更改为其他值,然后再次检查

    这是你隐藏的领域

    <input type="hidden" id="action" name="action" value="addRunner">
    

    你知道:GET和POST之间的区别吗?@LuciaAngermüller是的,但这并不能解释如何将
    #addRunner
    的action属性从
    service.php
    更改为
    service.php?action=addRunners
    。请解释一下,这是因为你的jquery脚本。我不想把一切都告诉你,但是你可以通过POST将数据发送到GET地址。您应该查看jquery serialize、post等@LuciaAngermüller是否愿意详细说明这到底是如何发生的?如果我错了,请纠正我,但是
    $(“#addRunner”).attr('action')
    表示
    service.php
    的值,不是吗?隐藏字段的相关性如何?在哪里访问它的值?
    var data=$(“#addRunner:input”).serialize()您正在将此数据传递给ajax。您是对的,上面的jquery显示了
    service.php
    的值。因此,当您使用serialize时,它将获取
    表单中的所有输入字段和下拉列表。这就是隐藏字段值通过ajax的原因。因此,基本上,当我们编写
    $\u POST['action']
    时,它指的是名为
    action
    的隐藏字段的值,而不是表单元素的action属性,对吗。您的情况就是这样:)
    <input type="hidden" id="action" name="action" value="addRunner">
    
    <input type="hidden" id="action" name="action" value="addRunners">
    
    if ((!empty($_POST)) && ($_POST['action'] == 'addRunner'))