使用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
相关产品推荐
相关产品推荐

