我正在尝试从我的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>
答案 0 :(得分:0)
1)当我提交更新以将复选框保存到其列中时 在SQL数据库中,除非我刷新,否则它不会显示正在检查的框 然后它进入的页面并获取更新的(新存储的)值 检查。
这是因为在每次加载页面时,您首先执行SELECT
,然后执行UPDATE
。切换此顺序。 UPDATE
您的数据库包含任何新的用户输入(如果有),然后SELECT
向用户显示这些可能更新的更改。
2)当我试图取消选中该框并尝试保存时,我收到错误消息 这说我的paymentStatus数组是和未定义的索引,因为有 没有赋值给它。
这是可以预料的。如果您在Firebug之类的内容中查看HTTP请求,您会看到未经检查的复选框不随请求一起发送。这意味着$_POST['paymentStatus']
不会被设置。在尝试将该复选框的值保存到数据库时,您需要在代码中考虑到这一点。
如果你想测试是否已经选中了复选框,那么这样的事情应该可以完成:
$paymentStatus = isset($_POST['paymentStatus']);
变量$paymentStatus
将包含true
或false
值,具体取决于在发送表单时是否选中了复选框。这是因为如果选中WAS,则name
的{{1}}将与请求一起发送,值为input
。如果未选中,则根本不会发送它,也不会显示在on
中。
一个展示上述内容的快速示例:
$_POST
我在您的解决方案中看到了最后一个问题,那就是您依赖于两个对您的复选框无法帮助的事情:
与复选框关联的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。
由于没有向服务器发送任何内容以指示未选中复选框,因此在保存所有表单输入时,您将无法使用该输入作为循环键。不幸的是,你需要重新考虑你的设计。