@danyarob

Как лучше реализовать вывод в корзину?

У меня есть сессия, где хранятся товары, добавленные в корзину: $_SESSION['cart'][-id предмета-]
После я по этому id вывожу данные о товаре в корзину следующим методом:
for($i = 0; i < count($_SESSION['cart'])-1; $i++)
{
  $id = $_SESSION['cart'][$i];
  $result =  $conn->query("SELECT * FROM `items` WHERE `type`= '$id' ");
  while($row = mysqli_fetch_assoc($result))
  {
    
  }
}

Не подскажете, может ли от этого упасть база, если будет много человек отправлять запросы,грубо говоря, каждую минуту. Или можно как-то вообще по-другому это реализовать?
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
@alexalexes
1. Ограничьте количество предметов в корзине каким-то макс. значением, оно должно быть явно задано, но не вызывало дискомфорта у пользователей (оно должно иметь такое значение, чтобы в нормальных человеческих условиях оно едва достижимо).
$max_cart_item_count = 500;
$curr_cart_item_count = min(count($_SESSION['cart']), $max_cart_item_count);
for($i = 0; $i < $curr_cart_item_count; $i++)
....

2. Есть опасность применения SQL инъекций.
В этом месте, где подставляется переменная в текст запроса, если умело закомментировать кавычку, то можно получить полный доступ к базе.
WHERE `type`= '$id'
Избегайте подставлять любые переменные с пользовательскими данными в текст запроса ("с пользовательскими данными" и "в текст запроса" - нужно подчеркнуть и осмыслить как отдельные понятия с точки зрения безопасности). Для этого существует специальные методики подготовки запроса:
$stmt = $conn->stmt_init();
$stmt->prepare("SELECT * FROM `items` WHERE `type` = ?"); // подставляем текст запроса, причем на месте входных параметров ставим специальные маркеры - плейсхолдеры.
$stmt->bind_param("i",  $id); // подставляем на место плейсхолдера значение параметра как целочисленный тип
$stmt->execute(); // вот теперь можно выполнить запрос
$result = $stmt->get_result();
while($row = $result->fetch_assoc())
{
 // Обработка результатов
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы