本文目录导读:

我来给你详细讲解 PHP 和 HTMX 的结合使用,这是目前很流行的前后端交互方式。
什么是 HTMX?
HTMX 是一个轻量级的 JavaScript 库,允许你在 HTML 中直接使用属性来发送 AJAX 请求,无需编写复杂的 JavaScript 代码。
基本用法
引入 HTMX
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
基础示例
前端 HTML (index.php):
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
</head>
<body>
<!-- 点击按钮发送 GET 请求 -->
<button hx-get="get-time.php" hx-target="#result">
获取时间
</button>
<div id="result"></div>
</body>
</html>
后端 PHP (get-time.php):
<?php
// 返回 HTML 片段
echo '<p>当前时间:' . date('Y-m-d H:i:s') . '</p>';
?>
常用 HTMX 属性
表单提交
前端:
<form hx-post="save-user.php" hx-target="#message">
<input type="text" name="name" placeholder="姓名">
<input type="email" name="email" placeholder="邮箱">
<button type="submit">保存</button>
</form>
<div id="message"></div>
后端 PHP:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
// 处理数据...
// 返回反馈信息
echo '<div class="alert alert-success">用户 ' . $name . ' 保存成功!</div>';
}
?>
实时搜索
前端 HTML:
<input type="search"
name="search"
placeholder="输入搜索..."
hx-get="search.php"
hx-trigger="keyup changed delay:300ms"
hx-target="#search-results">
<div id="search-results"></div>
后端 PHP (search.php):
<?php
$search = $_GET['search'] ?? '';
// 模拟数据库查询
$users = ['张三', '李四', '王五', '赵六', '孙七'];
$results = array_filter($users, function($user) use ($search) {
return str_contains($user, $search);
});
if (empty($results)) {
echo '<p>没有找到结果</p>';
} else {
foreach ($results as $user) {
echo '<div>' . htmlspecialchars($user) . '</div>';
}
}
?>
高级用法
加载指示器
<button hx-get="load-content.php" hx-target="#content"
hx-indicator="#loading">
加载内容
</button>
<div id="loading" class="htmx-indicator">
加载中...
</div>
CSS 样式:
.htmx-indicator {
display: none;
}
.htmx-request .htmx-indicator {
display: block;
}
无限滚动
<div hx-get="more-posts.php" hx-trigger="revealed" hx-target="this" hx-swap="afterend">
<!-- 当前内容 -->
</div>
带确认的删除
<button hx-delete="delete-user.php?id=1"
hx-confirm="确定要删除吗?"
hx-target="closest tr">
删除
</button>
JSON 数据处理
<?php
// 设置响应头
header('Content-Type: application/json');
// 返回 JSON
echo json_encode(['status' => 'success', 'message' => '操作成功']);
?>
完整示例:任务管理系统
index.php:
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
<style>
.task-item { margin: 10px 0; }
.completed { text-decoration: line-through; }
</style>
</head>
<body>
<h1>任务列表</h1>
<!-- 添加任务表单 -->
<form hx-post="add-task.php" hx-target="#task-list" hx-swap="afterbegin">
<input type="text" name="task" placeholder="输入新任务" required>
<button type="submit">添加</button>
</form>
<!-- 任务列表 -->
<div id="task-list" hx-get="get-tasks.php" hx-trigger="load">
<!-- 任务将在这里显示 -->
</div>
</body>
</html>
add-task.php:
<?php
session_start();
$task = htmlspecialchars($_POST['task'] ?? '');
$task_id = uniqid();
// 添加到 session 数组(模拟数据库)
$_SESSION['tasks'][$task_id] = $task;
// 返回新任务 HTML
echo '<div class="task-item" id="task-' . $task_id . '">
<span>' . $task . '</span>
<button hx-delete="delete-task.php?id=' . $task_id . '"
hx-target="#task-' . $task_id . '"
hx-swap="outerHTML">删除</button>
</div>';
?>
get-tasks.php:
<?php
session_start();
$tasks = $_SESSION['tasks'] ?? [];
if (empty($tasks)) {
echo '<p>暂无任务</p>';
return;
}
foreach ($tasks as $id => $task) {
echo '<div class="task-item" id="task-' . $id . '">
<span>' . $task . '</span>
<button hx-delete="delete-task.php?id=' . $id . '"
hx-target="#task-' . $id . '"
hx-swap="outerHTML">删除</button>
</div>';
}
?>
delete-task.php:
<?php
session_start();
$id = $_GET['id'] ?? '';
if (isset($_SESSION['tasks'][$id])) {
unset($_SESSION['tasks'][$id]);
}
?>
<!-- 返回空内容 -->
注意事项
- 安全性:始终使用
htmlspecialchars()处理用户输入 - 数据验证:在 PHP 端始终进行数据验证
- 错误处理:使用 HTMX 的
hx-on-error处理错误情况
<div hx-get="api.php" hx-trigger="load" hx-on-error="alert('发生错误')">
</div>
- CSRF 防护:在处理 POST 请求时添加 CSRF token
<form hx-post="add-task.php" hx-target="#task-list">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
<!-- 其他字段 -->
</form>
HTMX 和 PHP 配合使用非常简洁高效,尤其适合小型到中型的 Web 应用,它大大减少了前后端分离架构中大量 JavaScript 代码的复杂性。