带有PHP和SQL问题的复选框

时间:2014-04-04 15:00:17

标签: php sql checkbox

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

我有一个表格,每列输出但我遇到的问题是复选框将更新,以显示该人是否已付款。我将检查包装盒而不是顾客。

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

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

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 个答案:

答案 0 :(得分:0)

  

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

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

  

2)当我试图取消选中该框并尝试保存时,我收到错误消息   这说我的paymentStatus数组是和未定义的索引,因为有   没有赋值给它。

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

如果你想测试是否已经选中了复选框,那么这样的事情应该可以完成:

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

变量$paymentStatus将包含truefalse值,具体取决于在发送表单时是否选中了复选框。这是因为如果选中WAS,则name的{​​{1}}将与请求一起发送,值为input。如果未选中,则根本不会发送它,也不会显示在on中。

一个展示上述内容的快速示例:

$_POST

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

  1. 与复选框关联的GET或POST参数的值始终发送到服务器,如果选中则为“on”,如果未选中,则根本不发送。未发送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 ... } } 属性,因此您的服务器永远不会获取您要更新的行的ID。

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