【发布时间】:2014-05-16 23:21:17
【问题描述】:
我正在尝试从我的 SQL 数据库中显示已注册人员的列表。
我有一个表格,每列都输出到其中,但我遇到问题的地方是复选框,该复选框将被更新以显示此人是否已付款。我将检查框而不是客户。
到目前为止,我遇到了 2 个问题:
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>
【问题讨论】:
-
通过使用外部变量构建 SQL 语句,您将面临 SQL 注入攻击。 此外,任何带有单引号的输入数据,例如“O 'Malley",会炸毁你的 SQL 查询。请了解如何使用参数化查询(最好使用 PDO 模块)来保护您的 Web 应用程序。 This question 有很多详细的例子。您还可以查看bobby-tables.com/php 了解替代方案和危险说明。
-
这看起来确实像 PDO 模块。该代码只是缺少将
$value变量绑定到参数的bindParam语句。 php.net/manual/en/pdostatement.bindparam.php -
我最初的实现包括 bindParam 语句,但是,为了测试这是否有效,我已经包含了基本变量。目前这一切都在本地开发,所以注入不是问题,因为我仍处于早期阶段并试图让基本功能正常工作。但是,我希望回答原始问题,而不是寻求帮助来确保这一点。