You need to enable JavaScript to run this app. PHP/JS新手求助:如何用Fetch实现无刷新提交对接PHP存库并同页展示
优惠活动
大模型
产品
解决方案
定价
更多

PHP/JS新手求助:如何用Fetch实现无刷新提交对接PHP存库并同页展示

无刷新发布推文功能落地步骤

现存核心断点

  • 前端fetch请求未声明Content-Type,PHP无法解析请求体
  • 控制器写死了测试字符串,未读取前端传递的真实内容
  • 前端收到响应后错误地把整个对象赋值给DOM元素,无法正常渲染文本

逐模块修改方案

1. 前端JavaScript 修正

替换原有代码为以下内容:

document.getElementById("submitTweet").addEventListener("click", postTweet);
function postTweet(e) {
  e.preventDefault();
  const inputEl = document.getElementById("postTweet");
  const showContainer = document.getElementById("tweet-value");
  const inputContent = inputEl.value.trim();

  // 空内容直接拦截,不发起请求
  if (!inputContent) return;

  const submitData = {
    body: inputContent
  };

  fetch("index.php?action=home", {
    method: "POST",
    headers: {
      "Content-Type": "application/json", // 关键配置:告知后端请求体格式
      Accept: "application/json"
    },
    body: JSON.stringify(submitData)
  })
    .then(res => res.json())
    .then(data => {
      // 数据库写入成功后,直接渲染返回的推文内容
      showContainer.textContent = data.tweet_text;
      // 提交完成清空输入框
      inputEl.value = "";
    })
    .catch(err => {
      console.error("提交异常:", err);
    });
}

注意:不要把整个数据对象直接赋值给innerHTML,否则会渲染出[object Object]的无效内容

2. PHP 控制器逻辑修正

替换原有写死测试值的代码,增加请求解析逻辑:

// 仅拦截对应action的POST请求,处理完成后终止后续流程
if (isset($_GET['action']) && $_GET['action'] === 'home' && $_SERVER['REQUEST_METHOD'] === 'POST') {
  // 读取原始请求流,PHP不会自动解析JSON格式的POST请求
  $rawRequest = file_get_contents('php://input');
  $requestBody = json_decode($rawRequest, true);

  // 内容校验
  $tweetText = trim($requestBody['body'] ?? '');
  if (empty($tweetText)) {
    header('Content-Type: application/json');
    echo json_encode(['success' => false, 'msg' => '发布内容不能为空']);
    exit;
  }

  // 调用数据层写入数据库,传入真实的推文内容
  $TweetRepository->postTweet($userId, $tweetText);

  // 返回JSON格式响应给前端,做XSS转义避免注入
  header('Content-Type: application/json');
  echo json_encode([
    'success' => true,
    'tweet_text' => htmlspecialchars($tweetText)
  ]);
  exit;
}

关键点:不要在接口响应中输出任何HTML内容,否则前端的res.json()会解析失败

3. 数据仓库层(Repository)适配

原有SQL逻辑不需要大改,仅补充参数校验提升健壮性:

public function postTweet($id_user, $tweet)
{
  $id_user = (int)$id_user;
  $tweet = trim($tweet);
  if ($id_user <= 0 || empty($tweet)) {
    throw new InvalidArgumentException('提交参数不合法');
  }

  $sql = "INSERT INTO tweet (ID_user, text, date) VALUES (:ID_user, :tweet, NOW())";
  $query = $this->connect()->prepare($sql);
  return $query->execute([
    "ID_user" => $id_user,
    "tweet" => $tweet,
  ]);
}

内容的提问来源于stack exchange,提问作者user14250585

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 14:06:07