【问题标题】:HTML table: modify order using mysqlHTML表格:使用mysql修改顺序
【发布时间】:2017-05-22 16:09:27
【问题描述】:

我有一个 MySQL 表:

CREATE TABLE `Questions` (
  `question_id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `question` VARCHAR(1024),
  `order` INT
);

在 HTML 表格中显示数据时,数据的顺序按“顺序”列排序。如何在每个表格行中使用某种向上/向下按钮来实现递增/递减顺序列?

...
  <tr>
    <td><?php echo $question['question_id'] ?></td>
    <td><?php echo $question['order'] ?></td>
    <td><button id="up_<?php echo $question['question_id'] ?>">&#x25B2;</button></td>
    <td><button id="down_<?php echo $question['question_id'] ?>">&#x25BC;</button></td>
    <td><?php echo $question['question'] ?></td>
  </tr>
...

【问题讨论】:

    标签: javascript php mysql html-table


    【解决方案1】:

    将此添加到 MySQL 查询的末尾 "(REST OF OLD QUERY HERE) ORDER BY order " . $sort;

    您需要制作标记为向上/向下(或类似的东西)的链接,以便将参数传递给脚本以何种方式对结果进行排序。

    例如:&lt;a href="index.php?sort=&gt;Ascending&lt;/a&gt; &lt;a href="index.php?sort=desc&gt;Descending&lt;/a&gt;

    然后,在您的 PHP 脚本中,在查询之前:

    $sort = ''; // Default order ascending (auto)
    if ( isset ( $_GET [ 'sort' ] ) )
    {
       if ( $_GET [ 'sort' ] == 'desc' )
       {
          $sort = 'DESC';
       }
    }
    

    说明:

    默认情况下,MySQL 会按升序排列您的结果,因此我们必须正常向查询中添加任何内容 ($sort='';)。但是,如果用户单击降序链接,PHP 会将$sort 设置为DESC,MySQL 会将您的结果降序排列!

    【讨论】:

    • 如果你的字段实际上被称为order,你需要在字段周围包含反引号`作为order
    • 嗯,发送得太早了,抱歉。 order是mysql关键字,反引号标记为字段名。
    • 没问题,我之前也想在它周围加上引号。
    【解决方案2】:

    如果您需要手动订单,则需要在数据库中添加一列来描述该订单。可能是具有唯一性约束的整数列(您似乎已经有了,没有约束)。

    然后,您可以在发出的 SELECT 查询中按该列排序。

    当您想要更改顺序时,您需要交换要交换的行的值。 (您可能需要将一个设置为占位符值,然后将另一个设置为第一个的旧值,然后将第一个设置为第二个的旧值)。

    这可以通过每行的表单来实现,该表单包含一个带有行 ID 的隐藏输入,以及向上/向下提交按钮。然后在服务器端代码中,您可以根据单击的按钮将行 ID 与行 ID + 1 或 -1 交换。

    您可以添加 JavaScript(和 Ajax 技术)来改善用户体验。

    【讨论】:

      【解决方案3】:

      您可以在 ORDER BY 部分的查询中定义它,例如:

      ORDER BY first_order,second_order,second_order`
      

      但是!如果你想在你的表格上有类似按钮的东西,你可以在表格中进行动态排序,你可以使用一些 JQUERY 插件,你可以参考它这里:http://tablesorter.com/docs/

      【讨论】:

        【解决方案4】:

        您可以使用 jQuery + jQuery UI Sortable 代替 order 列。在这里查看:http://jqueryui.com/sortable

        【讨论】:

          【解决方案5】:

          这个 sn-p 应该可以解决问题。有任何问题,欢迎评论。

          <?php
          
          mysql_connect('localhost', 'xxxxxx', 'xxxxxxxxxxxx');
          
          if(isset($_GET['q'])){
            $qid = $_GET['q'];
            $act = $_GET['act'];
            $sql = "SELECT `order` FROM test.questions WHERE question_id = '$qid'";
            $rs = mysql_query($sql);
            $r = mysql_fetch_array($rs);
            $order = $r['order'];
            if($act == 'up'){
              if($order == '1') break;
              $up_order = $order - 1;
              $sql = "SELECT question_id FROM test.questions WHERE `order` = '$up_order'";
              $rs = mysql_query($sql);
              $r = mysql_fetch_array($rs);
              $up_order_id = $r['question_id'];
              $sql = "UPDATE test.questions SET `order` = '$up_order' WHERE question_id = '$qid'";
              mysql_query($sql);
              $sql = "UPDATE test.questions SET `order` = '$order' WHERE question_id = '$up_order_id'";
              mysql_query($sql);
            } else if($act == 'down'){
              $sql = "SELECT MAX(`order`) as `order` FROM test.questions";
              $rs = mysql_query($sql);
              $r = mysql_fetch_array($rs);
              $max_order = $r['order'];
              if($order == $max_order) break;
              $down_order = $order + 1;
              $sql = "SELECT question_id FROM test.questions WHERE `order` = '$down_order'";
              $rs = mysql_query($sql);
              $r = mysql_fetch_array($rs);
              $down_order_id = $r['question_id'];
              $sql = "UPDATE test.questions SET `order` = '$down_order' WHERE question_id = '$qid'";
              mysql_query($sql);
              $sql = "UPDATE test.questions SET `order` = '$order' WHERE question_id = '$down_order_id'";
              mysql_query($sql);
            }
            $sql = "";
          }
          
          $sql = "SELECT * FROM test.questions ORDER BY `order`;";
          $rs = mysql_query($sql);
          echo "<table>";
          while(false !== ($r = mysql_fetch_array($rs))){
             echo "<tr>";
                echo "<td>$r[question_id]</td>";
                echo "<td>$r[question]</td>";
                echo "<td>$r[order]</td>";
                echo "<td><a href='?q=$r[question_id]&act=up'>UP</a> - <a href='?q=$r[question_id]&act=down'>DOWN</a></td>";
             echo "</tr>";
          }
          echo "</table>";
          ?>
          

          【讨论】:

          • 是的,正如 David Dorward 所说。我需要一个 UI 来手动排序表格而不是对列进行排序。还是谢谢
          • 是的,我意识到 SQL 注入问题和其他几个安全问题。但是,这不是这里的问题。从描述中:有没有办法使用按钮(上移/下移)更改“订单”,然后更新数据库中的订单?他/她想更新“订单”字段而不是如何订购他的问题!。
          • @Xin:我的答案不是对列进行排序。这是关于改变表格/问题的顺序。
          猜你喜欢
          • 2010-09-20
          • 2012-08-24
          • 1970-01-01
          • 1970-01-01
          • 2011-07-24
          • 2011-03-12
          • 1970-01-01
          • 2017-01-11
          • 2021-10-21
          相关资源
          最近更新 更多