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

时间:2013-01-09 16:33:55

标签: php mysql foreach

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

代码完美无缺,直到我添加了额外的$ new_price条件&对sku进行子检查
我在select语句中添加了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."'");
    }

}

我在这里缺少什么?我一直在寻找论坛&谷歌等等,整个下午尝试各种各样的东西,我受够了!请帮助任何人!

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

1 个答案:

答案 0 :(得分:0)

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

另一方面:在PHP中处理大量记录并不是性能最佳的方法,因为必须将整个数据从SQL服务器传输到PHP解释器进程然后再传回。您发布的代码看起来像是通常在数据库中直接使用特殊查询(甚至可能使用存储过程)实现的。

基本上,您尝试根据另一个表中的数据插入大量记录。因此,您希望在该表上执行select并将其用作插入的子表达式。看看: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之间传输任何数据,这很可能会更快,并且你不会耗尽内存。