PHP7.2怎么在拖放时校验order字段

小枫大大_2703

小枫大大_2703

2026-09-11

336人浏览

原创

PHP 7.2 不处理拖放,仅校验前端提交的 order 序列:须为从1开始的连续正整数、ID真实存在且数量匹配、事务中批量安全更新。

php7.2怎么在拖放时校验order字段

PHP 7.2 本身不直接处理拖放(drag & drop)操作,拖放是前端行为;校验 order 字段需前后端协同:前端在拖放结束时提交新顺序,后端(PHP 7.2)接收并校验、保存。关键在于「如何安全、可靠地验证和更新 order 值」。

一、明确 order 字段的业务逻辑

常见场景是列表项排序(如后台菜单、任务卡片、商品排序等),order 通常为整数,越小越靠前。校验重点不是“是否数字”,而是:

  • 所有提交的 order 值必须是**连续且无重复的正整数**(如 1,2,3,4),或至少是**严格递增的整数序列**(允许间隔,如 10,20,30);
  • 提交的条目数必须与数据库中待排序集合的总数一致(防删条目后乱序);
  • 每个 order 必须对应一个真实存在的记录 ID(防伪造 ID 或越权修改)。

二、前端拖放后正确提交数据

不要只传单个被拖项的新位置,而应传整个有序 ID 列表(最稳妥):

PHP
PHP

编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。

下载
// 示例:拖放后得到的新顺序
["item_5", "item_3", "item_1", "item_7"]

然后用 JS 转为带 order 的结构再 POST:

fetch('/api/update-order.php', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    items: [
      { id: 5, order: 1 },
      { id: 3, order: 2 },
      { id: 1, order: 3 },
      { id: 7, order: 4 }
    ]
  })
});

三、PHP 7.2 后端校验与更新(核心代码)

update-order.php 中执行以下步骤(使用 PDO,假设表为 menu_items,主键 id,排序字段 order):

注意:务必开启事务 + 预处理语句 + 权限校验(如用户是否有该组数据的操作权)
<?php header('Content-Type: application/json');
require_once 'db.php'; // PDO 实例 $pdo
<p>// 1. 校验登录/权限(略)
if (!is_admin()) {
http_response_code(403);
echo json_encode(['error' => '无权限']);
exit;
}<p>// 2. 获取并过滤输入
$data = json_decode(file_get_contents('php://input'), true);
if (!isset($data['items']) || !is_array($data['items'])) {
http_response_code(400);
echo json_encode(['error' => '缺少 items 数据']);
exit;
}</p><p>$items = $data['items'];
if (empty($items)) {
http_response_code(400);
echo json_encode(['error' => 'items 不能为空']);
exit;
}</p><p>// 3. 校验每个 item:id 和 order 必须为正整数
foreach ($items as $item) {
if (!isset($item['id']) || !isset($item['order']) ||
!is_int($item['id'] + 0) || !is_int($item['order'] + 0) ||
$item['id']  'ID 或 order 格式错误']);
exit;
}
}</p><p>// 4. 检查是否所有 ID 真实存在且属于当前用户/范围(示例:查 menu_items 表)
$ids = array_column($items, 'id');
$placeholders = str_repeat('?,', count($ids) - 1) . '?';
$stmt = $pdo->prepare("SELECT COUNT(*) FROM menu_items WHERE id IN ($placeholders)");
$stmt->execute($ids);
if ($stmt->fetchColumn() !== count($ids)) {
http_response_code(400);
echo json_encode(['error' => '存在无效或越权的 ID']);
exit;
}</p><p>// 5. 校验 order 是否构成有效序列(无重复、从 1 开始连续?或仅要求严格递增?)
$orders = array_column($items, 'order');
sort($orders);
for ($i = 0; $i  'order 必须从 1 开始连续']);
exit;
}
}</p><p>// 6. 安全更新(事务内批量执行)
try {
$pdo->beginTransaction();</p><pre class="brush:php;toolbar:false;">foreach ($items as $item) {
    $stmt = $pdo->prepare("UPDATE menu_items SET `order` = ? WHERE id = ?");
    $stmt->execute([$item['order'], $item['id']]);
}

$pdo->commit();
echo json_encode(['success' => true]);

} catch (Exception $e) { $pdo->rollback(); error_log('Order update failed: ' . $e->getMessage()); http_response_code(500); echo json_encode(['error' => '更新失败,请重试']); } ?>

四、进阶建议(提升鲁棒性)

  • 避免并发冲突:加行锁(SELECT ... FOR UPDATE)或用乐观锁(带版本号校验);
  • 支持稀疏 order:如用 100、200、300,留出插入空间,此时校验只需确保 order 严格递增即可;
  • 前端防重复提交:拖放结束后禁用按钮,成功后刷新或局部更新 DOM;
  • 日志记录:记录谁、何时、将哪些 ID 的 order 从旧值改为了新值,便于审计。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9024

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5481

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2015

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3408

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4074

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3191

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4517

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3522

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11582

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习