【问题标题】:Mysql keep deleting wrong table rowMysql不断删除错误的表行
【发布时间】:2016-12-16 04:51:41
【问题描述】:

用户应该能够删除特定行,但程序会继续删除第一行。我找到了答案here 试过了,没用。我想知道我做错了什么。

cart.php

 <form id='updateCartForm' action="update_cart.php" method="get">
             <input name="cart_item_name" type = "hidden"  id ="cart_item_name" value='<?=$product['prod_name'];?>'>
 <input name="cart_item_id" type = "hidden"  id ="cart_item_id" value='<?=$product['id'];?>'>
 </form>

update_cart.php

<?php
require_once "core/db.php"

//get data from form
$cart_item_name = $_GET['cart_item_name'];
$cart_item_id = $_GET['cart_item_id'];

//execute query
$sql = "DELETE FROM cart WHERE id =" .$cart_item_id;  
$db->query($sql);

//flash success message
$domain =($_SERVER['HTTP_HOST'] != 'localhost')?'.'.$_SERVER['HTTP_HOST']:false;
$_SESSION['success_flash'] = $cart_item_name. ' was deleted from your cart.'; 

【问题讨论】:

  • 检查您在$cart_item_id 中获得的值。假设有人将cart_item_id 发送为1;DROP TABLE cart; 阅读一下SQL Injection
  • @bansi 他只需要发送值id 并且整个表将被清除,因为id = id 始终为真。

标签: php mysql


【解决方案1】:

设计对吗?
在您之前的问题中,我也评论了您的设计是否正确。在使用 ehre 时使用产品 ID 作为购物车项目 ID 是没有意义的。

<form id='updateCartForm' action="update_cart.php" method="get">
             <input name="cart_item_name" type = "hidden"  id ="cart_item_name" value='<?=$product['prod_name'];?>'>
 <input name="cart_item_id" type = "hidden"  id ="cart_item_id" value='<?=$product['id'];?>'>
 </form>

使用此 cart_item_id 删除实际上意味着从产品为 $product['id'] 的所有用户中删除购物车中的所有商品

这让我想到了第二点。为什么表格中同时包含产品名称和产品 ID?只需要产品 ID。开始删除。

结论,你有错误的表设计或错误的查询设计。

第一行是什么?

程序不断删除第一行。

您的查询中没有排序依据。所以这里没有第一排这样的东西。实际发生的情况可能就是我在第一段中所描述的。

SQL 注入
现在是一个重大的安全问题。

$sql = "DELETE FROM cart WHERE id =" .$cart_item_id;  
$db->query($sql);

这是一种可怕的查询方式。有一天,您会发现不仅删除了一行,而且删除了整个数据库。阅读 PDO 准备好的语句。

【讨论】:

  • PHP 和所有其他语言都很难;很多头痛,但它们在我身上慢慢长大
  • PHP 新手?希望您使用的是 PDO 而不是 mysqli。 PDO 更通用,也可以与 mysql 以外的数据库一起使用。省去你学习postgresql/php接口、mssql/php接口等的麻烦。
  • 是的,我是新来的。但是,我认为数据库的设计是正确的,您在这里看不到的是页面上有一个查询,将产品和购物车表连接在一起,这使我可以显示购物车中的产品信息。所以当我使用 $product['id] 它实际上是 cart_item_id (cartRowId 本身)但是如果我使用 $product['product_id'] 这给了我产品的 id。这就是为什么我对删除错误产品的原因感到困惑。
  • 那么你需要做的第一件事就是阅读这个stackoverflow.com/help/how-to-ask,更重要的是这个:stackoverflow.com/help/mcve 人们对你对你的问题提出的结论而不是对你不知道的问题做出结论看不到这里
【解决方案2】:

如果没有 WHERE 子句,删除查询将删除所有行, 否则它会删除与 WHERE 原因匹配的行。

如果它没有按预期工作,请检查包含以下 id 的变量:

echo $cart_item_id;
exit;

看看里面有什么。

【讨论】:

    【解决方案3】:

    决定采用更简单的方式使用 href。

    cart.php

    <a href="update_cart.php?productcartid=<?=$product['id'];?>">&times</a>
    

    update_cart.php

    <?php
    ob_start();
    require_once 'core/db.php';
    
    //delete from cart
    
               $productcartid =$_REQUEST['productcartid'];
    
               // sending query
               $del = "DELETE FROM cart WHERE id='$productcartid'";
               $db->query($del);
               header("Location: cart.php");
    

    【讨论】:

    • 虽然这是您自己的答案,但这是错误的,因为您仍然对 sql 注入敞开大门。
    • @e4c5:兄弟,显然这是安全的。我在 SO 上读到了它。
    • 你大错特错了。并非所有 stackoverflow 的答案都是相同的。例如,您回答本身是错误的,同样这里会有其他错误的答案。只需搜索如何在 PHP 中防止 sql 注入
    • @e4c5:我确实读过W3,一旦整个应用程序正常运行,我就会处理安全问题。现在我必须让一切都先运行。我没有那么多脚本可以看,所以一切都很好。
    • 再一次,这是错误的方法。那是重复数据,总会有一些你错过的东西。不,请在第一时间学会做正确的事情。
    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2011-10-02
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多