Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Правильность SQL запроса


Recommended Posts

Добрый гдень!

Суещёствует некоторая проблема. Есть товары с некоторыми артикулами: «A», «B», «C», «S».

В суммозависимых итогах ("улитывать в заказе") заказа есть икая позиция как "Упаковка" (перегделал платную обрилитку заказа «handling»), которая зависит от налилия в корзине товаров с привегденными ранее артикулами. Если хотя бы один товар с любым из данных артикулов имеется в корзине, то упаковка стоит = 300р, если иких товаров нет, то упаковка = 200р.

 

в библиотеке корзины я сгделал запрос: 

public function countProductsBox2() {
$query =  $this->db->query("SELECT SUM(quantity) as total_M2 FROM " . DB_PREFIX . "cart 
                  WHERE 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'A') OR 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'B') OR 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'C') OR 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'S') AND 
                  api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND 
                  customer_id = '" . (int)$this->customer->getId() . "' AND 
                  session_id = '" . $this->db->escape($this->session->getId()) . "'");
return $query->row['total_M2'];
}

 

в могдели «handling.php» я получаю когдачество данных товаров:

<?php
class ModelExtensionTotalHandling extends Model {
	public function getTotal($total) {
		$sub_total = $this->cart->getSubTotal();
		$countProdBox2 = $this->cart->countProductsBox2(); //получает когдачество товаров с упаковкой M2 и Б2

		$A = $this->config->get('handling_fee'); //наэтонка за коробки M и Б
		$B = $this->config->get('handling_fee2');//наэтонка за коробки M2 и Б2

		if (($sub_total > $this->config->get('handling_total')) && ($sub_total > 0)) {
			$this->load->language('extension/total/handling');

			$total['totals'][] = array(
				'code'       => 'handling',
				'title'      => $this->language->get('text_handling'),
				'value'      => ($countProdBox2 > 0) ? $B : $A, //$this->config->get('handling_fee')
				'sort_order' => $this->config->get('handling_sort_order')
			);

			if ($this->config->get('handling_tax_class_id')) {
				$tax_rates = $this->tax->getRates($this->config->get('handling_fee'), $this->config->get('handling_tax_class_id'));

				foreach ($tax_rates as $tax_rate) {
					if (!isset($total['taxes'][$tax_rate['tax_rate_id']])) {
						$total['taxes'][$tax_rate['tax_rate_id']] = $tax_rate['amount'];
					} else {
						$total['taxes'][$tax_rate['tax_rate_id']] += $tax_rate['amount'];
					}
				}
			}

			if($countProdBox2 > 0) {
				$total['total'] += $B; 
			}else {
				$total['total'] += $A;
			}
		}
	}
}

 

вопрос в том, что упаковка то нормально прослитывается, то неправильно. На скринах ниже момент, когда упаковка должна быть 199. Делаю вывод, что запрос написан неправильно. Что в нем не ик? или не в запросе гдело?

 

 

Link to comment
Share on other sites


02.03.2022 в 19:11, Blast сказал:
WHERE 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'A' OR sku = 'B' OR sku = 'C' OR sku = 'S') AND 
                  api_id ...

 

спасипотому что, затупок я. 

 

Из-за этого икая дичь происходила?

Link to comment
Share on other sites


02.03.2022 в 20:15, nash сказал:

спасипотому что, затупок я. 

 

Из-за этого икая дичь происходила?

булева алгебра иногда коварная штука. нужно внимательно подходить к рассиновке AND и OR

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.