2016-12-16 2 views
-1

Пользователь должен уметь удалять определенную строку, но программы продолжают удалять первую строку. Я нашел ответ here Пробовал, что он не работает. Интересно, что я делаю неправильно.Mysql продолжает удалять неправильную строку таблицы

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.'; 
+0

проверить значение вы получаете в '$ cart_item_id'. предположим, что кто-то отправляет 'cart_item_id' как' 1; DROP TABLE cart; 'Немного о [SQL Injection] (http://php.net/manual/en/security.database.sql-injection.php) – bansi

+0

@bansi he 'просто нужно отправить значение 'id', и вся таблица будет очищена, поэтому' id = id' всегда истинно. –

ответ

0

Удалить запрос не будут удалены все строки, если нет WHERE положение есть, в противном случае это удалить строки, соответствующие ГДЕ caluse.

Если он не работает, как ожидалось, чем поставить проверку на переменную, которая содержит идентификатор типа:

echo $cart_item_id; 
exit; 

и посмотреть, что она содержит.

1

Правильно ли это проект?
В вашем предыдущем вопросе также я прокомментировал, правильно ли вы имеете свой дизайн. Использование идентификатора продукта как идентификатора элемента корзины, поскольку вы делаете ehre, не имеет смысла.

<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 будет на самом деле означает удаление всех элементов в корзине от всех пользователей, где продукт составляет $ продукт [ «ID»]

Это подводит меня ко второму пункту. Почему у вас есть имя продукта и идентификатор продукта в форме? Требуется только идентификатор продукта. Переход на удаление.

Заключение У вас неправильный дизайн таблицы или неправильный дизайн запроса.

Что такое первый ряд?

Программы продолжают удалять первый ряд.

В вашем запросе нет ни одного заказа. Итак, здесь нет такой вещи, как первая строка. На самом деле это то, что я описал в первом абзаце.

SQL-инъекция
Теперь для серьезной проблемы безопасности.

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

Это ужасный способ сделать запрос. В какой-то день вы обнаружите, что не только одна строка, но и вся база данных удалена. Прочитайте подготовленные заявления PDO.

+0

PHP и все другие языки жесткие; много головных болей, но они медленно растут на мне – Chad

+0

Новое на PHP? Надеюсь, что вы используете PDO, а не mysqli. PDO более универсален и может использоваться также с базами данных, отличными от mysql. Сохраняет вам возможность изучить интерфейс postgresql/php, интерфейс mssql/php и т. Д. – e4c5

+0

Да, я новичок. Но дизайн базы данных верен, на мой взгляд, то, что вы не видите здесь, - это то, что на странице есть соединение с продуктом и таблицами корзин, что позволяет мне отображать информацию о продукте, которая находится в корзине. Поэтому, когда я использую $ product ['id], это фактически cart_item_id (cartRowId per se), но если я использую $ product [' product_id '], это дает мне идентификатор продукта. Вот почему я смущен тем, почему неправильный продукт удаляется. – Chad

-1

Решил пойти с более легким способом с помощью 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"); 
+0

, хотя это ваш собственный ответ, это неправильно, потому что вы все еще полностью открываете для инъекций sql. – e4c5

+0

@ e4c5: Бро, очевидно, это безопасно. Я читал об этом прямо здесь, на SO. – Chad

+0

У вас это неправильно. Не все ответы stackoverflow одинаковы. Как, например, вы сами отвечаете неправильно, также здесь будут другие ответы, которые ошибочны. Просто найдите, как я могу предотвратить SQL-инъекцию в PHP. – e4c5

Смежные вопросы