使用隐藏输入传递变量

时间:2016-12-07 10:50:19

标签: php

我刚刚开始学习php,我决定开发一个简单的票务系统。我已设法显示票证列表,然后当用户点击票证ID时,我可以显示将票证ID变量传递给URL的票证详细信息。

现在,要更新票证,我已经使用action="ctrl_client_edit_ticket.php" method="post"创建了一个新表单,因此在此文件中我可以执行数据库查询来更新票证。

问题是我必须使用_POST将票证ID分配给新变量。所以我想也许我可以用<input type="hidden" name="ticketid" value="<?php echo $ticket_id ?>">

形式创建一个隐藏字段

它正在运行,但我不知道这是否是执行此操作的最佳和更安全的方法。

非常感谢

这是代码。

这是文件client_view_ticket.php,我向用户显示所有门票。

<?php  

    $view_ticket_query = mysqli_prepare($conn, "SELECT ticket_id, ticket_subject, ticket_status, ticket_time_stamp FROM user_tickets WHERE ticket_user_id= ? "); 

    $view_ticket_query -> bind_param("i", $userid);
    $view_ticket_query -> execute();
    $view_ticket_query -> bind_result($ticket_id, $ticket_subject, $ticket_status, $ticket_time_stamp);


    while($view_ticket_query -> fetch())
    {  
        // set ticket's colors
        if ($ticket_status == "Aperto"){
            $tcolor = "<span class='label label-lg label-success'>";
        }else if ($ticket_status == "Chiuso"){
            $tcolor = "<span class='label label-lg label-danger'>";
        }else if ($ticket_status == "In Lavorazione"){
            $tcolor = "<span class='label label-lg label-info'>";
        }

        echo '
        <tr>
            <td><a href="client_edit_ticket.php?id='.$ticket_id.'"> '.$ticket_id.'</a></td>
            <td><a href="client_edit_ticket.php?id='.$ticket_id.'"> '.$ticket_subject.'</a></td>

            <td>'.$ticket_time_stamp.'</td>
             <td>'.$tcolor.'' .$ticket_status. '</span></td>
        </tr>

        ';
    }

    $view_ticket_query -> close();   
?> 

这是文件client_edit_ticket.php

<?php
// Prelevo l'id del ticket dall'url e lo passo ad una variabile
$ticket_id = $_GET['id'];


// Query al database per prendere i dati del ticket
$view_ticket = mysqli_prepare($conn, "SELECT ticket_subject, ticket_body, ticket_user_first, ticket_user_last, ticket_user_email, ticket_time_stamp, ticket_status, ticket_priority FROM user_tickets WHERE ticket_id= ? "); 

$view_ticket -> bind_param("i", $ticket_id);
$view_ticket -> execute();
$view_ticket -> bind_result($ticket_subject, $ticket_message, $ticket_user_first, $ticket_user_last, $ticket_user_email, $ticket_created_time, $ticket_status, $ticket_priority);
$view_ticket -> fetch();
$view_ticket -> close();

// Coverto la data di creazione del ticket in un formato europeo
$new_ticket_date = date('d-m-Y', strtotime($ticket_created_time));


?>
 <form class="form-group" action="controllers/ctrl_client_edit_ticket.php" method="post">

   <!--  hidden input for ticket id -->
    <input type="hidden" name="ticketid" value="<?php echo $ticket_id ?>">

                <div class="row">
                    <div class="col-xs-12">
                        <h3>
                            <i class="icon-action-redo"></i> Messaggio di risposta</h3>
                        <textarea class="ticket-reply-msg" row="10"></textarea>
                    </div>
                </div>
                <div class="row">

                    <div class="col-md-4">
                        <h3 class="ticket-margin">
                            <i class="icon-info"></i> Aggiorna Priorità</h3>
                        <select class="ticket-status" name="ticketpriority">
                            <option value="Bassa" selected>Bassa</option>
                            <option value="Media">Media</option>
                            <option value="Alta">Alta</option>
                            <option value="Urgente">Urgente</option>
                            <option value="Critica">Critica</option>
                        </select>
                    </div>
                </div>
                <button class="btn btn-square uppercase bold green" type="submit">Aggiorna</button>
    </form>

这是文件ctrl_client_edit_ticket.php

$ticket_id = $_POST['ticketid'];
$ticket_priority = check_input($_POST['ticketpriority']);

if ($ticket_update_query = mysqli_prepare($conn, "UPDATE user_tickets SET ticket_priority= ? WHERE ticket_id= ? ")) { 

    /* bind parameters for markers */
    mysqli_stmt_bind_param($ticket_update_query, 'si', $ticket_priority, $ticket_id);

    /* execute query */
    mysqli_stmt_execute($ticket_update_query);

    echo "ticket aggiornato";


} else{

    echo "ticket non aggiornato";
}       

?>

2 个答案:

答案 0 :(得分:-1)

提交表单以更新现有数据时,这是一种相当常见的模式。请记住,ID只是一个唯一的标识符,因此系统知道如何查找单个实体。

另一种选择是在页面的路由URL中包含项目的ID(例如/ticket/{$ticketId}用于基于路由器的系统,如Laravel或/ticket?id={$ticketId}),但这仅在该页面的目的是管理该特定数据。

正如@IMSoP评论的那样,这个问题(如所提出的)可能更适合其他StackExchange网站之一。

答案 1 :(得分:-1)

这不是最安全的方式,因为POST数据可以轻松拦截和动态更改,但您应该在client_edit_ticket.php实施安全措施,并确保用户有权编辑故障单,如果用户试图将隐藏的输入值更改为另一个故障单,则应阻止其请求。