You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP为MySQL查询结果手动添加非自增行号

如何用PHP为MySQL查询结果手动添加行号(不依赖自增字段)

你的需求非常明确:要给查询结果的每行分配一个从1开始的连续编号,编号对应数据的添加顺序(最早添加为1),但展示时数据按指定字段(比如尺寸)排序,同时避免自增字段因删除数据导致的断号问题。下面我来一步步帮你解决这个问题:

问题分析

你当前的代码里用了$rowNumber++生成行号,但这个行号是按照查询结果的展示顺序递增的,而非你想要的添加顺序。另外你的SQL语句存在语法错误,还有SQL注入风险,这些都需要修正。

解决方案

要实现“行号按添加顺序,数据按指定字段排序展示”,需要分三步:

  1. 先按添加时间(cas字段升序)查询所有符合条件的记录,给每条记录分配对应的行号。
  2. 将带行号的记录数组,按照你想要的展示排序规则重新排序。
  3. 循环输出重新排序后的记录,同时输出对应的行号。

另外,必须修复SQL注入问题,改用白名单校验排序参数,避免恶意注入。

修正后的完整代码

<?php
// 初始化排序参数,设置默认值
$orderBy = !empty($_GET["orderby"]) ? $_GET["orderby"] : 'dolzina'; // 默认按长度排序
$order = !empty($_GET["order"]) ? $_GET["order"] : 'asc'; // 默认升序

// 排序参数白名单校验,防止SQL注入
$allowedOrderBy = ['dolzina', 'sirina', 'kolicina', 'opombe', 'povrsina', 'cas'];
$allowedOrder = ['asc', 'desc'];
if (!in_array($orderBy, $allowedOrderBy)) {
    $orderBy = 'dolzina';
}
if (!in_array($order, $allowedOrder)) {
    $order = 'asc';
}

$randomNum = substr(str_shuffle("0123456789"), 0, 4);
$conn = mysqli_connect("localhost", "owjej_david", "dadadada", "owjej_kalkulator");

// 检查连接
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
}

// 第一步:先按添加时间排序查询,获取带行号的原始数据
$sql = "SELECT dolzina, sirina, kolicina, opombe, povrsina, id, narocilo, cas FROM zunanje where id=? ORDER BY cas asc";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $id); // 假设$id是之前定义的变量,注意类型匹配
$stmt->execute();
$result = $stmt->get_result();

$records = [];
$rowNumber = 0;
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $rowNumber++;
        $row['row_num'] = $rowNumber; // 给每条记录添加行号字段
        $records[] = $row;
    }
}

// 第二步:按照用户指定的规则重新排序记录数组
usort($records, function($a, $b) use ($orderBy, $order) {
    // 处理字符串和数字类型的排序
    if (is_numeric($a[$orderBy]) && is_numeric($b[$orderBy])) {
        $compare = $a[$orderBy] - $b[$orderBy];
    } else {
        $compare = strcmp(strtolower($a[$orderBy]), strtolower($b[$orderBy]));
    }
    // 根据排序方向调整结果
    return $order === 'asc' ? $compare : -$compare;
});

// 第三步:输出排序后的记录
if (!empty($records)) {
    echo "<table>";
    foreach($records as $row) {
        echo "<tr>
                <td>" . $row['row_num']. "</td>
                <td>" . $row["dolzina"] ." cm<a href=\"uredizunanjo.php?id=" . $row['id'] . "&amp;uredi=dolzina&amp;narocilo=".$row['narocilo'] . "&amp;value=".$row['dolzina']."\"> &#9998;</a></td>
                <td>" . $row["sirina"] ." cm<a href=\"uredizunanjo.php?id=" . $row['id'] . "&amp;uredi=sirina&amp;narocilo=".$row['narocilo'] . "&amp;value=".$row['sirina']."\"> &#9998;</a></td>
                <td>" . $row["kolicina"] ."<a href=\"uredizunanjo.php?id=" . $row['id'] . "&amp;uredi=kolicina&amp;narocilo=".$row['narocilo'] . "&amp;value=".$row['kolicina']."\"> &#9998;</a></td>
                <td>" . $row["opombe"] ."<a href=\"uredizunanjo.php?id=" . $row['id'] . "&amp;uredi=opombe&amp;narocilo=".$row['narocilo'] . "&amp;value=".$row['opombe']."\"> &#9998;</a></td>
                <td>" . $row["povrsina"] ." m&#xb2;<a href=\"updatepovrsina.php?id=" . $row['id'] . "&amp;uredi=povrsina&amp;narocilo=".$row['narocilo'] . "&amp;value=".$row['povrsina']."\"> &#9998;</a></td>
                <td> <a href=\"izbrisizunanjo.php?id=" . $row['id']."&amp;narocilo=".$row['narocilo']."\">X</a> </td>
              </tr>";
    }
    echo "</table>";
}

$stmt->close();
$conn->close();
?>

关键说明

  1. 行号生成逻辑:先按cas asc查询,确保拿到的是最早添加到最新的顺序,然后给每条记录分配行号,这样行号就严格对应添加顺序了。
  2. 排序安全性:通过白名单校验$orderBy和$order参数,避免SQL注入风险,同时确保只有合法的排序字段和方向被使用。
  3. 数组重排序:用usort()函数对带行号的数组进行二次排序,实现“数据按指定字段展示,行号保持添加顺序”的需求。
  4. 修复HTML实体:把你代码里的&amp;#9998;改成&#9998;,因为在HTML输出里直接用实体即可,不需要双重转义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:35:51