【问题标题】:How to handle two ajax function with one button to pass variable to php form如何用一个按钮处理两个ajax函数以将变量传递给php表单
【发布时间】:2017-12-22 18:46:22
【问题描述】:

我有两个 javascripts 函数,用于传递两个不同的变量。第一个 javascript 是在下拉列表中传递区域,第二个是在第二个下拉列表中传递名称。现在我想在一个按钮内提交。下面是我的代码,它是部分工作的。当我将值传递给 php 时,它会运行两三次以获得结果,并得出错误的结果。我的 ajax 或 sql 查询有什么问题吗?

$(function() { 
	 $('#form').submit(function(e) { 
            e.preventDefault();
		var id=$(".area").val();
		var dataString = 'id='+ id;

            $.ajax({
                type        : 'POST',
                url         : 'LeaveRecord1.php',
                data        : dataString,
                
            })
            .done(function(data) {
                $('.results').html(data);    
            })
        });
    }); 
$(function() { 
	 $('#form').submit(function(e) { 
        e.preventDefault();
	  	var idd=$(".slct2").val();
		var dataStringg = 'idd='+ idd;
    
            $.ajax({
                type        : 'POST',
                url         : 'LeaveRecord1.php',
                data        : dataStringg,
                
            })
            .done(function(data) {
                $('.results').html(data);    
            })
     });
    }); 
<td><input type="submit"   name="report" class="report" id="report" onClick=" myFunction();"></td>

获取值的PHP文件

   $poarr =Array();
if (isset($_POST['id'])) {
    $sarea=$_POST['id'];
    $sql = "SELECT tblLeaveHeader.RefNo, tblLeaveHeader.StaffId, tblLeaveHeader.Branch, tblLeaveHeader.Remark, tblLeaveHeader.Createby, tblLeaveHeader.Approvedd, tblLeaveHeader.Approveby, tblLeaveHeader.AreaCode
     FROM tblLeaveHeader INNER JOIN tblStaff ON tblLeaveHeader.AreaCode = tblStaff.AreaCode AND tblLeaveHeader.StaffId = tblStaff.StaffId WHERE (tblLeaveHeader.AreaCode = '$sarea')";
};


if (isset($_POST['idd'])) {
$suser=strtoupper($_POST['idd']);
$sql = "SELECT tblLeaveHeader.RefNo, tblLeaveHeader.StaffId, tblLeaveHeader.Branch, tblLeaveHeader.AreaCode, tblLeaveHeader.Remark, tblLeaveHeader.Createdd, tblLeaveHeader.Createby, 
tblStaff.StaffName FROM tblLeaveHeader INNER JOIN tblStaff ON tblLeaveHeader.StaffId = tblStaff.StaffId AND tblLeaveHeader.AreaCode = tblStaff.AreaCode WHERE (tblStaff.StaffName = '$suser')";
 };
$link = odbc_connect(DB_HSATTEND, DB_USER, DB_PASS);
$res = odbc_exec($link,$sql); 
while ($row = odbc_fetch_array($res)) {
           $poarr[] = $row;
   } 

 odbc_free_result($res);
 odbc_close($link); 

【问题讨论】:

  • 为什么不在一个 Ajax 调用中同时传递两个参数?另外,你的两个异步调用会覆盖彼此的结果......
  • 当你在表单提交时写了两个 ajax,如果我没有错,你的 html 只有一个表单,所以 bot ajax 会调用
  • 我担心它不会起作用,因为它实际上是同时得到两个不同的值,当我调用选择区域时,只显示区域列表,如果调用名称只显示名称只有
  • 是的,它只是一种形式,所以当按钮被点击时,两个ajax都会被调用,但是当传递给sql时,它会循环两三次并得到结果。最初的结果是正确的,但之后那,它来了两个错误的结果或得到空的结果
  • 第一个js sn-p 有一些严重的代码异味。

标签: javascript php sql ajax


【解决方案1】:

你可以使用下面的ajax,但你必须根据这个重写你的php和sql。

$(function() { 
 $('#form').submit(function(e) { 
    e.preventDefault();
    var id=$(".area").val();
    var idd=$(".slct2").val();
    var dataString = 'id='+ id+'&idd='+idd;
        $.ajax({
            type    : 'POST',
            url     : 'LeaveRecord1.php',
            data    :  dataString,
            success : function(data) {
                $('.results').html(data);    
            },
        });
    });
}); 

