【问题标题】:Deleting a database record using $_POST with Codeigniter使用 $_POST 和 Codeigniter 删除数据库记录
【发布时间】:2011-01-26 04:04:24
【问题描述】:

我一直都做错了,我曾经从 URI 段中获取值,但没有意识到这不是理想的方式。所以我改变了我的方法,现在通过 $_POST 拥有一切。我不确定我是否正确执行此操作,有人可以阐明一下吗?我的视图包含从数据库中提取的表格数据列表项。每个项目都有两个链接,“查看”和“删除”。该代码似乎可以工作,但想知道是否可以更好地编码。忘记了表单名不是唯一的,所以我去删除一条记录时,总是删除最新的记录(设置了最后一个隐藏字段)。

myview.php (sn-p)

<?php foreach($records as $record): ?>
    <form method="POST" name="myform<?php echo $location->id;?>" action="/location/delete">
    <a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo $location->id;?>.submit();">Delete</a>
    <br />
    <input type="hidden" name="location_id" value="<?php echo $location->id;?>">
    </form>
<?php endforeach ?>

【问题讨论】:

  • I've been doing it all wrong, - 说谁?如果您的应用程序受到控制,则通过 URI 段删除是一个非常可行的解决方案。您的代码也使用$records as $record,但您将其称为$location - 不正确
  • 我会使用绝对 URL 使用 base_url() 方法来避免未来的问题(将项目移动到子文件夹..等)
  • 为什么不稍微 ajaxify 您的应用程序并发出异步发布请求以删除记录?这样您就不必使用多种形式了。
  • 抱歉,我在发帖前修改了代码,应该是$record-&gt;id。我计划使用 Ajax,但我不能依赖它,以防有人开始禁用 JS。我不希望用户能够通过 URL 删除记录(例如 domain.com/items/delete/2

标签: php codeigniter post uri


【解决方案1】:

通过 uri id 查看/删除完全没问题,我不敢说使用 $_POST 是错误的,但是为每个删除元素创建一个新的唯一表单非常麻烦,并且会权衡你所获得的(我猜没有暴露的 id?),我相信将 uri 用于删除功能更“正确”。

如果您只希望某些人能够删除某些记录,请在删除函数本身中以编程方式处理,不要依赖于请求仅通过$_POST 发送的事实。这不可靠,任何人都可以生成发布请求。

【讨论】:

  • 是的,我已经进行了检查,以确保他们尝试删除的记录确实属于他们。我看到了有关跨站点攻击的参考资料等等。最大的问题是有人传递了一个包含记录 ID 的 URL(如果他们碰巧知道的话),而这个人会在不知情的情况下点击它并繁荣,再见记录。
  • 所以您试图阻止的情况是,有人找出记录 ID 及其所属的用户,在另一个站点上创建链接,欺骗它所属的特定用户,点击链接... : |我认为让用户处于枪口并让他们进入并自己删除它可能会更容易。 ;)
【解决方案2】:

对于以后遇到此问题的任何人,这是我解决问题的方法。

在我的控制器中,我有一个名为delete 的方法,用于检查表单字段是否通过$_POST 提交。如果没有变量,请将它们重定向到某个地方并显示错误消息。如果该字段通过,则进行常规检查以确保可以删除该记录。

if(!isset($_POST['item_id']))
{
    $this->session->set_flashdata('message', 'item cannot be removed!'); 
    redirect("/item");
}


if($this->input->post('item_id')) {         
    ... code ....
    ... code ....
}

【讨论】:

    【解决方案3】:

    您的语法错误与此行有关:

    <?php foreach($records as $record): ?>
             <form method="POST" name="myform<?php echo $location->id;?>"      action="/location/delete">
             <a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo
     $location->id;?>.submit();">Delete</a>
             <br />
              <input type="hidden" name="location_id" value="<?php echo $location->id;?>">
             </form>
          <?php endforeach ?>
    

    您不能对表单进行循环。相反,请使用以下代码:

       <form method="POST" name="myform<?php echo $location->id;?>" action="/location/delete">
    <?php foreach($records as $record): ?>
        a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo $location->id;?>.submit();">Delete</a>
            <br />
            <input type="hidden" name="location_id" value="<?php echo $location->id;?>">
        <?php endforeach ?>
           </form>
    

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 2012-05-16
      • 2011-07-12
      • 2016-12-10
      相关资源
      最近更新 更多