在MySQL中我有几个用户,当我想删除用户时,我使用以下代码:
<td><b><a href='.?control=directeur&action=verwijderGebruiker&id=".$leerling->getId()."'><img src='img/delete.png' /></a></b></td>
在我的控制器中:
private function verwijderAction()
{
$this->model->verwijderGebruiker();
$this->forward('default','directeur');
}
在我的模特中:
public function verwijderGebruiker()
{
$id = filter_var($_REQUEST['id'], FILTER_VALIDATE_INT);
if($id!=false)
{
$sql = 'DELETE FROM `contacten` WHERE `id`=:id';
$stmnt = $this->db->prepare($sql); // bereid de query voor
$stmnt->bindParam(':id',$id); // bindParam = verbindt de parameter: ":<parameter>" met de "<variable>".
$stmnt->execute(); // voert de query uit
}
}
当我想要删除ID时,它在网址(action=verwijderGebruiker&id=5)
中说了正确的内容,但它没有删除它,而是返回到主页。
答案 0 :(得分:0)
你的id
永远不会进入你的方法。你必须将它作为参数交给你的函数:
public function verwijderGebruiker($id)
{
$id = filter_var($id, FILTER_VALIDATE_INT);
// ....
}
//call it outside your class with your request-variable:
$my_class = new MyClass();
$my_class->verwijderGebruiker($_REQUEST['id']);
答案 1 :(得分:0)
虽然您应该在测试之前检查$ id中的值,如果它!= false,则存在更多基本问题:根据您从URL获取的参数更改数据库值可能允许某人继续在URL上尝试不同的值,从而更改数据库值。
您可能会默默地删除记录,或者您可能无所事事,具体取决于通过$ leerling-&gt; getId()
插入到您网址中的值我认为$ id可能没有任何价值。该测试可能默默无法说出任何内容,因为它的评估结果为false,并且无法进行数据库更新。
更重要的是:$ id必须在POST中发送,而不是GET请求。
请参阅:http://www.wikiwand.com/en/Hypertext_Transfer_Protocol#/Request_methods
使用GET应该只检索数据,不应该有任何其他影响。
否则可以发送URL,其中包含许多顺序ID,并且数据库中的记录已更改,噩梦安全性失败!
此外,您的测试不仅需要确保$ id有一个值,而且它是一个可以删除的DB记录并返回结果,捕获任何错误。