你的PHP 代码应该是

<?php
$poarr =Array();
$empty = false;
if (isset($_POST['id'])) {
  $sarea=$_POST['id'];
  $sql = "SELECT tblLeaveHeader.RefNo, tblLeaveHeader.StaffId, tblLeaveHeader.Branch, tblLeaveHeader.Remark, tblLeaveHeader.Createby, tblLeaveHeader.Approvedd, tblLeaveHeader.Approveby, tblLeaveHeader.AreaCode
FROM tblLeaveHeader INNER JOIN tblStaff ON tblLeaveHeader.AreaCode = tblStaff.AreaCode AND tblLeaveHeader.StaffId = tblStaff.StaffId WHERE (tblLeaveHeader.AreaCode = '$sarea')";
  $link = odbc_connect(DB_HSATTEND, DB_USER, DB_PASS);
  $res = odbc_exec($link,$sql); 
  while ($row = odbc_fetch_array($res)) {
      $poarr[] = $row;
      $empty = true;
  } 
  odbc_free_result($res);
  if($empty){
        if (isset($_POST['idd'])) {
            $suser=strtoupper($_POST['idd']);
            $sql = "SELECT tblLeaveHeader.RefNo, tblLeaveHeader.StaffId, tblLeaveHeader.Branch, tblLeaveHeader.AreaCode, tblLeaveHeader.Remark, tblLeaveHeader.Createdd, tblLeaveHeader.Createby, tblStaff.StaffName FROM tblLeaveHeader INNER JOIN tblStaff ON tblLeaveHeader.StaffId = tblStaff.StaffId AND tblLeaveHeader.AreaCode = tblStaff.AreaCode WHERE (tblStaff.StaffName = '$suser')";
            $res = odbc_exec($link,$sql); 
            while ($row = odbc_fetch_array($res)) {
                $poarr[] = $row;
            } 
            odbc_free_result($res);
        }
    }
    odbc_close($link); 
}
?>

【讨论】:

  • 通过使用您建议的代码。它只能捕获一个sql查询。仅适用于名称,顺便说一下我应该如何修改我的sql,我发现它没有任何问题。你可以在任何地方推荐它吗?
  • 选择区域部分是正常的,但是到了名称部分。结果是与区域一结合在一起。是sql问题吗? (*by right area will get all 4 result,and the name will get 3 result *) but when select name it add up with the area result become 7 results display
  • 这意味着选择员工名称时,结果不会替换,但在区域 span>结果之后继续
【解决方案2】:

这是我的版本。根据我从您的解释中了解到,应适用以下原则:

  • 如果未选择组合框值,则显示警报:“请选择一个值”。
  • ...否则,如果在组合框“.areas”中仅选择了区域,则仅发布选定的区域值。
  • 否则(例如,如果在组合框“.names”中选择了名称),则仅发布选定的名称值。

如果您的真正意思是别的,那么请考虑一下并用更好的解释重新编辑您的问题。

请仔细阅读所有代码,因为我使用了我发现更好的名称和 ID。另请注意,我在 ajax 中使用了return false,而不再使用preventDefault()。此外,您的数据库代码缺少两个基本元素:

有关准备好的语句 + 异常处理(使用 mysqli)的完整示例,请参阅 THIS。你真的不想在没有它们的情况下继续编程;-)

index.php(带表格):

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Test</title>

        <script src="https://code.jquery.com/jquery-3.2.1.min.js" type="text/javascript" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
        <script src="index.js" type="text/javascript"></script>
    </head>
    <body>

        <form id="form" name="form" action="" method="post">
            <select id="area" name="area" class="area">
                <option value="">- Select area -</option>
                <option value="123">Area 1</option>
                <option value="456">Area 2</option>
                <option value="789">Area 3</option>
            </select>
            <select id="slct2" name="slct2" class="slct2">
                <option value="">- Select name -</option>
                <option value="John">John</option>
                <option value="Smith">Smith</option>
                <option value="Mikaela">Mikaela</option>
            </select>
            <input type="submit" name="report" class="report" id="report">
        </form>
        <br/><br/>
        <div class="results">
            Here comes the results...
        </div>

    </body>
</html>

index.js(带有 ajax):

$(document).ready(function () {
    $('#form').submit(function (e) {
        var areaCode = $(".area").val();
        var staffName = $(".slct2").val();
        var data = {};

        if (areaCode === '' && staffName === '') {
            alert('Please choose a value from selects!');
            return false;
        } else if (areaCode !== '' && staffName === '') {
            data.areaCode = areaCode;
        } else {
            data.staffName = staffName;
        }

        var ajax = $.ajax({
            method: 'post',
            dataType: 'html',
            url: 'LeaveRecord1.php',
            data: data
        });
        ajax.done(function (response, textStatus, jqXHR) {
            $('.results').html(response);
        });
        ajax.fail(function (jqXHR, textStatus, errorThrown) {
            $('.results').html(textStatus + '<br />' + errorThrown);
        });
        ajax.always(function (response, textStatus, jqXHR) {
            //...
        });

        return false;
    });
});

LeaveRecord1.php(处理表单值的地方):

<?php

$poarr = array();

if (isset($_POST['areaCode'])) {
    $areaCode = $_POST['areaCode'];
    $sql = "SELECT 
                tblLeaveHeader.RefNo,
                tblLeaveHeader.StaffId,
                tblLeaveHeader.Branch,
                tblLeaveHeader.Remark,
                tblLeaveHeader.Createby,
                tblLeaveHeader.Approvedd,
                tblLeaveHeader.Approveby,
                tblLeaveHeader.AreaCode 
            FROM tblLeaveHeader 
            INNER JOIN tblStaff ON 
               tblLeaveHeader.AreaCode = tblStaff.AreaCode 
               AND tblLeaveHeader.StaffId = tblStaff.StaffId 
           WHERE tblLeaveHeader.AreaCode = '" . $areaCode . "'";
} elseif (isset($_POST['staffName'])) {
    $staffName = strtoupper($_POST['staffName']);
    $sql = "SELECT 
                tblLeaveHeader.RefNo,
                tblLeaveHeader.StaffId,
                tblLeaveHeader.Branch,
                tblLeaveHeader.AreaCode,
                tblLeaveHeader.Remark,
                tblLeaveHeader.Createdd,
                tblLeaveHeader.Createby,
                tblStaff.StaffName 
            FROM tblLeaveHeader 
            INNER JOIN tblStaff ON 
                tblLeaveHeader.StaffId = tblStaff.StaffId 
                AND tblLeaveHeader.AreaCode = tblStaff.AreaCode 
            WHERE tblStaff.StaffName = '" . $staffName . "'";
}

$link = odbc_connect(DB_HSATTEND, MYSQL_USERNAME, MYSQL_PASSWORD);

while ($res = odbc_exec($link, $sql)) {
    do {
        while ($row = odbc_fetch_array($res)) {
            $poarr[] = $row;
        }
        odbc_free_result($res);
    } while (odbc_next_result($res));
}

odbc_close($link);

if (count($poarr) > 0) {
    echo '<pre>' . print_r($poarr, TRUE) . '</pre>';
} else {
    echo 'There are some errors somewhere :-(';
}

【讨论】:

  • 感谢您的帮助,但这里的问题是它有时会得到空结果,这意味着,有时 area 会得到结果,staffname 会出错而没有结果,它会发生在 area 或 results并给我这个错误“odbc_fetch_array() [function.odbc-fetch-array]: No tuples available at this result index”
  • 请努力告诉我们你想在表单中拥有什么,你想在ajax中拥有什么以及你想在LeaveRecord1.php中拥有什么,因为你所有的解释都令人困惑。一步一步做。像这样:在表单中我想选择这个或这个,在 ajax 中我想发送这个或这个。在 php sql 部分,我希望这样或这样发生。然后你得到了我们的帮助。否则,即使我们愿意,我们也无法帮助您。
  • 至少告诉我:我的表格正确吗?我的ajax正确吗?我的 LeaveRecord1.php 是否正确?
  • 到目前为止,如果正确的话,ajax 是正确的,但是 LeaveRecord1.php sql 看起来会像我以前的工作一样出现同样的问题
  • 这意味着有时结果可能会出现在区域或人员名称中,结果不会出现在两个地方,我不确定是否是 sql 捕获问题或任何其他可能的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多