2013-01-09 3 views
2

제품에 일괄 할인 가격을 업데이트/추가하는 데 사용되는 PHP 함수가 있습니다.foreach 내의 else 문에서 오류가 발생하는 경우

이 코드는 내가 선택 문에서 p.sku을 추가 SKU
에 추가 $의 NEW_PRICE 조건 & SUBSTR 검사를 추가 까지 완벽했다. 이제 빈 화면이 나타나고 쿼리를 실행하려고하면 쿼리가 실행되지 않습니다.

if ($user_group == 15 && $percent == 0) { 
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'"); 

    $query = $this->db->query("SELECT p.product_id, p.sku, p.cost, p.price FROM product p"); 

    foreach ($query->rows as $result) { 

     if ((substr($result['sku'],0,3) == 'ACA')) { 
     $new_price = ($result['cost'] * 32.5/100 + $result['cost']); 
     } else { 
     $new_price = ($result['cost'] * 40/100 + $result['cost']); 
     } 

     $this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET 
     `product_id` = '" . $result['product_id'] . "', 
     `customer_group_id` = '15', 
     `quantity` = '".$quantity."', 
     `priority` = '".$priority."', 
     `price` = '".$new_price."', 
     `date_start` = '".$start_date."', 
     `date_end` = '".$expire_date."'"); 
    } 

} 

무엇이 여기에 있습니까? 나는 포럼 & google etc를 찾고 있었고, 오후 내내 여러 가지 일을 시도해 보았다. 누구든지 도와주세요!
: 다음은

"치명적인 오류 : 소진 134,217,728 바이트의 허용 메모리 크기 (32 바이트를 할당하려고)"

의 index.php에 오류보고를 추가 한 후 드디어 단서를 얻었다 의견에 따라 약간의 변경 기능에 대한 전체 코드, 나는 모든 메모리 희망 누군가가 도움을 줄 수까지 사용할 이유를 전혀 몰라 : 내가 찾는에서 상상할 수

<?php 
    class ModelBulkDiscount extends Model { 

    public function updateDiscount($user_group = null, $percent = 0, $quantity = 1, $priority = 0, $start_date = null, $expire_date = null) { 

if($user_group != 15 && $percent > 0) { 
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'"); 

    $query = $this->db->query("SELECT p.product_id, p.price FROM " . DB_PREFIX . "product p"); 

    foreach ($query->rows as $result) { 

     $new_price = $result['price'] - (($result['price']/100) * $percent); 

     $this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET 
     `product_id` = '" . $result['product_id'] . "', 
     `customer_group_id` = '" . $user_group . "', 
     `quantity` = '".$quantity."', 
     `priority` = '".$priority."', 
     `price` = '".$new_price."', 
     `date_start` = '".$start_date."', 
     `date_end` = '".$expire_date."'"); 

    } 

} else if ($user_group == 15 && $percent == 0) { 
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'"); 

    $query = $this->db->query("SELECT p.product_id, p.sku, p.cost, p.price FROM " . DB_PREFIX . "product p"); 

    foreach ($query->rows as $result) { 

    if ((substr($result['sku'],0,3) == 'ACA')) { 
     $new_price = ($result['cost'] * 1.325); 
    } else { 
     $new_price = ($result['cost'] * 1.4); 
    } 

     $this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET 
     `product_id` = '" . $result['product_id'] . "', 
     `customer_group_id` = '15', 
     `quantity` = '".$quantity."', 
     `priority` = '".$priority."', 
     `price` = '".$new_price."', 
     `date_start` = '".$start_date."', 
     `date_end` = '".$expire_date."'"); 
    } 

} else if ($user_group == 15 && $percent > 0) { 
$this->db->query("DELETE FROM " . DB_PREFIX . "product_discount WHERE customer_group_id = '".$user_group."' AND quantity = '".$quantity."'"); 

    $query = $this->db->query("SELECT p.product_id, p.cost, p.price FROM " . DB_PREFIX . "product p"); 

    foreach ($query->rows as $result) { 
     $temp_price = ($result['cost'] * 1.325); 
     $new_price = $temp_price - (($temp_price/100) * $percent); 

     $this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET 
     `product_id` = '" . $result['product_id'] . "', 
     `customer_group_id` = '15', 
     `quantity` = '".$quantity."', 
     `priority` = '".$priority."', 
     `price` = '".$new_price."', 
     `date_start` = '".$start_date."', 
     `date_end` = '".$expire_date."'"); 
    } 
} 
} 
} 
?> 
+7

오류보고 기능을 켭니다. –

+1

빈 화면 = 문제가 발생하여 오류보고/표시가 꺼져 있습니다. 켜고 서버 로그를 확인하십시오. 수학을 간단하게'$ new_price = $ result [ 'cost'] * 1.4' 또는'* 1.325'로 단순화 할 수 있습니다. –

+0

$ user_group이 15이고 $ percent가 0이라고 확신합니까?if 조건이 true인지 확인하기 위해 echo hello를 넣을 수 있습니까? – donlaur

답변

0

유일한 것은 g는 초기 SQL 쿼리가 PHP의 메모리 제한을 초과하는 데이터 집합을 반환한다는 것일 수 있습니다. 어쩌면 LIMIT 100 또는 이와 유사한 쿼리를 추가하여 문제가 지속되는지 확인할 수 있습니다. DB 서버에서 테이블의 크기를 바이트 단위로 가져 오는 방법을 찾아서 128MB를 초과하는지 확인할 수도 있습니다.

다른주의 사항 : 전체 데이터를 SQL 서버에서 PHP 인터프리터 프로세스로 전송 한 다음 다시 전송해야하기 때문에 PHP에서 많은 레코드를 처리하는 것이 성능상 최선의 방법은 아닙니다. 게시 한 코드는 특수 쿼리 (대개 저장 프로 시저 사용)를 사용하여 데이터베이스에서 직접 구현하는 것과 비슷합니다.

기본적으로 다른 테이블의 데이터를 기반으로 많은 수의 레코드를 삽입하려고합니다. 따라서 해당 테이블에서 select를 수행하고 삽입에 대한 하위 표현식으로 사용하려고합니다. 살펴 유무 : 나 자신은 SQL 전문가 고려하지 https://dev.mysql.com/doc/refman/5.1/en/insert-select.html

을하지만, 단지 필드의 부분 집합에 대해, 당신이 작동하는 방법을 알 수 있도록 :

INSERT INTO product_discount (product_id, customer_product_id, new_price) SELECT 
sub.product_id, 15, sub.new_price FROM (
    SELECT p.product_id, p.price*1.35 AS new_price FROM products 
) AS sub; 

참고 : 다른 하위 SELECT가 필요했기 때문에 new_price 계산의 일부를 생략했습니다. 가독성을 유지하려고했습니다. 그러나 순수 SQL을 사용하는 것도 가능합니다. 명령형 프로그래밍만큼 직관적이지는 않지만 SQL은 많은 기능을 제공하며 조건식과 같은 것도 가능합니다.

DB에서 원하는 작업을 수행하는 쿼리를 공식화 할 수 있어야합니다. 그렇게하면 DB와 PHP간에 데이터를 전송할 필요가 없으며 훨씬 빠르며 메모리가 부족하지 않게됩니다.

관련 문제