每次单击该按钮时,更新都无法按预期工作。但是,如果我更改where id = 1
它可以正常工作。
<?php
$x=$_GET['id'];
require 'db.php';
echo 'sqsas'.$x;
$stmt=$conn->prepare("select * from tbluser where id=:id");
$stmt->bindValue('id',$x);
$stmt->execute();
if(isset($_POST['btnEdit']))
{
$stmt=$conn->prepare('update tbluser set username = :un, password = :pw,email = :em where id=:id');
$stmt->bindValue(':id',$x);
$stmt->bindValue(':un',$_POST['txtUsername']);
$stmt->bindValue(':pw',$_POST['txtPassword']);
$stmt->bindValue(':em',$_POST['txtEmail']);
$stmt->execute();
//header("location:view.php");
}
?>
这是HTML表单:
<?php while($row = $stmt->fetch(PDO::FETCH_OBJ)) {?>
<form method="post" action="edit.php">
<table>
<tr>
<td>id:</td>
<td><?php echo $row->id; ?></td>
</tr>
<tr>
<td>Email:</td>
<td><input type="text" name="txtEmail" value="<?php echo $row->email; ?>" /></td>
</tr>
<tr>
<td>Username:</td>
<td><input type="text" name="txtUsername" value="<?php echo $row->username; ?>" /></td>
</tr>
<?php } ?>
<tr>
<td>Password:</td>
<td><input type="text" name="txtPassword" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="btnEdit" value="SAVE CHANGES" /></td>
</tr>
</table>
</form>
答案 0 :(得分:0)
ID没有传递给PHP的原因是因为它永远不会被声明为表单元素。在HTML中,您只需在屏幕上回显即可。我认为这是因为您不希望用户编辑ID,只需要编辑名称,密码和电子邮件。但是,如果您希望在提交表单时将其传递给PHP脚本,则必须将其声明为表单元素,例如<input>
。您可以隐藏它以防止用户编辑它,例如下面的内容:
<input type="hidden" name="id" value="<?php echo $row->id; ?>">
你可以把它放在任何地方,因为它会被隐藏,但逻辑上放置它的好地方就是你用来显示ID的<tr></tr>
块。
注意:正如Charlotte Dunois在评论中指出的那样,这并不能阻止恶意用户使用浏览器开发者工具将id更改为其他值。你能猜出在这种情况下会发生什么吗?他们将更改其他用户的密码,这可能不是您想要的。避免这个巨大的安全漏洞超出了这个答案的范围。但是,可以使用的一种技术是使用包含会话ID令牌的cookie。
在服务器端,您可以拥有数据库(或临时文件存储)中的活动会话列表。该会话数据库的主键应该是一个安全生成的session_id(PHP具有执行此操作的功能)。该数据库还包含有关当前登录用户的信息,包括其ID。 然后使用session_id设置cookie参数。用户将无法对其进行修改(尽管这可能仍然容易受到嗅探和会话劫持等攻击 - 以防止查找有关MAC令牌的信息)。
通过这样的设置,您可以简单地删除用户ID作为表单请求的一部分,并根据POST请求传递的cookie信息进行查找。如果您想使您的应用程序安全,我建议您阅读有关会话cookie和MAC令牌的一些内容。如果没有,你有一天会被黑客入侵。一个起点是PHP docs for session_id,还可以阅读其他blogs和answers。