【问题标题】:PHP & jQuery form submission issuePHP & jQuery 表单提交问题
【发布时间】:2026-01-11 13:30:01
【问题描述】:

我正在创建网站项目,您可以在帖子发布后对其进行编辑。我已经使用 PHP、SQL 和 jQuery 创建了网站,所有发布到该网站的帖子都通过 while 循环(不包括在此问题内容中)输出到网站“提要”。所有帖子在发布时(在数据库中)都有一个唯一的 ID。

我现在遇到的问题是第二种形式(post__edit)根本没有提示。

我发现我需要在 <input type="hidden" value="$postID"> 字段中传递帖子的 ID。下面的这个表单只是提示实际的 post_edit 表单,该表单用于提交帖子更改。

echo '
 <form method="post"> 
   <button type="button" class="post__editBtn">Edit post</button> 
   <input type="hidden" name="post__editHidden" value="'.$postID.'">
 </form>';

当按钮类:post__editBtn 被点击时,会触发一个 jQuery 点击事件监听器,该事件监听器会以淡入淡出的形式 (post_edit) 让您对帖子进行更改并提交。

$('.post__editBtn').click(function() {
    $('.post__edit').fadeIn();
});

然后我有一个 PHP if 语句,用于检查隐藏值是否已设置。如果有,那么我会回显之前隐藏的表单,并分配一个 SESSION 变量,以便稍后在执行 UPDATE 查询时使用。

if(isset($_POST['post__editHidden'])) {
  $_SESSION['post__editHidden'] = $_POST['post__editHidden'];

  echo'
  <form method="post" action="../../php/includes/updatePost.php" class="post__edit">
   <input type="text" name="postTitle" placeholder="Edit title" required>
   <textarea name="postMsg" maxlength="255" placeholder="Edit message" required></textarea>
   <button type="submit">Edit Post</button>
   <button class="post__edit-close">Close</button>
  </form>';
 }

总结

  • 第一个表单为正确的帖子触发 jQuery 淡入效果(使用 $postID
  • jQuery 只是以第二种形式淡出 (post__edit)
  • 第二种形式 (post__edit) 采用 post__editHidden 值(正确帖子的正确 ID)并将其分配给 SESSION 变量,该变量以后可用于进行 SQL UPDATE 查询,当最终提交第二个表单(到 updatePost.php)时运行。

我相信因为我将第一个表单按钮设置为type="button",所以它不会提交表单,所以isset($_POST['post__editHidden'] 不会运行。但是,如果我将按钮更改为正常的提交类型,那么第一个表单就会出现并重新加载它所在的页面。我可以在我的 jQuery fadeIn 中只使用 e.preventDefault,但我不知道这是否有效。

我对 PHP 和 SQL 很陌生,所以我可能全都错了。还是谢谢!

【问题讨论】:

  • 隐藏输入的表单中没有提交按钮。
  • 所有 php 和初始 HTML 表单都在同一个页面中? php_self ?
  • @Bilel 两个 HTML 表单都在同一个页面上(在同一个 php 脚本中),它们在 while 循环中输出,该循环检查数据库表中的帖子,然后显示所有帖子。
  • @Barmar 是的,我在帖子中说过。如果我有一个类型为 submit 的按钮,那么页面只会重新加载并且不会显示辅助表单。但我不知道如何更好地构建脚本。
  • 有不同的方法来解决它......比如通过向表单添加 Id 并使用 On submit 方法处理......

标签: php jquery sql forms


【解决方案1】:

与其说是答案,不如说是建议的替代方案。


会话变量的使用在我们可以混淆 ID 值或在孤立(断开连接)导航级别重用它的其他情况下会更有用...

但在这种情况下,我最好只使用一个表单并使用 Ajax 填充它的输入值。

此演示仅更新 postId' 32 的值...当它与获取 Id 并返回其 jSon 对象的功能性动态 ajax 处理程序一起使用时,它应该可以工作。

$('.post__editBtn').click(function() {
var myform = $('.post__edit');
var postId=$(this).attr('data-id');
    myform.find("input[name='post__editHidden']" ).val(postId);    
    
    $.ajax({
        type: "GET",
        dataType: "json",
        url: "https://api.myjson.com/bins/kx5xs", // replace with php later
        data: {id: postId},
        success: function(data) {
           myform.find("input[name='postTitle']" ).val(data[0].title);
          myform.find("textarea[name='postMsg']" ).val(data[0].content);
        },
        error : function(){
           alert('Some error...!');
        }
    });
    
    $('.post__edit').fadeIn();
    
    
    //for demo puropose to show the new value in the update form:
    console.log($(".post__edit input[name='post__editHidden']").val());
});
.post__edit{
display:none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class"post">
   Post 30<button type="button" data-id="30" class="post__editBtn">Edit post</button> 
   </div>
<div class"post">   
   Post 32<button type="button" data-id="32" class="post__editBtn">Edit post</button> 
</div>   
<div class"post">
     Post 37 <button type="button" data-id="37" class="post__editBtn">Edit post</button> 
</div>      
   <!--all data-id values would be replaced with '.$postID.' in the php loop-->
 
 <form method="post" action="../../php/includes/updatePost.php" class="post__edit">
   <input type="text" name="postTitle" placeholder="Edit title" required>
   <textarea name="postMsg" maxlength="255" placeholder="Edit message" required></textarea>
   <button type="submit">Save Post</button>
   <button class="post__edit-close">Close</button>
    <input type="hidden" name="post__editHidden" value="">
  </form>

我们添加了一个文件 ex:ajax.php,我们用 ajax 调用它,我们在其中获取一个 ID,我们确实从数据库中获取该记录以返回我们的 json。像这样的东西:

<?php

$id=$_GET['id'];
$stmt = $conn->query("SELECT title,content * FROM posts WHERE postId=$id LIMIT 1");
$result=...
echo json_encode($result);

要获得这样的json:

{"id": "32","title": "POst 32","content": "POst 32 talks about HiTECH"}

【讨论】:

  • Thx 只需将第一个表单按钮更改为包含 data-id=$postID ,然后通过 jQuery 找到 data-id 并将其值添加到空输入 type="hidden" 字段即可.再次感谢!
  • 很高兴它有帮助!我建议的是一种不同的表单处理方法。祝你好运:)