【问题标题】:Order rows by clicking column name通过单击列名对行进行排序
【发布时间】:2017-02-24 19:30:55
【问题描述】:

我必须通过单击列名来订购显示的列表。我的灵感来自this thread,但不知道如何继续。

这是我的代码:

<?php
$result = mysqli_query($mysqli,"SELECT rid, pid, firstname, lastname, email FROM temp_members_db WHERE pid='$pid1' ");

echo "<br><table><tr class='tabletop'><th><a href='mypage.php?sort=type'>Namn</a></th><th><a href='mypage.php?sort=type'>E-mail</a></th><th><a href='mypage.php?sort=type'>Resultat</a></th><th>Ta bort kandidat</th></tr>";
while($row = mysqli_fetch_array($result))
{

echo "<tr><td><strong>
<form action='respondent2.php' method='GET'>
 <input type='hidden' name='rid' value='".$row['rid']."'>
 <input type='hidden' name='firstname' value='".$row['firstname']."'> 
<input type='submit' class='resname' name='submit' value='".$row['firstname']." ".$row['lastname']."'>
 </form>
 </strong></td> 
 <td>".$row['email']."</td> 
 <td><strong><span style=\"color: $color\">".$result00."</span>%</strong></td>   
 <form action='deleterespondent2.php' method='post'>
 <input type='hidden' name='rid' value='".$row['rid']."'> 
<td> <input type='submit' class='mydel' value='Radera' onclick=\"return confirm('Show me!')\">
 </form>
</td></tr>";
}
echo "</table>";?>

如您所见,我一开始在每个列名上都写了&lt;a href="mypage.php?sort=type"&gt;,但不知道该写什么而不是“类型”。我想要的是能够单击列标题并根据所选列对下面的行进行排序,例如名称。然后,当然,我希望所属的行彼此跟随,而不仅仅是选择的列改变顺序。

【问题讨论】:

  • 您的问题得到解答了吗?
  • @Eugene 不幸的是,没有。
  • 哦。你试过我的代码吗?它没有工作?有任何错误信息吗?也许发布您的数据库,我可以为您编写一个实时示例。这是很简单的东西,如果你仍然有问题,让我们帮你解决!

标签: php html mysql mysqli


【解决方案1】:

请使用参数化查询:

$mysqli = new mysqli('host', 'user', 'pass', 'db', port);
if($result = $mysqli -> prepare("SELECT rid, pid, firstname, lastname, email FROM temp_members_db WHERE pid=?")) {
    $result -> bind_param("i", $pid1); // Assuming pid1 is an integer
    $result -> execute();
    $result -> store_result();
    $result -> bind_result($pid);
    while($result -> fetch()) {
      echo $pid; // etc etc
    }  
}

为你朗读:

  1. http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
  2. https://www.owasp.org/index.php/Query_Parameterization_Cheat_Sheet

类似于 Drew 的建议:

<?php
$mysqli = new mysqli('host', 'user', 'pass', 'db', port);
$order_string = ""
// Assuming PHP >= 5.4, otherwise use array()
$sort_keywords = [
    "namn" => "lastname",
    "email" => "email",
];
if(isset($_GET['sort']) && array_key_exists($_GET['sort'], $sort_keywords)) {
    $order_string = " ORDER BY ".$sort_keywords[$_GET['sort']];
}
// Assume <head>, <body> etc etc here.
echo "<br><table><tr class='tabletop'><th><a href='mypage.php?sort=namn'>Namn</a></th><th><a href='mypage.php?sort=email'>E-mail</a></th><th>Resultat</th><th>Ta bort kandidat</th></tr>";

