PHP中的PDO不起作用


PDO in PHP not working

每次单击按钮时,更新都不会按预期工作。但是,如果我更改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>&nbsp;</td>
                        <td><input type="submit" name="btnEdit" value="SAVE CHANGES"  /></td>
                    </tr>
                </table>
            </form>

没有将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令牌的文章。否则,总有一天你会被黑客入侵。一个开始的地方是session_id的PHP文档,以及阅读其他博客和答案。