【问题标题】:PHP Getting MYSQL data from checked boxPHP从复选框获取MYSQL数据
【发布时间】:2018-01-26 23:14:26
【问题描述】:

我正在创建一个表单来批准或拒绝休假请求。因此,这将打开一个包含休假请求数据行的表。您选中该框并在提交表单时,我希望它更改行的Status 并向用户发送电子邮件,让他们知道它已被接受。我让它更新该行,但是当它发送电子邮件时,它使用表中最后一行数据的信息。所以我有一个包含以下内容的 PHP 表单:

    <form name="bulk_action_form" action="" method="post"/>
    <tr>
            <th></th>
            <th>Username</th>
            <th>Employee Name</th>
            <th>First Day Off</th>
            <th>First Day Back</th>
            <th>Status</th>
            <th>Date of Request</th>

    </tr>
    </thead>
    <?php
        if(mysqli_num_rows($query) > 0){
            while($row = mysqli_fetch_assoc($query)){
    ?>

    <tr>
        <td align="center"><input type="checkbox" name="checked_id[]" class="checkbox" value="<?php echo $row['ID']; ?>"/>
            <input type="hidden" name="worker_name" value="<?php echo $row['worker_name']; ?>"/>
            <input type="hidden" name="Name" value="<?php echo $row['Name']; ?>"/>
            <input type="hidden" name="FirstDayOff" value="<?php echo $row['FirstDayOff']; ?>"/>
            <input type="hidden" name="FirstDayBack" value="<?php echo $row['FirstDayBack']; ?>"/></td>

        <td><?php echo $row['worker_name']; ?></td>
        <td><?php echo $row['Name']; ?></td>
        <td><?php echo $row['FirstDayOff']; ?></td>
        <td><?php echo $row['FirstDayBack']; ?></td>
        <td><?php echo $row['Status']; ?></td>
        <td><?php echo $row['_sfm_form_submision_time_']; ?></td>
    </tr> 
    <?php } }else{ ?>
        <tr><td colspan="5">No records found.</td></tr> 
    <?php } ?>
<input type="submit" class="btn btn-success" name="bulk_approve_submit" formaction="action-approve.php" value="Approve Request">

    </form>

我的action-approve.php 如下所示。

<?php
session_start();
include_once('dbConfig.php');
if(isset($_POST['bulk_approve_submit'])){

$idArr = $_POST['checked_id'];

    foreach($idArr as $id){
        mysqli_query($conn,"UPDATE Request_off SET Status='Approved' WHERE ID=".$id);

// Get Parameters about the row that was selected
$worker_name = $_POST['worker_name'];
$Name = $_POST['Name'];
$FirstDayOff = $_POST['FirstDayOff'];
$FirstDayBack = $_POST['FirstDayBack'];
// Email Parameters 
$to      = $worker_name.'@somewhere.com, request-off@somewhere.com';
$subject = 'APPROVED: Time off request for '.$Name;
$message = 'Dear '.$Name.','. "\r\n\n" .'Your time off request from '.$FirstDayOff.' to '.$FirstDayBack.' has been approved!'. "\r\n\n" .'Note: Please keep a copy of this email for your records.';
$headers = 'From: request-off@somewhere.com';

        mail($to, $subject, $message, $headers);
    }
    $_SESSION['success_msg'] = 'Request has been approved successfully.';
    header("Location: Request_off-admin.php?Status=Pending");
}
?>

我将如何从选中的行中获取行数据,而不是特定表中的最后一行?

更新:

我只是把那些隐藏的字段变成了复选框。如果我选中特定行的所有框,我可以使其更新并正确发送电子邮件。我将研究隐藏这些复选框并仅使用一个来选择它们...

【问题讨论】:

  • 您是否发现缺少的表单标签无关紧要?
  • 感谢您的关注!我只是没有从我的 Notepad++ 中复制它们。
  • $to = $worker_name.'@somewhere.com, request-off@somewhere.com'; 这是问题的一部分。 To: 期望将电子邮件发送到电子邮件行,或者这只是伪代码?看到编辑,&lt;form&gt; 默认为 GET 方法(和 self),并且您正在使用 POST 数组。

标签: php mysql sql


【解决方案1】:

本质上,您的问题是您对所有inputs 使用相同的name。如果您在 Web 浏览器中查看 PHP 表单的源代码,您会注意到很多 worker_name 字段,例如 - 每条记录一个。因此,列表中的最后一个输入会在它们发布到您的脚本时覆盖所有以前的输入。

不过,我的建议是在复选框中发布IDs。数据库中已有的其余数据。在action-approve.php 脚本中,您可以从数据库中加载姓名、休息日等详细信息并循环访问它们。

类似这样的东西(未经测试):

<?php

foreach($idArr as $id){
    mysqli_query($conn,"UPDATE Request_off SET Status='Approved' WHERE ID=".$id);

// Get Parameters about the row that was selected
$newQuery = mysqli_query($conn, "SELECT * FROM Request_off WHERE ID = $id");
if(mysqli_num_rows($newQuery) > 0){
    while($_newRow = mysqli_fetch_assoc($newQuery)){
        $worker_name = $_newRow['worker_name'];
        $Name = $_newRow['Name'];
        $FirstDayOff = $_newRow['FirstDayOff'];
        $FirstDayBack = $_newRow['FirstDayBack'];

        // Email Parameters 
        $to      = $worker_name.'@somewhere.com, request-off@somewhere.com';
        $subject = 'APPROVED: Time off request for '.$Name;
        $message = 'Dear '.$Name.','. "\r\n\n" .'Your time off request from '.$FirstDayOff.' to '.$FirstDayBack.' has been     approved!'. "\r\n\n" .'Note: Please keep a copy of this email for your records.';
        $headers = 'From: request-off@somewhere.com';

        mail($to, $subject, $message, $headers);
    }
}

这也将更容易验证您的数据,因为目前人们可以轻松地做SQL injection 或其他意想不到的事情。

【讨论】:

  • 我会试一试。是的,我知道这很容易受到 SQL 注入的影响。这只会在我们的本地网络上运行,所以我不太担心。不过,这是我需要了解更多的东西。
  • $newQuery = mysql_query 是一个错字。
  • 它确实在更新表中的数据,但它并没有从其他行中提取其他数据以正确地制定电子邮件。
  • 我刚刚在我的答案上修正了一个类型(newQuery 之前的下划线) - 检查你的副本。
  • 不,只是它从我们的邮件服务器弹回的错误,因为它只是试图去@ourcompany.com
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 2013-10-09
相关资源
最近更新 更多