You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jQuery提交表单至sorgu.php如何避免无限循环?是否有替代实现方案?

解决查询表单无限循环问题&优化实现方案

嘿,我来帮你搞定这个无限循环的问题,顺便给你几个更顺畅的实现思路~

先搞懂为什么会无限循环

你当前的sorgu.php里,每次页面加载(包括表单提交后的刷新)都会触发$(document).ready()里的代码,自动提交表单。而表单提交后页面会重新刷新,刷新后又会执行这段代码再次提交,这样就陷入了死循环。另外你定义的$count变量是全局的,但页面刷新后所有JS变量都会重置,所以$count++根本起不到阻止重复执行的作用。


快速修复现有代码的方案

我们可以通过判断请求类型或者添加标记参数来避免重复提交:

方案1:通过请求类型判断

修改sorgu.php里的jQuery代码,只在URL有key参数且当前请求是GET(不是表单提交的POST请求)时才自动提交:

<script type="text/javascript">
function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
    return vars;
}

$(document).ready(function(){
    const urlVars = getUrlVars();
    // 只有当存在key参数,且当前请求不是POST(表单提交是POST)时才执行提交
    if (urlVars["key"] && window.location.method !== 'POST') {
        $('#siparis_keyId').val(urlVars["key"]);
        $("#jsSorgula").submit();
    }
});
</script>

方案2:添加标记参数

在提交表单时给URL加一个submitted=1的标记,这样页面刷新后就能识别已经提交过,不再重复执行:

<script type="text/javascript">
function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
    return vars;
}

$(document).ready(function(){
    const urlVars = getUrlVars();
    // 存在key参数但没有submitted标记时才提交
    if (urlVars["key"] && !urlVars["submitted"]) {
        $('#siparis_keyId').val(urlVars["key"]);
        // 修改表单action,添加标记参数
        $("#jsSorgula").attr("action", "?submitted=1");
        $("#jsSorgula").submit();
    }
});
</script>

更优的实现方案(推荐)

其实你当前的实现绕了弯路,下面两种方案更简洁,还能提升用户体验:

方案1:用PHP直接处理参数,去掉JS自动提交

直接在sorgu.php的PHP代码里获取URL参数并执行查询,完全不需要JS介入:

<?php
// sorgu.php 顶部的PHP逻辑
$siparisKey = isset($_GET['key']) ? trim($_GET['key']) : '';
$orderResult = null;

// 如果有订单号,直接执行查询
if (!empty($siparisKey)) {
    // 这里写你的订单查询逻辑,比如从数据库获取数据
    // $orderResult = 你的查询结果;
}
?>

<!-- 页面内容 -->
<?php if (!$orderResult): ?>
<!-- 没有查询结果时显示表单 -->
<form action="" method="post" id="jsSorgula">
    <div class="row">
        <div class="col-lg-12 col-md-12">
            <div class="form-group">
                <input type="text" name="siparis_key" id="siparis_keyId" 
                       placeholder="<?php echo $dil['sipariskodu'] ?>" 
                       class="form-control" required 
                       value="<?php echo htmlspecialchars($siparisKey); ?>">
            </div>
        </div>
        <div class="col-lg-12 col-md-12">
            <button type="submit" class="btn btn-primary btn-block"><?php echo $dil['sorgula'] ?></button>
        </div>
    </div>
</form>
<?php else: ?>
<!-- 查询到结果时显示订单信息 -->
<div class="order-details">
    <!-- 这里渲染订单结果,比如: -->
    <h3>Sipariş Bilgileri</h3>
    <p>Sipariş Kodu: <?php echo htmlspecialchars($siparisKey); ?></p>
    <!-- 其他订单信息 -->
</div>
<?php endif; ?>

这种方式逻辑清晰,完全避免了JS的循环问题,还更高效。

方案2:用AJAX实现无刷新查询

修改header.php里的点击事件,直接用AJAX提交查询,不用跳转到sorgu.php,提升用户体验:

$("#siparis_Sorgula").click(function(e){
    e.preventDefault(); // 阻止默认的跳转行为
    const siparisKey = $('#siparis_key').val().trim();
    
    // 先验证输入
    if (!siparisKey) {
        alert("Lütfen Sipariş Kodunu Giriniz");
        return;
    }

    // 发送AJAX请求
    $.ajax({
        url: "sorgu.php",
        method: "POST",
        data: { siparis_key: siparisKey },
        success: function(response) {
            // 把查询结果展示在模态框里,替换原来的表单区域
            $("#srcModal .searchForm").replaceWith(response);
        },
        error: function() {
            alert("Sorgu sırasında bir hata oluştu");
        }
    });
});

然后修改sorgu.php,当收到POST请求时直接返回查询结果的HTML片段:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $siparisKey = isset($_POST['siparis_key']) ? trim($_POST['siparis_key']) : '';
    $orderResult = null;
    
    if (!empty($siparisKey)) {
        // 执行查询逻辑
        // $orderResult = ...;
    }

    // 返回结果HTML
    if ($orderResult) {
        echo '<div class="order-result">
                <h3>Sipariş Bulundu!</h3>
                <p>Kod: '.htmlspecialchars($siparisKey).'</p>
                <!-- 其他结果 -->
              </div>';
    } else {
        echo '<div class="alert alert-danger">Sipariş bulunamadı!</div>';
    }
    exit;
}

// 非POST请求时显示原表单和页面内容
// ... 原来的sorgu.php代码
?>

内容的提问来源于stack exchange,提问作者Muhammet Sinan Korkut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:42:33