2

製品の割引価格を一括で更新/追加するために使用されるphp関数があります。

select ステートメントに 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."'");
    }

}

ここで何が欠けていますか?私はフォーラムやグーグルなどを検索し、午後中ずっといろいろなことを試してきましたが、うんざりしています! 誰か助けてください!

index.php にエラー報告を追加した後、私はついに手がかりを得ました:
「致命的なエラー: 134217728 バイトの許容メモリサイズが使い果たされました (32 バイトを割り当てようとしました)」

コメントに基づいていくつかの小さな変更を加えた関数の完全なコードを次に示します。すべてのメモリが使い果たされる理由がわかりません。誰かが助けてくれることを願っています。

<?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."'");
    }
}
}
}
?>
4

1 に答える 1

0

コードを見て想像できる唯一のことは、最初の SQL クエリが PHP のメモリ制限を超えるデータセットを返すことです。LIMIT 100または同様のクエリを追加してみて、問題が解決しないかどうかを確認してください。DB サーバーからテーブルのサイズをバイト単位で取得する方法を探して、それが 128MB を超えているかどうかを確認することもできます。

別の注意点: PHP で多数のレコードを処理することは、パフォーマンスの点で最善の方法ではありません。データ全体を SQL サーバーから PHP インタープリター プロセスに転送してから戻す必要があるためです。投稿したコードは、通常、特別なクエリを使用してデータベースに直接実装するもののように見えます (ストアド プロシージャを使用する場合もあります)。

基本的に、別のテーブルのデータに基づいて多数のレコードを挿入しようとしています。したがって、そのテーブルで選択を実行し、それを挿入の部分式として使用したいとします。ご覧ください: https://dev.mysql.com/doc/refman/5.1/en/insert-select.html

私は自分自身を SQL の専門家とは考えていませんが、フィールドのサブセットについてのみ、これがどのように機能するかを説明します。

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;

注: new_price 計算の一部を省略しました。別のサブ SELECT が必要になるためです。また、読みやすさを維持したかったからです。ただし、純粋な SQL を使用することも可能です。命令型プログラミングほど直感的ではありませんが、SQL は多くの機能を提供し、条件式なども可能です。

DB で完全に目的の操作を実行するクエリを作成できるはずです。そうすれば、DB と PHP の間でデータを転送する必要がなくなり、はるかに高速になり、メモリ不足になることもありません。

于 2013-01-09T20:08:24.320 に答える