我正在尝试从我的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
将包含 true
或 false
值,具体取决于发送表单时是否选中了复选框。 这是因为如果选中它,则input
的name
将与值为 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 ...
}
}
我在您的解决方案中看到最后一个问题,那就是您依赖于两件事,这些事情对您的复选框没有帮助:
与复选框关联的 GET 或 POST 参数的值始终以"on"的值发送到服务器(如果选中),或者如果未选中,则根本不发送。 不会发送
value
属性,因此服务器将永远不会获取要更新的行的 ID。由于不会向服务器发送任何内容来指示未选中复选框,因此在保存所有表单输入时,您将无法将该输入用作循环键。 不幸的是,您将需要重新考虑您的设计。
- http://us1.php.net/manual/en/function.isset.php
- http://www.w3schools.com/html/tryit.asp?filename=tryhtml_form_checkbox HTML 元素数组,名称="某物
- []"还是名称="某物"?