包含 PHP 和 SQL 问题的复选框


Checkbox with PHP and SQL problems

我正在尝试从我的SQL数据库中显示注册人员列表。

我有一个表格,每列都输出到其中,但我遇到问题的地方是复选框,该复选框将被更新以显示该人是否已付款。我将选中该框而不是客户。

所以到目前为止我遇到了 2 个问题:

1)当我提交更新以将复选框保存到SQL DB中的列中时,它不会显示正在选中的框,除非我刷新页面,然后它去那里并获得更新(新存储)的checked值。

2)当我尝试取消选中该框并尝试保存时,我收到一个错误,说我的paymentStatus数组是和未定义的索引,因为没有为其分配值。

我一直在兜圈子,我无法想象这真的这么难,所以我认为一定有更好的方法来完成我想要做的事情。

这是我当前的代码:http://pastebin.com/bgAtYqbL

感谢您的任何帮助。


完整代码:

<?php
    require_once ('functions.php');
    require_once ('includes/cred.php');
    $query = $conn->prepare("SELECT * FROM sponsors");
    //$query->bindParam(":idnum", "1");
    $query->execute();
    $notPaid = $query->fetchAll();

    if (isset($_REQUEST["sponsorUpdate"])) {
        //Create Sessions
        $array = $_POST;
        foreach ($array as $key => $value) {
            $_SESSION[$key] = $value;
        }
        if(isset($_POST['paymentStatus'])) {
            $payment = $_POST['paymentStatus'];
            foreach($payment as $value) {
                $stmt = $conn->prepare("UPDATE sponsors SET paid=1 WHERE id = $value");
                $stmt->execute();
            }
        } else {
            $payment = $_POST['id'];
            foreach($payment as $value) {
                $stmt = $conn->prepare("UPDATE sponsors SET paid=0 WHERE id = $value");
                $stmt->execute();
            }
        }
    }
?>
<html>
<head>
</head>
<body>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
<table border="1" cellspacing="0" cellpadding="10">
    <tr>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Company Name</th>
        <th>Email Address</th>
        <th>Phone Number</th>
        <th>Address</th>
        <th>City</th>
        <th>State</th>
        <th>Zipcode</th>
        <th>Sponsor Level</th>
        <th>Payment Received</th>
    </tr>
    <?php 
            foreach ($notPaid as $row) {
            $phone = preg_replace('/('d{3})('d{3})('d{4})/', '($1) $2-$3', $row['phone']);
        ?>
    <tr>
        <td><?php echo $row['fname']; ?></td>
        <td><?php echo $row['lname']; ?></td>
        <td><?php echo $row['cname']; ?></td>
        <td><?php echo $row['email']; ?></td>
        <td><?php echo $phone; ?></td>
        <td><?php echo $row['address']; ?></td>
        <td><?php echo $row['city']; ?></td>
        <td><?php echo $row['state']; ?></td>
        <td><?php echo $row['zip']; ?></td>
        <td><?php echo $row['sponsorLevel']; ?></td>
        <td><input name="paymentStatus[]" type="checkbox" value="<?php echo $row['id']; ?>" <?php if ($row['paid'] == 1) echo 'checked="checked"'; ?></td>
    </tr>
    <?php
     } ?>
</table>
    <input type="submit" name="sponsorUpdate" value="Save Changes" />
</form>
</body>
</html>

1)当我提交更新以将复选框保存到其列中时 在 SQL 数据库中,除非我刷新,否则它不会显示正在选中的框 然后转到并获取更新(新存储)值的页面 的检查。

这是因为在每个页面加载时,您首先要执行SELECT,然后执行UPDATE。 切换此顺序。 使用任何新的用户输入(如果有)UPDATE数据库,然后SELECT向用户显示这些可能更新的更改。

2)当我尝试取消选中该框并尝试保存时,出现错误 这说明我的付款状态数组是和未定义的索引,因为有 未为其分配任何值。

这是意料之中的。 如果您查看类似Firebug的HTTP请求,您将看到未选中的复选框与请求一起发送。 这意味着$_POST['paymentStatus']不会被设置。 尝试将该复选框的值保存到数据库时,需要在代码中说明这一点。

如果您想测试以查看是否已选中复选框,则应该可以完成以下工作:

$paymentStatus = isset($_POST['paymentStatus']);

然后,变量 $paymentStatus 将包含 truefalse 值,具体取决于发送表单时是否选中了复选框。 这是因为如果选中它,则inputname将与值为 on 的请求一起发送。 如果不检查,它根本不会被发送,也不会显示在$_POST中。

演示上述内容的快速示例:

if (isset($_REQUEST["sponsorUpdate"])) 
{
    // if the paymentStatus parameter is sent with the HTTP request
    // the $paymentStatus variable will be set to 1 which indicates that
    // the checkbox was checked.  If it was not checked, it will have a
    // value of 0.
    $paymentStatus = isset($_POST['paymentStatus']) ? 1 : 0;
    // always test your input before putting data into a database
    // the bindParam() method should take care of this for us, but it's
    // good practice anyway
    if ($paymentStatus === 0 || $paymentStatus === 1)
    {
        $stmt = $conn->prepare("UPDATE sponsors SET paid=?");
        $stmt->bindParam(1, $paymentStatus);
        $stmt->execute();
        // test for SQL errors ...
    }
}

我在您的解决方案中看到最后一个问题,那就是您依赖于两件事,这些事情对您的复选框没有帮助:

  1. 与复选框关联的 GET 或 POST 参数的值始终以"on"的值发送到服务器(如果选中),或者如果未选中,则根本不发送。 不会发送 value 属性,因此服务器将永远不会获取要更新的行的 ID。

  2. 由于不会向服务器发送任何内容来指示未选中复选框,因此在保存所有表单输入时,您将无法将该输入用作循环键。 不幸的是,您将需要重新考虑您的设计。

    • http://us1.php.net/manual/en/function.isset.php
    • http://www.w3schools.com/html/tryit.asp?filename=tryhtml_form_checkbox
    • HTML 元素数组,名称="某物
    • []"还是名称="某物"?