繁体   English   中英

如果foreach中的else语句导致错误

[英]if else statement within foreach causes error

我有一个php函数,用于为批量产品更新/添加折扣价格。

直到 我在sku上添加了额外的$ new_price条件和substr检查之后, 代码才能正常工作
我在选择语句中添加了p.sku。 现在它给了我一个空白屏幕,并且在我尝试执行查询时未运行查询。

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等,整个下午都在尝试各种方法,我已经受够了! 请帮助任何人!

将错误报告添加到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."'");
    }
}
}
}
?>

通过查看您的代码,我唯一可以想象的可能是初始SQL查询返回的数据集超出了PHP的内存限制。 也许您可以尝试向查询添加LIMIT 100或类似值,然后查看问题是否仍然存在。 您还可以寻找一种从数据库服务器获取表大小(以字节为单位)的方法,并查看表大小是否超过128MB。

另外,在性能方面,用PHP处理大量记录并不是最佳方法,因为必须将整个数据从SQL Server传输到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计算的一部分,因为它需要另一个sub-SELECT,并且我想保留可读性。 但是也可以使用纯SQL。 它不像命令式编程那样直观,但是SQL提供了很多功能,条件表达式之类的东西也是可能的。

您应该能够制定一个查询,该查询完全在数据库中执行所需的操作。 这样,就无需在DB和PHP之间传输任何数据,这很可能会更快,并且不会耗尽内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM