【问题标题】:How to delete selected user? PDO如何删除选定的用户? PDO
【发布时间】:2016-08-28 07:03:10
【问题描述】:

我正在使用 PDO,我想从我的成员列表中删除指定的用户。我制作了“删除”按钮来显示每个用户,并且我希望在单击任何随机用户时删除他。这是我试图做到这一点的第二天。

我做了这样的事情:

$id = $user->id;
$sql = "DELETE FROM `users` WHERE `id` = :id";
$query = $handler->prepare($sql);
$query->execute(array(":id" => $id));

但这不是解决方案,这将删除每个人为什么要加入该页面。我想在单击“删除”按钮时删除该按钮所在的用户。我希望你能理解我,我会向你展示我想要的图片。

【问题讨论】:

  • 你能显示所涉及的表单或javascript函数吗?还有,$user->id 是从哪里来的?
  • @RamRaider 这只是一种形式。我唯一得到的就是上面的代码。
  • @RamRaider 我是从这个link获得的
  • @Monk 作为一般经验法则,当人们要求您展示表单时,您需要发布构成表单的 HTML 标记,而不是其外观的屏幕截图。
  • @Monk:你使用了接受的答案吗?如果是这样,您就从安全方法(您的代码)转向了安全问题(公认的答案)。始终使用参数绑定!

标签: php mysql pdo delete-row


【解决方案1】:

您应该使用 $_POST 全局数组删除用户 ID($_REQUEST 可以,但可能会使您面临更多 XSS 攻击的风险 - 这是因为它也接受 GET 变量,这些变量可能来自外部您的表格)。

我会弄清楚你哪里出错了。

基于您放置的 HTML 的用户 ID 检索。

// This user id can be obtained in two ways as I suggested.
// 1.) $_REQUEST['user_id'] if you pass the data in the href link
// 2.) $_POST['user_id'] if you pass the data as hidden field in form element.
// 3.) Ensure that you get your USER ID correct  in that place by echoing the query that you have made in the SQL.
    profile.php
<a href="process.php?delete_id=<?php echo $data->id; ?>">DELETE</a>

进程.php

<?php
// Ensure DB connectivity in this page. And this code will work fine.
if(isset($_REQUEST['delete_id'])){
    $id = $_REQUEST['delete_id'];
    $sql = "DELETE FROM `users` WHERE `id` = :id";
    $query = $handler->prepare($sql);
    $query->execute(array(":id" => $id));
}
?>

【讨论】:

  • 您能否提及为什么您做出的这个答案没有用。下次改正对我有帮助。谢谢:)
  • 你有没有让你a标签像这样&lt;a href="?delete_id=&lt;?php echo $_row_fetch['id']; ?&gt;"&gt;DELETE&lt;/a&gt;如果不改变并确保你的URL像这样useradmin.localhost/public/users?delete_id=1传递
  • 你完成 HTML 更改了吗@Monk.. 速度要快一点,因为与 PHP 相比,HTML 更改很容易 :)
  • 为什么要使用 process.php 来删除用户。您可以在同一页面本身上删除选定的用户。正如我所建议的那样。你的方法过程太长...
  • 您可以像这样更改标签&lt;a href="?delete_id=&lt;?php echo $data-&gt;id; ?&gt;"&gt;DELETE&lt;/a&gt;
【解决方案2】:

您的代码的一个问题是您实际上并未将数据绑定到您的查询。如果您要使用 PDO,请使用准备好的语句。

我创建了一个基于WHERE 删除行的函数。

<?php

function pdo_delete($MyConnection, $Table, $Where, $bindArray = array(), $Limit = 1) {
    $prep = $MyConnection->prepare("DELETE FROM $Table WHERE $Where LIMIT $Limit");
    foreach ($bindArray as $key => $value) {
        $prep->bindValue(":$key", $value);
    }
    $prep->execute();
    $prep->closeCursor();
}

?>

$MyConnection 存储 pdo 连接实例

$Table 存储您要定位的表的名称

$Where 存储您要定位的列的名称

$bindArray 将数据绑定到列并选择匹配的行

$Limit 是您要允许的行数

这里是一个如何使用这个函数的例子。

  • 调用函数

    pdo_delete();
    
  • 呼叫您的 PDO 连接

    pdo_delete(null); // Replace null with your own pdo connection, in your case $handle
    
  • 定位表

    pdo_delete(null, 'users');
    
  • 你想在哪里绑定数据

    pdo_delete(null, 'users', 'id = :id');
    
  • 绑定数据

    pdo_delete(null, 'users', 'id = :id', array('id' => $user->id));
    
  • 如果需要,请添加限制...如果是这样,请添加另一个逗号并输入允许的行数。

    pdo_delete(null, 'users', 'id = :id', array('id' => $user->id), 2); // Allows 2 columns
    

您可以更改 vars/function_name/etc 的名称。

这应该可以,我将它用于我的网站。

【讨论】:

  • 您的函数极易受到 SQL 注入攻击。
  • 如何,它使用安全的 PDO 连接并准备每个语句。不明白,请解释一下。
  • 用户提交的所有信息都绑定到foreach中的prepared statement。
  • 我知道这是 SQL 注入证明,因为我在 PDO 方面有很多经验。
  • 实际上,您无法事先知道哪些信息是用户提交的,哪些不是。今天没有用户提交的信息,明天会有。但事实是,这个查询的几乎每个部分都没有绑定,因此可以在 $table、$limit、$bindArray 或 $where 变量中进行注入。您必须了解,此功能的 [极差] 安全性与您对所谓数据源的看法无关。要么你得到一个可以防止注射的功能,要么没有。尽管有数据源。
猜你喜欢
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2017-04-29
  • 2021-08-10
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多