if($result = $mysqli -> prepare("SELECT rid, pid, firstname, lastname, email FROM temp_members_db WHERE pid=?".$order_string)) {
    $result -> bind_param("i", $pid1); // Assuming pid1 is an integer
    $result -> execute();
    $result -> store_result();
    $result -> bind_result($rid, $pid, $firstname, $lastname, $email);
    while($result -> fetch()) {
        // $color? $result00?
        echo "<tr><td><strong>
        <form action='respondent2.php' method='GET'>
         <input type='hidden' name='rid' value='".$rid."'>
         <input type='hidden' name='firstname' value='".$firstname."'> 
        <input type='submit' class='resname' name='submit' value='".$firstname." ".$lastname."'>
         </form>
         </strong></td> 
         <td>".$email."</td> 
         <td><strong><span style=\"color: $color\">".$result00."</span>%</strong></td>   
         <form action='deleterespondent2.php' method='post'>
         <input type='hidden' name='rid' value='".$rid."'> 
        <td> <input type='submit' class='mydel' value='Radera' onclick=\"return confirm('Show me!')\">
         </form>
        </td></tr>";
    }  
}

echo "</table>";
?>

或者(完全一样):

<?php
$mysqli = new mysqli('host', 'user', 'pass', 'db', port);
$order_string = ""
// Assuming PHP >= 5.4, otherwise use array()
$sort_keywords = [
    "namn" => "lastname",
    "email" => "email",
];
if(isset($_GET['sort']) && array_key_exists($_GET['sort'], $sort_keywords)) {
    $order_string = " ORDER BY ".$sort_keywords[$_GET['sort']];
}
// Assume <head>, <body> etc etc here.
?>
<br><table><tr class='tabletop'><th><a href='mypage.php?sort=namn'>Namn</a></th><th><a href='mypage.php?sort=email'>E-mail</a></th><th>Resultat</th><th>Ta bort kandidat</th></tr>
<?php
if($result = $mysqli -> prepare("SELECT rid, pid, firstname, lastname, email FROM temp_members_db WHERE pid=?".$order_string)) {
    $result -> bind_param("i", $pid1); // Assuming pid1 is an integer
    $result -> execute();
    $result -> store_result();
    $result -> bind_result($rid, $pid, $firstname, $lastname, $email);
    while($result -> fetch()) {
        // $color? $result00?
        ?>
        <tr><td><strong>
        <form action='respondent2.php' method='GET'>
         <input type='hidden' name='rid' value='<?php echo $rid; ?>'>
         <input type='hidden' name='firstname' value='<?php echo $firstname; ?>'> 
        <input type='submit' class='resname' name='submit' value='<?php echo $firstname; ?> <?php echo $lastname; ?>'>
         </form>
         </strong></td> 
         <td><?php echo $email; ?></td> 
         <td><strong><span style="color: <?php echo $color; ?>"><?php echo $result00; ?></span>%</strong></td>   
         <form action='deleterespondent2.php' method='post'>
         <input type='hidden' name='rid' value='<?php echo $rid; ?>'> 
        <td> <input type='submit' class='mydel' value='Radera' onclick="return confirm('Show me!')">
         </form>
        </td></tr>
    <?php
    }  
}
?>
</table>

另外,最好在数据库中定义排序数组并将它们echoed 作为 html 表行标题中的属性。我个人只会在客户端进行排序,这实际上有时会更快(ORDER BY 可能会很慢),但是,我不知道您的意图。

享受编辑的乐趣;)

【讨论】:

    【解决方案2】:

    将您的代码更改为:

    if ($_GET['sort'] == 'namn')
    {
        $order = " ORDER BY lastname";
    }
    elseif ($_GET['sort'] == 'email')
    {
        $order = " ORDER BY email";
    }
    
    $result = mysqli_query($mysqli,"SELECT rid, pid, firstname, lastname, email FROM temp_members_db WHERE pid='$pid1' ".$order);
    
    echo "<br><table><tr class='tabletop'><th><a href='mypage.php?sort=namn'>Namn</a></th><th><a href='mypage.php?sort=email'>E-mail</a></th><th>Resultat</th><th>Ta bort kandidat</th></tr>";
    

    【讨论】:

    • 如果 WHERE 仍然敞开,那么保护 ORDER BY 子句免受 SQL 注入是没有意义的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多